在嵌入式系统开发中,程序可能会因为各种原因(如电磁干扰、内存溢出、死循环等)出现“跑飞”或“卡死”的情况。为了解决这个问题,工程师们引入了一种硬件或软件机制——看门狗(Watchdog Timer,简称 WDT)。本文将用通俗易懂的方式,带你从零开始理解并使用 C 语言实现一个简单的看门狗库。
看门狗就像一只忠诚的狗,它会定时检查你的程序是否还在正常运行。如果你的程序一切正常,就需要定期“喂狗”(即重置看门狗计时器);如果程序卡住了,忘记喂狗,看门狗就会认为系统出了问题,并自动触发系统复位,让设备重新启动,从而恢复功能。
下面我们以一个通用的软件看门狗为例,编写一个简单的 C 语言看门狗库。虽然它不能替代硬件看门狗,但能帮助你理解其工作原理,并可用于教学或轻量级项目。
#ifndef WATCHDOG_H#define WATCHDOG_H#include <stdint.h>// 看门狗超时时间(单位:毫秒)#define WATCHDOG_TIMEOUT_MS 5000// 初始化看门狗void watchdog_init(void);// 喂狗函数:重置计时器void watchdog_feed(void);// 检查是否超时(应在主循环中调用)void watchdog_check(void);#endif // WATCHDOG_H
#include "watchdog.h"#include <time.h>#include <stdio.h>#include <stdlib.h> // 用于 exit()static time_t last_feed_time = 0;void watchdog_init(void) { last_feed_time = time(NULL); printf("[Watchdog] Initialized. Timeout: %d ms\n", WATCHDOG_TIMEOUT_MS);}void watchdog_feed(void) { last_feed_time = time(NULL); // printf("[Watchdog] Fed!\n"); // 调试时可开启}void watchdog_check(void) { time_t now = time(NULL); double elapsed_ms = difftime(now, last_feed_time) * 1000; if (elapsed_ms > WATCHDOG_TIMEOUT_MS) { printf("[Watchdog] ERROR: System timeout! Resetting...\n"); // 在真实嵌入式系统中,这里应触发硬件复位 // 例如:NVIC_SystemReset(); 或直接重启 exit(1); // 模拟复位 }} #include "watchdog.h"#include <unistd.h> // for sleep()int main(void) { watchdog_init(); while (1) { // 模拟正常任务 printf("Working...\n"); // 必须在超时前喂狗! watchdog_feed(); // 检查看门狗状态 watchdog_check(); sleep(1); // 每秒执行一次 } return 0;} 在 STM32、ESP32、Arduino 等平台上,通常有内置的硬件看门狗。以 STM32 为例,你需要:
HAL_IWDG_Refresh() 喂狗;这种硬件实现比我们上面的软件模拟更可靠,因为即使主程序完全卡死,硬件看门狗仍能工作。因此,在实际产品中,强烈推荐使用 C语言看门狗 配合硬件 WDT。
看门狗是嵌入式系统稳定运行的重要保障。通过本教程,你已经掌握了 嵌入式系统看门狗 的基本原理,并学会了用 C 语言编写一个简单的看门狗库。虽然软件看门狗有其局限性,但它能帮助你理解核心思想。在真实项目中,请优先使用芯片提供的 看门狗定时器(WDT)硬件功能。
希望这篇 WDT编程教程 能为你打开嵌入式系统可靠性设计的大门。记住:一个健壮的系统,不仅要有功能,还要有“自愈”能力!
本文由主机测评网于2025-12-02发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025121990.html