ESP32学习笔记(40)——Watchdog看门狗使用

一、简介

看门狗其实就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候,能重新回复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的复杂一点,看门狗就是能让程序出问题是能重新启动系统。

ESP-IDF 支持两种类型的看门狗:中断看门狗定时器和任务看门狗定时器(TWDT)。中断看门狗定时器和 TWDT 都可以使用项目配置菜单启用,但是 TWDT 也可以在运行时启用。中断看门狗负责检测 FreeRTOS 任务切换被长时间阻塞的情况。TWDT 负责检测任务长时间不让步 CPU 运行的情况。

1.1 中断看门狗

中断看门狗可确保 FreeRTOS 任务切换中断长时间不被阻止。这种情况很不好,因为没有其他任务能获得 CPU 运行时间,包括可能重要的任务,如 WiFi 任务和空闲任务。阻塞的任务切换中断可能发生当一个程序运行到无限循环并且中断被禁用或挂起中断。

中断监视程序的默认操作是调用 panic 处理程序。将会把寄存器转储以便于使用 OpenOCD 或 gdbstub找到,在禁用中断的情况下会阻塞哪些代码。根据 panic 处理程序的配置,它还可以盲目地重置 CPU,这在生产环境中可能是首选。

中断看门狗是围绕定时器组 1 中的硬件看门狗构建的。如果由于某种原因这个看门狗无法执行调用 panic 处理程序的 NMI 处理程序(例如,因为 IRAM 被垃圾覆盖),它将硬重置 SOC。

1.2 任务看门狗

任务看门狗定时器 (TWDT) 负责检测运行的任务在长时间没有让出 CPU 的情况。这是 CPU "饥饿"的症状,通常是由一个高优先级任务不让出 CPU 资源的循环引起,从而使较低优先级任务无法获得 CPU 资源。这可能是外围设备上的代码写得不好,也可能是陷入无限循环的任务。

默认情况下,TWDT 将监视每个 CPU 的空闲任务,但任何任务都可以选择由 TWDT 监视。每个观察任务必须定期“重置” TWDT 以指示它们已被分配 CPU 时间。如果任务未在 TWDT 超时期限内重置,则将打印一条警告,其中包含有关哪些任务未能及时重置 TWDT 以及哪些任务当前正在 ESP32 CPU 上运行的信息。并且还有可能在用户代码中重新定义函数 esp_task_wdt_isr_user_handler 以接收此事件。

默认情况下,make menuconfig 中的 CONFIG_TASK_WDT 将被启用,导致 TWDT 在启动期间自动初始化。同样,CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0 和 CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1 也会默认启用,导致两个空闲任务在启动期间订阅 TWDT。

默认情况下TWDT是开启的,间隔时间默认是5s。可以通过menuconfig修改,也可以在代码中重新初始化修改间隔。

ESP-IDF 编程指南——Watchdogs

二、API说明

以下 TWDT 接口位于 esp_system/include/esp_task_wdt.h

2.1 esp_task_wdt_init

2.2 esp_task_wdt_add

2.3 esp_task_wdt_reset

三、看门狗测试

使用 examples\system\task_watchdog 中的例程

#include <stdio.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_task_wdt.h"

#define TWDT_TIMEOUT_S          3
#define TASK_RESET_PERIOD_S     2

/*
 * Macro to check the outputs of TWDT functions and trigger an abort if an
 * incorrect code is returned.
 */
#define CHECK_ERROR_CODE(returned, expected) ({                        \
            if(returned != expected){                                  \
                printf("TWDT ERROR\n");                                \
                abort();                                               \
            }                                                          \
})

static TaskHandle_t task_handles[portNUM_PROCESSORS];

//Callback for user tasks created in app_main()
void reset_task(void *arg)
{
    //Subscribe this task to TWDT, then check if it is subscribed
    CHECK_ERROR_CODE(esp_task_wdt_add(NULL), ESP_OK);
    CHECK_ERROR_CODE(esp_task_wdt_status(NULL), ESP_OK);

    while(1){
        //reset the watchdog every 2 seconds
        CHECK_ERROR_CODE(esp_task_wdt_reset(), ESP_OK);  //Comment this line to trigger a TWDT timeout
        vTaskDelay(pdMS_TO_TICKS(TASK_RESET_PERIOD_S * 1000));
    }
}

void app_main(void)
{
    printf("Initialize TWDT\n");
    //Initialize or reinitialize TWDT
    CHECK_ERROR_CODE(esp_task_wdt_init(TWDT_TIMEOUT_S, false), ESP_OK);

    //Subscribe Idle Tasks to TWDT if they were not subscribed at startup
#ifndef CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0
    esp_task_wdt_add(xTaskGetIdleTaskHandleForCPU(0));
#endif
#ifndef CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1
    esp_task_wdt_add(xTaskGetIdleTaskHandleForCPU(1));
#endif

    //Create user tasks and add them to watchdog
    for(int i = 0; i < portNUM_PROCESSORS; i++){
        xTaskCreatePinnedToCore(reset_task, "reset task", 1024, NULL, 10, &task_handles[i], i);
    }

    printf("Delay for 10 seconds\n");
    vTaskDelay(pdMS_TO_TICKS(10000));   //Delay for 10 seconds

    printf("Unsubscribing and deleting tasks\n");
    //Delete and unsubscribe Users Tasks from Task Watchdog, then unsubscribe idle task
    for(int i = 0; i < portNUM_PROCESSORS; i++){
        vTaskDelete(task_handles[i]);   //Delete user task first (prevents the resetting of an unsubscribed task)
        CHECK_ERROR_CODE(esp_task_wdt_delete(task_handles[i]), ESP_OK);     //Unsubscribe task from TWDT
        CHECK_ERROR_CODE(esp_task_wdt_status(task_handles[i]), ESP_ERR_NOT_FOUND);  //Confirm task is unsubscribed

        //unsubscribe idle task
        CHECK_ERROR_CODE(esp_task_wdt_delete(xTaskGetIdleTaskHandleForCPU(i)), ESP_OK);     //Unsubscribe Idle Task from TWDT
        CHECK_ERROR_CODE(esp_task_wdt_status(xTaskGetIdleTaskHandleForCPU(i)), ESP_ERR_NOT_FOUND);      //Confirm Idle task has unsubscribed
    }


    //Deinit TWDT after all tasks have unsubscribed
    CHECK_ERROR_CODE(esp_task_wdt_deinit(), ESP_OK);
    CHECK_ERROR_CODE(esp_task_wdt_status(NULL), ESP_ERR_INVALID_STATE);     //Confirm TWDT has been deinitialized

    printf("Complete\n");
}

编译后运行:

将喂狗函数进行屏蔽后:

//CHECK_ERROR_CODE(esp_task_wdt_reset(), ESP_OK);  //Comment this line to trigger a TWDT timeout


• 由 Leung 写于 2021 年 7 月 28 日

• 参考:ESP32任务看门狗实践
    ESP32 任务看门狗(TaskWDT)组件与用户任务监控

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: s32k的Watchdog看门狗)是一种硬件功能,旨在提高系统的可靠性和稳定性。它是一种定时器,用于监视系统的运行状态,并在系统停止响应时自动重启系统或采取其他措施。 Watchdog的工作原理是在系统启动时启动一个计时器,定时器周期性地向操作系统发送信号,作为系统正常工作的标志。如果系统正常运行,操作系统会在每个周期内重置或刷新Watchdog计时器。如果系统出现故障或停止响应,操作系统将无法刷新Watchdog计时器,计时器则会超时。 一旦Watchdog计时器超时,它将触发一个复位信号,导致系统重启。这样,Watchdog起到了保护系统免受死锁(系统停止响应)和其他故障的作用。此外,Watchdog还可以设置为在系统停止响应时触发其他操作,例如发送警报信号或进行日志记录。 通过使用Watchdog,系统可以在遇到严重故障时及时进行自动重启,从而避免人为干预或系统长时间停机。这对于要求高可靠性和稳定性的系统,如自动控制系统、仪表仪器、工业控制等领域非常重要。 综上所述,s32k的Watchdog是一项重要的功能,它有效地监控系统的运行状态并在必要时采取措施以保护系统的可靠性。 ### 回答2: S32K的看门狗Watchdog)是一种用于监视系统运行状态的重要功能。它类似于现实生活中的看门狗,当系统出现异常或崩溃时,看门狗能够自动重启系统,确保系统持续可靠运行。 看门狗主要由看门狗定时器(WDT)和看门狗控制寄存器(WCR)两部分组成。看门狗定时器是一个独立的硬件计数器,它在系统启动时启动计数,并按照预设时间间隔进行递减。当计数器值归零时,看门狗控制寄存器会触发一个复位信号,使系统重启。这样就能避免系统长时间停滞或假死,提高系统的稳定性和可靠性。 在S32K中,我们可以通过设置寄存器来配置看门狗的工作模式和计数器时间。可以根据系统的需求,设置适当的计数器时间,以及是否启用看门狗复位功能。同时,看门狗还可以配合其他系统监控功能一起工作,例如外部中断或系统时钟监控器。 需要注意的是,看门狗并不是万能的解决方案。在设计中还需慎重考虑计数器时间的设置,以免触发误复位。另外,应及时处理系统异常问题,以避免看门狗频繁触发重启。 总之,S32K的看门狗是一项非常重要的系统保护功能,它能够监控系统运行状态并自动重启系统,确保系统的可靠性和稳定性。合理配置和使用看门狗可以大大提高系统的工作效率和可用性。 ### 回答3: S32K是一款由恩智浦公司开发的32位微控制器,其内置了一种看门狗定时器(Watchdog Timer)。Watchdog Timer是一种硬件设备,在嵌入式系统中用于检测和处理系统可能出现的故障或错误情况。 看门狗的主要工作原理是通过定时器来监视系统的运行状态。它需要被定期重置,否则将会触发一个系统复位信号。这样,如果系统在正常运行时出现问题,导致无法及时重置看门狗,系统将会被强制复位,以防止系统崩溃或陷入无限循环。 S32K微控制器上的看门狗具有以下特点: 1. 看门狗定时器的计数器可以由软件程序进行配置,并且可以在系统的各个阶段进行启用、禁用或重置。 2. 看门狗定时器可以设置一个预置值,定时器计数器必须在该值之前被重置,否则将会触发看门狗复位。 3. 看门狗复位信号可以用来重新启动整个系统,以确保系统从错误状态中恢复。 通过使用S32K的看门狗功能,我们可以增强系统的稳定性和可靠性。当系统出现异常时,看门狗能够及时检测问题,并采取相应措施,例如强制系统重启,确保系统能够正常工作。这种硬件级别的保护机制能够提高系统的可靠性和抗干扰能力,使S32K微控制器在各种应用场景下都能够保持正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leung_ManWah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值