Platform Arduino ESP32 老是触发看门狗

目录

一、问题

二、解决方法

方法一

方法二

三、其它原因及解决方法


一、问题

问题:我使用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看门狗程序不跑,以至于以重启。

解决方法:换成其他的定时器即可。


其它问题请看:问题专栏

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值