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关闭喂狗,看看对系统有没有影响,有什么样的影响。

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

相关推荐
程序员黑豆5 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年6 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅6 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
2603_965148116 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
ltl7 小时前
RocksDB 经典故障排查:L0、compaction 与 write stall
数据库
小席是个热心肠7 小时前
AI相关的自我学习
java·人工智能·学习
xfhuangfu8 小时前
Oracle中建立到CDB和PDB的连接
数据库·oracle·rpc
小小龙学IT8 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
NineData8 小时前
DTCC 2026 预告|NineData CEO& 创始人叶正盛:面向 AI Agent 的数据库 DevOps 与数据复制实践
数据库·人工智能·数据库开发·devops·ninedata·数据库技术·dtcc
J_bean9 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交