ESP32 喂狗

链接:(25条消息) ESP32的喂狗失败之旅_caixf_001的博客-CSDN博客_arduino esp32 喂狗

esp32 Guru Meditation 错误解决方案(转) (wjhsh.net)

严重错误 - ESP32 - — ESP-IDF 编程指南 v4.2 文档 (espressif.com)

看门狗

ESP-IDF支持2中类型的看门狗:中断看门狗定时器和任务看门狗定时器(TWDT)。中断看门狗定时器和TWDT都可以通过使用Project Configuration Menu使能,然后TWDT 也可以在运行期间使能。中断看门狗负责检测FreeRTOS任务切换长时间阻塞的实例。TWDT负责检测运行的任务实例,而不会导致长时间运行。

任务看门狗

任务看门狗负责检测长时间运行而没有屈服的任务实例。这个CPU的饥饿状态,通常是由高优先级任务循环而没有屈服于低优先级任务导致的,从而使低优先级任务没有CPU的时间。这可能使编写不佳的代码在外围设备上旋转循环的标志,或者是陷入无限循环的任务。

默认TWDT监测每个CPU的IDF Tasks,然而任何任务都可以订阅被TWDT监测。每个被订阅的任务必须周期性的“重置”TWDT以表明它们已被分配CPU时间。如果一个任务在TWDT超时期限内没有重置,将打印警告。其中包含有关哪些任务未能及时重置TWDT以及哪些任务当前正在运行的信息。

也可以在用户代码中重新定义函数esp_task_wdt_isr_user_handler,以便接收超时事件并以不同的方式处理它。

TWDT是围绕定时器0中的硬件看门狗构建的。TWDT可以通过调用esp_task_wdt_init()来初始化,这将配置硬件定时器。然后,任务可以使用esp_task_wdt_add()订阅TWDT以便被监视。每个被订阅的定时器必须定期调用esp_task_wdt_reset()来重置TWDT。任何订阅的任务未能定期调用esp_task_wdt_reset()表示一个或多个任务已耗尽CPU时间或卡在某个循环中。

可以使用esp_task_wdt_delete()从TWDT取消订阅监视的任务。已取消订阅的任务不应再调用esp_task_reset()。一旦所有任务都从TWDT取消订阅,就可以通过esp_task_wdt_deinit()来取消初始化TWDT。

TWDT的默认超时时间是使用配置项CONFIG_ESP_TASK_WDT_TIMEOUT_S设置的。最少,这个应该被设置为你期望任何单个任务独占CPU的时间(例如,如果你期望应用程序将长时间的密集计算并且不应该屈服于其他任务)。也可以通过调用esp_task_wdt_init()在运行时更改此超时。

以下配置选项在启动时控制TWDT配置。它们都是默认启用的:

CONFIG_ESP_TASK_WDT:在启动时自动地初始化TWDT。如果这个选择失能,它依然可能初始化TASK WDT在运行阶段通过调用esp_task_wdt_init()

CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0:在启动期间,CPU0 IDLE TASK被订阅到TWDT。如果这个选项失能,在任何时间调用esp_task_wdt_add()依然可以订阅空闲任务。

CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1:在启动期间,CPU1 IDLE TASK被订阅到TWDT。

 

config_bootloader_wdt_enable

使用RTC看门狗在start code

found in:bootloader config

跟踪startup code的执行时间。如果执行时间超时,RTC_WDT将重启系统。对于防止由于不稳定电源引起的start code锁存是有效的。注意:跟踪执行时间从bootloader code开始(重置时间),同时为slow_clk选择了source并且停止调用app_main。由于WDT使用了SLOW_CLK时钟资源,需要重新设置时间。在改变了WDT的slow_clk时钟频率需要重新设置新的频率。slow_clk取决于ESP32_RTC_CLK_SRC(INTERNAL_RC或者EXTERNAL_CRYSTAL)。

默认情况下是开启的。

 

config_bootloader_wdt_disable_in_user_code

在用户的代码中允许RTC看门狗失能

found in: bootloader > config_bootloader_wdt_enable

如果设置了这个选择,ESP-IDF app必须直接地重启、喂狗、或者失能rtc_wdt在app's own代码。如果这个操作没有被设置(默认),rtc_wdt将会通过ESP-IDF失能在调用app_main()函数之前。

使用rtc_wdt_feed()函数重置rtc_wdt计数。使用rtc_wdt_disable()函数失能rtc_wdt。

默认情况下是关闭的。

 

config_bootloader_wdt_time_ms

RTC看门狗的的超时时间(单位:ms)

found in :bootloader > config_bootloader_wdt_enable

 请检查该参数是否正确,是否大于执行时间。

请注意诸如重置为工厂、触发测试分区和启动时加密等选项——这些选项会增加执行时间。

注意:在执行加密操作时,RTC_WDT会重置。

范围:0~120000

默认值:9000

posted @ 2022-08-09 16:27  笙箫涩  阅读(1123)  评论(0编辑  收藏  举报