赞
踩
在嵌入式系统开发中,系统稳定性是至关重要的。为了应对系统出现异常情况或者死锁等问题,ESP32提供了看门狗(Watchdog)机制。本文将深入探讨ESP32看门狗的工作原理、用途以及如何在ESP32开发中合理使用看门狗来确保系统的稳定运行。
看门狗是一种硬件计时器,其工作原理类似于一个定时器。系统在正常运行时会周期性地喂狗(重置看门狗定时器),以表示系统正常运行。如果系统出现故障或者停止响应,看门狗定时器将超时,系统会执行预定义的故障处理程序,例如重启系统,从而使系统恢复到正常状态。
ESP32提供了丰富的功能来支持看门狗:
esp_task_wdt_init()
函数进行初始化,可以设置超时时间和是否在超时时触发系统重启。esp_task_wdt_add(taskHandle);
将看门狗监视添加到任务中esp_task_wdt_reset()
函数定期重置看门狗定时器,以防止系统超时。以下是一个简单的ESP32看门狗示例代码:
#include <Arduino.h>
#include "esp_task_wdt.h"
// 定义看门狗超时时间(单位:毫秒)
#define WDT_TIMEOUT 5000 // 5秒
// 定义任务句柄
TaskHandle_t taskHandle = NULL;
// 看门狗喂狗任务
void watchdogTask(void *pvParameters) {
while (true) {
// 喂狗
esp_task_wdt_reset();
// 任务....
Serial.println(".....");
}
}
void setup() {
Serial.begin(115200);
// 初始化看门狗定时器
esp_task_wdt_init(WDT_TIMEOUT, true);
// 创建任务
xTaskCreate(watchdogTask, "Watchdog Task", 2048, NULL, 1, &taskHandle);
//将看门狗加到任务
esp_task_wdt_add(taskHandle);
}
void loop() {
// 在主循环中可以执行其他任务
}
经过我的一些测试和查询资料发现,如果使用esp_task_wdt_init(WDT_TIMEOUT, true);
初始化了看门狗,就算不写esp_task_wdt_add(taskHandle);
也是可以的FreeRTOS 中,默认情况下,任务创建时会自动加入看门狗的监视列表中,因此手动添加任务到看门狗监视列表并不是必需的。
并且在任务中esp_task_wdt_reset();
也不是必须要写的,在FreeRTOS中,ESP32的任务默认会定期重置任务看门狗。这意味着,即使你没有在任务中显式调用 esp_task_wdt_reset()
函数,系统也会在每个任务的循环中自动重置任务看门狗
这里喂狗后阻塞两倍的超时时间,程序依然正常运行,可见,在arduino框架下底层已经帮我们重置了任务看门狗
以上两个特性是在Arduino框架下测试发现的,至于其他单片机和开发环境,可能不太相同
esp_task_wdt_init(uint32_t timeout, bool panic):
esp_task_wdt_deinit():
esp_task_wdt_add(TaskHandle_t task):
esp_task_wdt_delete(TaskHandle_t task):
esp_task_wdt_reset():
ESP32看门狗是确保嵌入式系统稳定运行的重要机制之一。通过合理配置和使用ESP32看门狗,可以及时发现系统异常并采取相应措施,提高系统的可靠性和稳定性。
在开发ESP32应用程序时,务必考虑看门狗的使用,并根据实际情况调整参数,以确保系统能够在各种异常情况下保持稳定运行。
参考文献:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。