ESP32任務看門狗實踐

默認情況下,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_CPU0CONFIG_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.

如果你希望任務看門狗觸發之後進行重啓,有以下兩種方法:

  1. 調用panic handler :在 make menuconfig --> Component config --> ESP32-specific選中 Invoke panic handler on Task Watchdog timeout

  2. main()中重新定義esp_task_wdt_isr_user_handler()函數,我在裏面僅僅加了一個打印語句就會達到看門狗觸發重啓的效果,也不知道這是不是正確姿勢。

Note:

  1. main()CHECK_ERROR_CODE(esp_task_wdt_add(NULL), ESP_OK);也可以將主函數加入監視列表。
  2. 移除順序是:
    先刪除任務
    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);

參考文獻:

  1. ESP32 學習筆記(二十三)看門狗_InfiniteYuan-CSDN博客
  2. 看門狗 — ESP-IDF Programming Guide 文檔
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章