【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)组件与用户任务监控

您可以使用多个看门狗实例来监视多个任务。每个看门狗实例都应该有自己的名称和超时时间。您可以使用一个循环来定期检查每个任务的状态,并在任务超时时重新启动它们。以下是一个示例代码片段,用于同时监视两个任务: ```python import threading import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler class WatchdogHandler(FileSystemEventHandler): def __init__(self, task_name, timeout): self.task_name = task_name self.timeout = timeout self.last_seen = time.time() def on_any_event(self, event): self.last_seen = time.time() def task1(): # Task 1 code here pass def task2(): # Task 2 code here pass if __name__ == '__main__': watchdogs = [ WatchdogHandler('Task 1', 60), WatchdogHandler('Task 2', 120) ] observers = [ Observer(), Observer() ] observers[0].schedule(watchdogs[0], path='.', recursive=True) observers[1].schedule(watchdogs[1], path='.', recursive=True) observers[0].start() observers[1].start() while True: for i, watchdog in enumerate(watchdogs): if time.time() - watchdog.last_seen > watchdog.timeout: observers[i].stop() observers[i].join() observers[i] = Observer() observers[i].schedule(watchdog, path='.', recursive=True) observers[i].start() time.sleep(1) ``` 这里我们创建了两个看门狗实例,一个用于监视任务1,另一个用于监视任务2。每个看门狗实例都有自己的超时时间。在主循环中,我们定期检查每个看门狗的最后一次看到的时间,如果超过超时时间,我们就重新启动相应的任务。请注意,这只是一个简单的示例代码片段,您可能需要根据自己的需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值