【ESP32学习笔记】#外设篇#(2)看门狗(Watchdogs)

一、简介

官方文档:Watchdogs

ESP-IDF支持两种类型的看门狗:

  • 中断看门狗定时器:检测FreeRTOS任务切换被长时间阻塞的情况
    • 中断看门狗确保FreeRTOS任务切换中断不会被长时间阻塞。
    • 中断看门狗是使用定时器组1中的硬件看门狗构建的。
    • 如果该看门狗由于某种原因无法执行调用死机处理程序的NMI处理程序,它将硬重置SOC。
    • 如果panic处理程序执行,它将把死机原因显示为 Interrupt wdt timeout on CPU0Interrupt wdt timeout on CPU1
  • 任务看门狗定时器(TWDT):检测任务在长时间内不产生结果的情况
    • CONFIG_ESP_TASK_WDT:如果禁用此选项,仍可以通过调用在运行时初始化任务WDT esp_task_wdt_init()
    • CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0:CPU0 Idle task在启动期间订阅到TWDT。如果禁用此选项,仍可以在任何时候调用esp_task_wdt_add()订阅。
    • CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1:CPU1 Idle task在启动期间订阅到TWDT。同上。

二、API

函数 描述
esp_task_wdt_init 初始化任务看门狗计时器(TWDT)
esp_task_wdt_deinit 取消初始化任务监视计时器(TWDT)
esp_task_wdt_add 将任务订阅到任务监视计时器(TWDT)
esp_task_wdt_reset 当前正在运行的任务重置任务看门狗计时器(TWDT)
esp_task_wdt_delete 从任务监视计时器(TWDT)取消订阅任务
esp_task_wdt_status 查询任务是否已订阅任务监视程序计时器(TWDT)

三、配置

make menuconfig

以下为默认配置:

Component config  --->
	Common ESP-related  --->
		[*] Interrupt watchdog
		(300)   Interrupt watchdog timeout (ms)
		[*]     Also watch CPU1 tick interrupt
		[*] Initialize Task Watchdog Timer on startup	# 启动时初始化任务监视程序计时器
		[ ]     Invoke panic handler on Task Watchdog timeout	# 在任务监视程序超时时调用紧急处理程序(任务看门狗超时之后重启)
		(5)     Task Watchdog timeout period (seconds)
		[*]     Watch CPU0 Idle Task
		[*]     Watch CPU1 Idle Task
  • Invoke panic handler on Task Watchdog timeout 任务看门狗超时之后是否重启,默认是关闭的,最好设置成打开。
  • 如果TWDT已经初始化,调用 esp_task_wdt_init 函数,可以更新TWDT的超时时间和死机配置。
  • 配置打开后默认是自动初始化TWDT,所以配置好了直接使用可以不再调用 esp_task_wdt_init 函数。

四、示例:

官方示例:system/task_watchdog
使用示例:

#include "esp_task_wdt.h"

void a_task(void *arg)
{
    
    
    esp_task_wdt_add(NULL);

    while(1){
    
    
        esp_task_wdt_reset();
        vTaskDelay(pdMS_TO_TICKS(100));
    }
    vTaskDelete(NULL);
    esp_task_wdt_delete(NULL);
}

如果没有及时喂狗(例如上述示例不调用 esp_task_wdt_reset()):

E (11313) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (11313) task_wdt:  - a_task (CPU 0)
E (11313) task_wdt: Tasks currently running:
E (11313) task_wdt: CPU 0: b_task
E (11313) task_wdt: CPU 1: IDLE1
E (11313) task_wdt: Aborting.

ESP32 任务看门狗(TaskWDT)组件与用户任务监控

猜你喜欢

转载自blog.csdn.net/p1279030826/article/details/119779432