搜索
bottom↓
回复: 16

Arduino ESP32使用硬件定时器中断引起重启

[复制链接]

出0入0汤圆

发表于 2022-6-1 10:13:10 | 显示全部楼层 |阅读模式
参考https://blog.csdn.net/weixin_42880082/article/details/120882798使用esp32内部硬件定时器,结果大约每隔4、5秒就会重启一次:


ets Jun  8 206 00:22:57

rst:0x (POWERON_RESET)bot:0x7 (SPI_FAST_FLASH_BOT)
configsip: 0, SPWP:0xee
clk_drv:0x00,_rv:0x00,d_drv:0x00,c0_drv:0x0,hd_drv:0x00,wp_dv:0x00
mode IO, clc div:1
load:0x3fff001,len:4
load:0x3fff001c,en:1128
load:0x400700,len:10124
load:0x0080400,len:5856
enry 0x40006a8
haha
1
haha
1
haha
1
haha
1
E (10102) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (10102) task_wdt:  - IDLE0 (CPU 0)
E (10102) task_wdt: Tasks currently running:
E (10102) task_wdt: CPU 0: loopTask
E (10102) task_wdt: Aborting.
abort() was called at PC 0x400d43b3 on core 0

ELF file SHA256: 0000000000000000

Backtrace: 0x4008498c:0x3ffbe2b0 0x40084be9:0x3ffbe2d0 0x400d43b3:0x3ffbe2f0 0x400825aa:0x3ffbe310 0x400d0b24:0x3ffb1f90 0x400d1f79:0x3ffb1fb0 0x40085b55:0x3ffb1fd0

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode IO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1128
load:0x40078000,len:10124
load:0x40080400,len:5856
entry 0x400806a8
haha
1
haha
1


这是为什么?
源代码如下:



#include <Arduino.h>
hw_timer_t *tim1 = NULL;
int tim1_IRQ_count = 0;

void ICACHE_RAM_ATTR tim1Interrupt() //中断服务函数
{
  Serial.println("haha");
  tim1_IRQ_count++;
  Serial.println(timerAlarmEnabled(tim1));
}

void setup()
{
  Serial.begin(115200);
  tim1 = timerBegin(0, 80, true); // 80MHZ, ESP32主频80MHz
  timerAttachInterrupt(tim1, tim1Interrupt, true);
  timerAlarmWrite(tim1, 1000000ul, true);
  timerAlarmEnable(tim1); // 使能定时器
}

void loop()
{
  if (tim1_IRQ_count > 10)
  {
    Serial.println("timer------");
    tim1_IRQ_count = 0;
  }
}

出0入42汤圆

发表于 2022-6-1 10:16:23 | 显示全部楼层
重启原因说得很明白啊,没有喂狗

出0入16汤圆

发表于 2022-6-1 10:27:51 | 显示全部楼层
Task watchdog got triggered. The following tasks did not reset the watchdog in time 没有喂狗,第二个中断里居然还串口发数据,目测还有死循环。。。

出0入442汤圆

发表于 2022-6-1 13:42:59 | 显示全部楼层
初音之恋 发表于 2022-6-1 10:27
Task watchdog got triggered. The following tasks did not reset the watchdog in time 没有喂狗,第二个 ...
(引用自3楼)

看来不是整体复位,而是只复位了PC,所以串口中断仍然能跑。整体复位的话会把中断位也给清掉,那样肯定就没数据了。

出200入2554汤圆

发表于 2022-6-1 15:21:53 来自手机 | 显示全部楼层
Arduino 结构里有个 yield( ) 函数,专治各种喂狗。

建议在 loop 末尾加上 yield 调用

出0入0汤圆

 楼主| 发表于 2022-6-1 20:40:51 | 显示全部楼层
t3486784401 发表于 2022-6-1 15:21
Arduino 结构里有个 yield( ) 函数,专治各种喂狗。

建议在 loop 末尾加上 yield 调用 ...
(引用自5楼)

加入yield( ),没有作用,我试试加了延时就可以克服:delay(2);
不知道是什么道理。

出0入161汤圆

发表于 2022-6-1 21:36:31 | 显示全部楼层
应该说,,,,是跑太快了,跑飞了。我用esp32经常遇到这样的情况,基本上不实用定时器。如果要做多任务,建议使用rtos。

出0入228汤圆

发表于 2022-6-1 22:01:09 来自手机 | 显示全部楼层
ticker 库 了解下。这货底层就跑了os.尽量别去用硬件定时器什么的

出0入0汤圆

发表于 2022-6-1 23:04:09 | 显示全部楼层
把中断里的Print删除试试,或者把loop里的print删除

出0入0汤圆

 楼主| 发表于 2022-6-2 18:59:52 | 显示全部楼层
wxws 发表于 2022-6-1 22:01
ticker 库 了解下。这货底层就跑了os.尽量别去用硬件定时器什么的
(引用自8楼)

软件定时器的时间不够准确。我需要比较准确的时基。

出0入0汤圆

 楼主| 发表于 2022-6-2 19:04:01 | 显示全部楼层
chunri 发表于 2022-6-1 23:04
把中断里的Print删除试试,或者把loop里的print删除
(引用自9楼)

把Print删除,没有效果。

出0入16汤圆

发表于 2022-6-3 15:55:45 | 显示全部楼层
lmn2005 发表于 2022-6-2 19:04
把Print删除,没有效果。
(引用自11楼)

有没有试过关狗

出0入0汤圆

 楼主| 发表于 2022-6-4 15:37:25 | 显示全部楼层
初音之恋 发表于 2022-6-3 15:55
有没有试过关狗
(引用自12楼)

试过,没有作用

出0入228汤圆

发表于 2022-6-4 17:35:03 | 显示全部楼层
搜了一下,讲得很清楚,也试过了。没问题。
https://techtutorialsx.com/2017/ ... o-timer-interrupts/

#include <Arduino.h>
volatile int interruptCounter;
int totalInterruptCounter;

hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

void IRAM_ATTR onTimer() {
  portENTER_CRITICAL_ISR(&timerMux);
  interruptCounter++;
  portEXIT_CRITICAL_ISR(&timerMux);

}

void setup() {

  Serial.begin(115200);

  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 1000000, true);
  timerAlarmEnable(timer);

}

void loop() {

  if (interruptCounter > 0) {

    portENTER_CRITICAL(&timerMux);
    interruptCounter--;
    portEXIT_CRITICAL(&timerMux);

    totalInterruptCounter++;

    Serial.print("An interrupt as occurred. Total number: ");
    Serial.println(totalInterruptCounter);

  }
}

出0入228汤圆

发表于 2022-6-4 17:40:31 | 显示全部楼层
话说还是用google去搜问题比较好。
esp32 arduino timer example
搜到的第一条就是这个了。

出0入0汤圆

 楼主| 发表于 2022-6-9 11:01:46 | 显示全部楼层
wxws 发表于 2022-6-4 17:35
搜了一下,讲得很清楚,也试过了。没问题。
https://techtutorialsx.com/2017/10/07/esp32-arduino-timer-i ...
(引用自14楼)

还是重启:
Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1128
load:0x40078000,len:10124
load:0x40080400,len:5856
entry 0x400806a8
An interrupt as occurred. Total number: 1
An interrupt as occurred. Total number: 2
An interrupt as occurred. Total number: 3
An interrupt as occurred. Total number: 4
E (10102) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (10102) task_wdt:  - IDLE0 (CPU 0)
E (10102) task_wdt: Tasks currently running:
E (10102) task_wdt: CPU 0: loopTask
E (10102) task_wdt: Aborting.
abort() was called at PC 0x400d43d7 on core 0

ELF file SHA256: 0000000000000000

Backtrace: 0x400848c0:0x3ffbe2b0 0x40084b1d:0x3ffbe2d0 0x400d43d7:0x3ffbe2f0 0x400824ea:0x3ffbe310 0x400d0b2c:0x3ffb1f90 0x400d1f85:0x3ffb1fb0 0x40085a89:0x3ffb1fd0

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee


看来应该是ESP32本身的问题了

出0入228汤圆

发表于 2022-6-11 20:37:48 来自手机 | 显示全部楼层
lmn2005 发表于 2022-6-9 11:01
还是重启:
Rebooting...
ets Jun  8 2016 00:22:57

(引用自16楼)

是你开发包 版本的问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 18:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表