当前位置:   article > 正文

9.ESP32 看门狗:保障系统稳定运行的重要机制_esp_task_wdt_init panic

esp_task_wdt_init panic

ESP32 看门狗:保障系统稳定运行的重要机制


导言:

嵌入式系统开发中,系统稳定性是至关重要的。为了应对系统出现异常情况或者死锁等问题,ESP32提供了看门狗(Watchdog)机制。本文将深入探讨ESP32看门狗的工作原理、用途以及如何在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() {
    // 在主循环中可以执行其他任务
    
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

经过我的一些测试和查询资料发现,如果使用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框架下测试发现的,至于其他单片机和开发环境,可能不太相同


API总结:

  1. esp_task_wdt_init(uint32_t timeout, bool panic):

    • 初始化看门狗定时器。
    • 参数timeout:超时时间,单位为毫秒。
    • 参数panic:如果设置为true,系统将在看门狗超时时重启,如果设置为false,则只是记录错误。
  2. esp_task_wdt_deinit():

    • 关闭并清除看门狗定时器。
  3. esp_task_wdt_add(TaskHandle_t task):

    • 将任务添加到看门狗定时器的监视列表中。如果任务在超时时间内没有被重置,看门狗将重置系统。
    • 参数task:要添加到看门狗监视列表的任务句柄。
  4. esp_task_wdt_delete(TaskHandle_t task):

    • 从看门狗定时器的监视列表中删除任务。
    • 参数task:要从看门狗监视列表中删除的任务句柄。
  5. esp_task_wdt_reset():

    • 重置看门狗定时器。在任务中定期调用此函数,以防止看门狗超时重置系统。

结论

ESP32看门狗是确保嵌入式系统稳定运行的重要机制之一。通过合理配置和使用ESP32看门狗,可以及时发现系统异常并采取相应措施,提高系统的可靠性和稳定性。

在开发ESP32应用程序时,务必考虑看门狗的使用,并根据实际情况调整参数,以确保系统能够在各种异常情况下保持稳定运行。

参考文献:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/196136
推荐阅读
相关标签
  

闽ICP备14008679号