Watchdog )分为两种:IWDT)如果长时间禁止中断或者在中断里面运行占用时间比较长的程序,就会触发中断(IWDT)。
因为系统要防止一些任务占用太长时间,否则会导致系统问题,比如 Wi-Fi 任务,Idle 任务等,没有分配到 CPU 来运行。
TWDT)任务看门狗定时器用于监控任务的运行状态,确保任务可以在 TWDT 的时间范围内运行。TWDT 会优先查看每个 CPU 的空闲任务,并且任何任务都可以订阅被 TWDT 查看。通过监控 CPU 的空闲任务,TWDT 可以侦测到长时间没有活动的任务,例如任务陷入了死循环。
TWDT 基于 定时器1(Timer Group 0)来工作,当超时发生时,中断被触发。
esp_task_wdt_add()#include "esp_task_wdt.h"
esperr_t esp_task_wdt_add( TaskHandle_t task_handle );
函数说明:
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);
}
}