ESP32-任务看门狗笔记
2025-09-10 来源:cnblogs
看门狗机制用于监控嵌入式系统运行并在发生不可知的软硬件故障时将系统复位。系统正常运行时,看门狗定时器溢出之前会被重置计数值,也就是“喂狗”。定时器溢出意味着无法“喂狗”,系统异常。
基于ESP-IDF4.1
1 #include 2 #include 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 ERRORn'); 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 TWDTn'); 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 secondsn'); 56 vTaskDelay(pdMS_TO_TICKS(10000)); //延迟10秒 57 58 printf('Unsubscribing and deleting tasksn'); 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('Completen'); 76 }
上一篇:ESP32-默认事件循环
下一篇:ESP32-性能监控笔记
- ESP32/8266固件备份方法
- upyOS:基于 MicroPython 的模块化操作系统,兼容 ESP32、RP2040 等微控制器
- ESP32与STM32哪个更适合初学者?问题解析与对比
- STM32与ESP32核心应用场景解析及PCB设计实践(深度探讨)
- ESP32与STM32:比较并非明智之举
- ESP32与STM32:性能对比分析及选型指南
- STM32与ESP32:核心差异详解
- 串口、并口、USB、UART及RS232/RS485接口与ESP32、STM32的应用解析
- ESP32音频输入-MAX4466,MAX9814,SPH0645LM4H,INMP441
- ESP32 ADF windows开发环境搭建 适配ADF到ESP32A1S
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- 意法半导体中国本地造STM32微控制器启动规模量产
- 蓝牙信道探测技术原理与开发套件实践




