目录
一、问题
问题:我使用esp32的多任务在CPU0和CPU1上开了两个不同的进程,然老是造成系统重启看日志发现是CPU0造成的。日志如下
E (27297) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (27297) task_wdt: - IDLE (CPU 0)
E (27297) task_wdt: Tasks currently running:
E (27297) task_wdt: CPU 0: tem_hum
E (27297) task_wdt: CPU 1: loopTask
E (27297) task_wdt: Aborting.
abort() was called at PC 0x4200eb2c on core 0
由上日志可知触发看门狗的是CPU0任务,起初我以为是我代码写的有问题,花费了半天重新对代码进行了优化,然还是老是触发看门狗,后得知为ESP32的自身问题。
二、解决方法
方法一
E (27297) task_wdt: - IDLE (CPU 0)
是CPU0 的IDLE任务(处理空闲用的)触发看门狗了。默认会把cpu0的空闲任务加入看门狗,所以当你在cpu0上新建任务时,如果长时间没有调用vTaskDelay,就会触发IDLE的看门狗溢出。
所以简单的解决方法就是,在循环内调用vTaskDelay延时100毫秒即可。
方法二
使用一些看门狗的设置
#include "soc/rtc_wdt.h" //设置看门狗用
void setup() {
//ESP32看门狗设置 需要先引入 #include "soc/rtc_wdt.h" // 设置看门狗用
rtc_wdt_protect_off(); // 看门狗写保护关闭
//rtc_wdt_protect_on(); // 看门狗写保护打开
//rtc_wdt_disable(); // 禁用看门狗
rtc_wdt_enable(); // 启用看门狗
rtc_wdt_feed(); / /喂狗
rtc_wdt_set_time(RTC_WDT_STAGE0, 7000); // 设置看门狗超时 7000ms.
}
通过以上设置,需要关闭看门狗写保护 rtc_wdt_protect_off(); 然后用这个函数进行喂狗,
rtc_wdt_feed(); // 喂狗
以上是解决看门狗复位重启的问题,可以长时间不用再loop循环,也可以不至于触发看门狗复位重启。
也可以使用disableCore0WDT()关闭核0的看门狗。
三、其它原因及解决方法
开启一个新任务时会开启Timer1作为看门狗,如果你的程序中有一些定时或者计时的内容正好用到定时器1的话也会导致原先初始化的定时器1看门狗程序不跑,以至于以重启。
解决方法:换成其他的定时器即可。
其它问题请看:问题专栏