esp32开发与应用(看门狗测试)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

不管是mcu,还是soc,看门狗都是系统常用的一种监控手段。看门狗初始化之后,如果不能在指定的时间内重启,那么系统会默认当前cpu已经跑飞,立即重启系统。这对于一些无人值守的设备,具有很大的价值。当然很多时候,看门狗也不能滥用,对于一般bug、有规律的bug、低概率的bug,最好还是找出root cause,只有实在解决不了的问题,才动用watchdog,这样比较好。

1、esp32的看门狗

相比较其他mcu的看门狗,esp32的看门狗不仅可以监控主task,还可以监控一般的task。这也就是说,不管是哪个task,只要在规定的时间内都没有完成喂狗动作,那么都会造成系统重启。

2、利用ai编写代码

知道这个基本原理之后,就可以让ai给我们编写一段sample代码。告诉ai,用esp-idf编写一段看门狗的demo,这样不出意外的话,我们就可以看到这样的代码,

复制代码
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_task_wdt.h"

// Monitored task
void monitored_task(void *pvParameters) {
    // 1. Add the current task to TWDT watch list
    TaskHandle_t current_task = xTaskGetCurrentTaskHandle();
    esp_task_wdt_add(current_task);
    printf("Monitored task has been added to TWDT.\n");
    
    while (1) {
        // 2. Perform the core work of the task...
        printf("Monitored task is running...\n");
        
        // 3. Feed the watchdog periodically (e.g., every 2 seconds)
        esp_task_wdt_reset();
        printf("Monitored task fed the watchdog.\n");
        vTaskDelay(pdMS_TO_TICKS(2000));
    }
    
    // Delete from TWDT when the task ends (this is never reached in infinite loop)
    esp_task_wdt_delete(current_task);
    vTaskDelete(NULL);
}

void app_main(void) {
    // Initialize TWDT
    esp_task_wdt_config_t twdt_config = {
        .timeout_ms = 5000,                  // 5 seconds timeout
        .idle_core_mask = (1 << portNUM_PROCESSORS) - 1, // Monitor idle tasks on all cores
        .trigger_panic = true,               // Trigger panic (and restart) on timeout
    };
    esp_task_wdt_init(&twdt_config);
    
    // Optionally add the main task (app_main) to the watch list
    esp_task_wdt_add(NULL);  // Add the current (main) task to TWDT
    
    // Create a custom monitored task
    xTaskCreate(monitored_task, "monitored_task", 4096, NULL, 5, NULL);
    
    while (1) {
        // Main task also feeds the watchdog
        esp_task_wdt_reset();
        printf("Main task fed the watchdog.\n");
        vTaskDelay(pdMS_TO_TICKS(3000));
    }
}

3、编译、下载和修改

测试的时候分成两步。第一步,先完成编译、下载和测试。看看编译有没有问题,下载是不是ok,观察运行是不是对的。完成这一步之后,就可以做第二步。即,修改代码。比如主task关闭喂狗,或者是子task关闭喂狗,看看对系统有没有影响,有什么样的影响。

这样反复多测试几次,就会对看门狗程序有比较深刻的体会。

相关推荐
杨杨杨大侠4 小时前
都能接模型、RAG 和 MCP,Java Agent 框架到底差在哪?
java
破茧蝴蝶4 小时前
Python分布式爬虫完整教程
开发语言·python
数据库小学妹4 小时前
国产数据库怎么选?兼容、迁移、核心案例与融合架构四道关
数据库·架构·国产数据库·数据库迁移·融合数据库
狗凯之家源码网4 小时前
全新 PHP 轻量客服聊天室源码深度评测
开发语言·php·聊天室系统
远离UE45 小时前
UE5 Substrate Thin Film 源码拆析
开发语言·javascript·ue5
keyipatience5 小时前
JavaScript学习(1)书写位置,变量、数据类型、运算符
开发语言·前端·javascript·css·学习
Thinker QAQ5 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
IvorySQL5 小时前
PostgreSQL 日报| PgBouncer 修复三个 CVE 漏洞(10 月 15 日)
数据库·postgresql·区块链
饺子大魔王的男人5 小时前
后台表格、查询、流程总在重复写?我用ToolJet把PostgreSQL直接做成可远程访问的业务系统
数据库·postgresql