1. 程式人生 > 實用技巧 >ESP32-任務看門狗筆記

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