默認情況下,TWDT(任務看門狗) 將監視每個 CPU 的空閒任務,但任何任務都可以選擇由 TWDT 監視。每個觀察任務必須定期“重置” TWDT 以指示它們已被分配 CPU 時間。如果任務未在 TWDT 超時期限內重置,則將打印一條警告,其中包含有關哪些任務未能及時重置 TWDT 以及哪些任務當前正在 ESP32 CPU 上運行的信息。並且還有可能在用戶代碼中重新定義函數 esp_task_wdt_isr_user_handler
以接收此事件。
TWDT 圍繞定時器組 0 中的硬件看門狗定時器構建。可以通過調用 esp_task_wdt_init()
來初始化 TWDT,這將配置硬件定時器。然後,任務可以使用 esp_task_wdt_add(
) 訂閱 TWDT 監視。每個訂閱的任務必須定期調用 esp_task_wdt_reset()
來重置 TWDT。任何訂閱任務無法定期調用 esp_task_wdt_reset()
表示一個或多個任務已經缺乏 CPU 資源或者陷入某個循環。
可以使用 esp_task_wdt_delete()
從 TWDT 取消訂閱監視的任務。已取消訂閱的任務不應再調用 esp_task_wdt_reset()
。一旦所有任務都從 TWDT 取消訂閱,可以通過調用esp_task_wdt_deinit()
來取消初始化 TWDT。
默認情況下,make menuconfig
中的 CONFIG_TASK_WDT
將被啓用,導致 TWDT 在啓動期間自動初始化。同樣,CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0
和 CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1
也會默認啓用,導致兩個空閒任務在啓動期間訂閱 TWDT。
默認情況下,任務看門狗中斷task_wdt_isr()
會打印類似如下的信息:
E (10299) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (10299) task_wdt: - reset task (CPU 0/1)
E (10299) task_wdt: Tasks currently running:
E (10299) task_wdt: CPU 0: IDLE0
E (10299) task_wdt: CPU 1: IDLE1
E (10299) task_wdt: Aborting.
如果你希望任務看門狗觸發之後進行重啓,有以下兩種方法:
-
調用
panic handler
:在make menuconfig --> Component config --> ESP32-specific
選中Invoke panic handler on Task Watchdog timeout
-
在
main()
中重新定義esp_task_wdt_isr_user_handler()
函數,我在裏面僅僅加了一個打印語句就會達到看門狗觸發重啓的效果,也不知道這是不是正確姿勢。
Note:
main()
中CHECK_ERROR_CODE(esp_task_wdt_add(NULL), ESP_OK);
也可以將主函數加入監視列表。- 移除順序是:
先刪除任務
vTaskDelete(task_handles);
然後移除任務看門狗監視
CHECK_ERROR_CODE(esp_task_wdt_delete(task_handles), ESP_OK); CHECK_ERROR_CODE(esp_task_wdt_status(task_handles), ESP_ERR_NOT_FOUND);
參考文獻: