需要知道的是:
- Arduion-ESP32 默认在 Core 0 的 IDLE 任务开启了看门狗 时间为 5000 ticks = 5秒(若IDLE(0)无法运行,所以不能喂狗,将导致系统5秒后重启)
- Core 0 和 Core 1 都运行了 FreeRTOS 的IDLE任务,优先级为 0(IDLE任务是用于清理被删除任务的内存)
- Core 1 loopBack任务就是Arduino的 setup 和 loop 优先级为 1
API:需要包含 esp_task_wdt.h 文件
函数 |
描述 |
esp_task_wdt_init |
初始化任务看门狗计时器 |
esp_task_wdt_deinit |
取消初始化任务监视计时器 |
esp_task_wdt_add |
将任务订阅到任务监视计时器 |
esp_task_wdt_reset |
当前正在运行的任务重置任务看门狗计时器 |
esp_task_wdt_delete |
从任务监视计时器取消订阅任务 |
esp_task_wdt_status |
查询任务是否已订阅任务监视程序计时器 |
官方使用例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include "esp_task_wdt.h"
void a_task(void *arg) { esp_task_wdt_add(NULL);
while(1){ esp_task_wdt_reset(); vTaskDelay(pdMS_TO_TICKS(100)); } esp_task_wdt_delete(NULL); vTaskDelete(NULL); }
void app_mian(void) { esp_task_wdt_init(TWDT_TIMEOUT_S, false); esp_task_wdt_add(xTaskGetIdleTaskHandleForCPU(0)); esp_task_wdt_delete(xTaskGetIdleTaskHandleForCPU(0)); esp_task_wdt_status(xTaskGetIdleTaskHandleForCPU(0)); esp_task_wdt_deinit(); }
|
下面给出给所有狗喂食的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
#include "soc/timer_group_struct.h" #include "soc/timer_group_reg.h" void feedTheDogInAllTasks() { TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE; TIMERG0.wdt_feed = 1; TIMERG0.wdt_wprotect = 0; TIMERG1.wdt_wprotect = TIMG_WDT_WKEY_VALUE; TIMERG1.wdt_feed = 1; TIMERG1.wdt_wprotect = 0; }
|