Task 看门狗

Task 看门狗

官方文档参考 ESP32 TWDT 相关函数 看门狗( Watchdog )分为两种: 1. 中断看门狗定时器(IWDT) 如果长时间禁止中断或者在中断里面运行占用时间比较长的程序,就会触发中断(IWDT)。 因为系统要防止一些任务占用太长时间,否则会导致系统问题,比如 Wi-Fi 任务,Idle

官方文档参考

ESP32 TWDT 相关函数


看门狗( Watchdog )分为两种:

1. 中断看门狗定时器(IWDT

如果长时间禁止中断或者在中断里面运行占用时间比较长的程序,就会触发中断(IWDT)。
因为系统要防止一些任务占用太长时间,否则会导致系统问题,比如 Wi-Fi 任务,Idle 任务等,没有分配到 CPU 来运行。

2. 任务看门狗定时器(TWDT

任务看门狗定时器用于监控任务的运行状态,确保任务可以在 TWDT 的时间范围内运行。TWDT 会优先查看每个 CPU 的空闲任务,并且任何任务都可以订阅被 TWDT 查看。通过监控 CPU 的空闲任务,TWDT 可以侦测到长时间没有活动的任务,例如任务陷入了死循环。
TWDT 基于 定时器1Timer Group 0)来工作,当超时发生时,中断被触发。

  • 在任务中,如果任务函数长时间没有”喂狗“,也会导致 TWDT 被触发,进而导致系统重启。
  • 可以讲自己的任务函数加入看门狗监控列表,这样既能保证运行优先级,又能保证任务函数运行。

esp_task_wdt_add()

#include "esp_task_wdt.h"

esperr_t esp_task_wdt_add( TaskHandle_t task_handle );

函数说明:

  • 添加任务到 ESP32 的看门狗中去。
    参数:
  • task_handle: 任务函数的句柄。

esp_task_wdt_reset()

#include "esp_task_wdt.h"

esperr_t esp_task_wdt_reset( void );

函数说明:

  • 喂狗,防止任务看门狗被触发。

示例代码:

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"

#include "esp_task_wdt.h"

void task1(void *pvPara)
{
    esp_task_wdt_add(NULL);
    while (true) {
		// 一秒钟喂一次狗
		esp_task_wdt_reset(); 
		vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void app_main(void)
{
    TaskHandle_t handle_task1;
    xTaskCreate(task1, "Task1", 2048, NULL, 1, &handle_task1);

    while (1) {
        printf("high water mark: %d\n", uxTaskGetStackHighWaterMark(handle_task1));
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}
Comment