ESP32-任務看門狗筆記


看門狗機制用於監控嵌入式系統運行並在發生不可知的軟硬件故障時將系統復位。系統正常運行時,看門狗定時器溢出之前會被重置計數值,也就是“喂狗”。定時器溢出意味着無法“喂狗”,系統異常。

基於ESP-IDF4.1

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include "freertos/FreeRTOS.h"
 4 #include "freertos/task.h"
 5 #include "esp_task_wdt.h"
 6 
 7 #define TWDT_TIMEOUT_S          3
 8 #define TASK_RESET_PERIOD_S     2
 9 
10 /*
11  * 檢查任務看門狗輸出的宏,並在返回錯誤代碼的時候觸發中止
12  */
13 #define CHECK_ERROR_CODE(returned, expected) ({                        \
14             if(returned != expected){                                  \
15                 printf("TWDT ERROR\n");                                \
16                 abort();                                               \
17             }                                                          \
18 })
19 
20 static TaskHandle_t task_handles[portNUM_PROCESSORS];
21 
22 //用戶任務的回調函數
23 void reset_task(void *arg)
24 {
25     //將任務添加到任務看門狗,並檢查是否已添加
26     CHECK_ERROR_CODE(esp_task_wdt_add(NULL), ESP_OK);
27     CHECK_ERROR_CODE(esp_task_wdt_status(NULL), ESP_OK);
28 
29     while(1){
30         //每2秒重置一次看門狗
31         CHECK_ERROR_CODE(esp_task_wdt_reset(), ESP_OK);  //注釋這一行可以觸發看門狗超時
32         vTaskDelay(pdMS_TO_TICKS(TASK_RESET_PERIOD_S * 1000));
33     }
34 }
35 
36 void app_main(void)
37 {
38     printf("Initialize TWDT\n");
39     //初始化和重新初始化任務看門狗
40     CHECK_ERROR_CODE(esp_task_wdt_init(TWDT_TIMEOUT_S, false), ESP_OK);
41 
42     //啟動時未訂閱空閑任務,則訂閱到任務看門狗
43 #ifndef CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0
44     esp_task_wdt_add(xTaskGetIdleTaskHandleForCPU(0));
45 #endif
46 #ifndef CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1
47     esp_task_wdt_add(xTaskGetIdleTaskHandleForCPU(1));
48 #endif
49 
50     //創建用戶任務並添加到任務看門狗
51     for(int i = 0; i < portNUM_PROCESSORS; i++){
52         xTaskCreatePinnedToCore(reset_task, "reset task", 1024, NULL, 10, &task_handles[i], i);
53     }
54 
55     printf("Delay for 10 seconds\n");
56     vTaskDelay(pdMS_TO_TICKS(10000));   //延遲10秒
57 
58     printf("Unsubscribing and deleting tasks\n");
59     //從任務監視程序中刪除並取消訂閱用戶任務,然后取消訂閱空閑任務
60     for(int i = 0; i < portNUM_PROCESSORS; i++){
61         vTaskDelete(task_handles[i]);   //首先刪除用戶任務(防止重置未訂閱的任務)
62         CHECK_ERROR_CODE(esp_task_wdt_delete(task_handles[i]), ESP_OK);     //從任務看門狗取消訂閱任務
63         CHECK_ERROR_CODE(esp_task_wdt_status(task_handles[i]), ESP_ERR_NOT_FOUND);  //確認任務已經取消訂閱
64 
65         //取消訂閱空閑任務
66         CHECK_ERROR_CODE(esp_task_wdt_delete(xTaskGetIdleTaskHandleForCPU(i)), ESP_OK);     //從任務看門狗取消訂閱空閑任務
67         CHECK_ERROR_CODE(esp_task_wdt_status(xTaskGetIdleTaskHandleForCPU(i)), ESP_ERR_NOT_FOUND);      //確認空閑人取消訂閱
68     }
69 
70 
71     //取消訂閱所有任務后,取消初始化任務看門狗
72     CHECK_ERROR_CODE(esp_task_wdt_deinit(), ESP_OK);
73     CHECK_ERROR_CODE(esp_task_wdt_status(NULL), ESP_ERR_INVALID_STATE);     //確認任務看門狗取消初始化
74 
75     printf("Complete\n");
76 }

 

原文:https://gitee.com/EspressifSystems/esp-idf/tree/master/examples/system/task_watchdog


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM