当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]在嵌入式系统中,看门狗(Watchdog Timer, WDT) 是防止程序跑飞的最后一道防线。但“滥用”或“乱喂狗”反而会让看门狗失效——该复位时不复位,不该复位时却误复位。本文将梳理看门狗的正确配置方法,并剖析三种典型的触发场景,帮助你用好这把“双刃剑”。



嵌入式系统中,看门狗(Watchdog Timer, WDT) 是防止程序跑飞的最后一道防线。但“滥用”或“乱喂狗”反而会让看门狗失效——该复位时不复位,不该复位时却误复位。本文将梳理看门狗的正确配置方法,并剖析三种典型的触发场景,帮助你用好这把“双刃剑”。


一、看门狗的工作原理与配置要点


看门狗本质上是一个递减计数器,启动后不断向下计数。若在计数器溢出前未“喂狗”(重装载),就会触发系统复位(或NMI中断)。配置时需把握两个关键参数:


• 溢出时间:从启动到复位的时间,通常几毫秒到几秒。


• 喂狗窗口:部分芯片(如STM32的IWDG)支持窗口看门狗,只能在特定时间段内喂狗——过早或过晚都会触发复位,防止“卡死在喂狗循环中”。


STM32 IWDG 配置示例:

#include "stm32f4xx_hal.h"


void IWDG_Init(uint32_t prescaler, uint32_t reload)

{

   // 使能IWDG(LSI时钟)

   IWDG->KR = 0x5555;          // 解锁键值寄存器

   IWDG->PR = prescaler;       // 分频系数(4/8/16/32/64/128/256)

   IWDG->RLR = reload;         // 重装载值(12位,最大4095)

   IWDG->KR = 0xCCCC;          // 启动IWDG

}


void FeedDog(void)

{

   IWDG->KR = 0xAAAA;          // 喂狗

}



溢出时间计算:Tout = (prescaler × reload) / LSI_Freq(LSI通常约32kHz)。


二、三种典型触发场景


场景1:程序跑飞 / 死循环(最常见)


当程序因指针越界、堆栈溢出或外部干扰陷入死循环时,喂狗函数无法被执行,计数器溢出触发复位。


应对策略:

• 喂狗点应放在主循环的关键路径上,而不是每个中断里。


• 避免在中断服务函数中喂狗——否则即使主循环卡死,中断仍在运行,看门狗无法起到保护作用。


推荐喂狗位置:

void main(void)

{

   System_Init();

   while(1)

   {

       Process_Tasks();        // 任务处理

       FeedDog();              // 在主循环末尾喂狗

       Enter_LowPower();       // 低功耗模式

   }

}



场景2:任务调度死锁(RTOS环境)


在FreeRTOS等系统中,若某个高优先级任务持有信号量后挂起,低优先级任务无法运行,导致喂狗任务被饿死。


应对策略:

• 创建一个独立喂狗任务,优先级设为最低。


• 在该任务中检查系统心跳或关键任务是否正常运行,再决定是否喂狗。

void WatchdogTask(void *param)

{

   while(1)

   {

       if (IsSystemHealthy())

       {

           FeedDog();

       }

       vTaskDelay(pdMS_TO_TICKS(WDT_TIMEOUT_MS / 2));

   }

}



场景3:低功耗模式下误复位


在睡眠或停机模式下,主时钟停止,看门狗可能因LSI继续运行而溢出复位。


应对策略:

• 进入低功耗前暂停看门狗(若芯片支持)。


• 或在进入休眠前喂一次狗,并确保唤醒后第一时间重新喂狗。

void Enter_Sleep_Mode(void)

{

   FeedDog();                      // 进入前最后一次喂狗

   HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

   FeedDog();                      // 唤醒后立即喂狗

}



三、看门狗使用“三要三不要”


✅ 要做的事


1. 要在主循环关键路径喂狗:确保喂狗点覆盖所有正常执行路径。

2. 要匹配溢出时间与任务周期:溢出时间应大于最长任务执行时间的2倍,留有裕量。

3. 要使用窗口看门狗(可选):防止喂狗代码本身被绕过。


❌ 不要做的事


1. 不要在中断中喂狗:中断频繁触发会掩盖主循环卡死。

2. 不要用空循环延时代替喂狗:HAL_Delay(100) 不会重置看门狗。

3. 不要在产品中关闭看门狗:即使调试阶段,也应保留看门狗功能,仅延长溢出时间。


四、调试阶段的看门狗处理


开发初期,看门狗频繁复位会干扰调试。推荐做法:


• 在Debug配置中将溢出时间设为最大值(如10秒),Release配置恢复为实际值。


• 使用条件编译:

#ifdef DEBUG

   #define WDT_TIMEOUT_MS 10000

#else

   #define WDT_TIMEOUT_MS 2000

#endif



五、结语


看门狗的终极目标是“在系统失控时拯救它,在系统正常时不打扰它”。掌握溢出时间配置、喂狗位置选择以及低功耗场景的特殊处理,你就能让看门狗成为嵌入式系统的忠实卫士,而不是制造麻烦的捣蛋鬼。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

在嵌入式系统开发领域,指针是C语言的核心特性之一,也是实现底层硬件操作、内存管理和高效数据处理的关键工具。与通用计算机编程不同,嵌入式系统对内存资源、执行效率和硬件控制能力有着极高要求,这使得复杂指针的运用成为开发者必须...

关键字: 嵌入式系统 指针

在轨道交通、工业过程控制等SIL(安全完整性等级)要求的系统中,IEC 61508标准是软件设计的红线。仅仅“跑得快”是不够的,必须保证单点故障不导致系统失效。本文将探讨在该标准下,如何通过软件冗余与看门狗逻辑,构建符合...

关键字: 功能安全 看门狗

我构建这个项目是为了更深入地了解 USB 通信和 PCB 设计,于是自己制作了一个 USB 到 UART 的转换板。USB 到 UART 模块常用于微控制器编程、串行调试以及嵌入式系统与计算机之间的通信,所以我想从零开始...

关键字: 嵌入式系统 PCB CP2102N

在嵌入式软件架构设计领域,系统的稳定性、可维护性和可扩展性是衡量架构优劣的核心指标。随着嵌入式设备功能日益复杂,传统的状态机设计模式在应对多状态嵌套、复杂事件触发时逐渐显得力不从心。分层状态机(Hierarchical...

关键字: 嵌入式 嵌入式系统

在嵌入式系统开发领域,任务调度的效率直接决定了系统的性能与稳定性。时间片轮询法作为一种轻量级的任务调度机制,凭借其实现简单、资源消耗低的优势,广泛应用于资源有限的MCU(微控制单元)系统中。然而,传统时间片轮询法在面对多...

关键字: 嵌入式 嵌入式系统

在工业控制现场,电磁干扰、电源波动和机械振动如同"隐形杀手",随时可能让精密的控制系统陷入瘫痪。某钢铁厂的高炉控制系统曾因雷击导致PLC误动作,造成直接经济损失超百万元——这揭示了抗干扰设计在工业控制中的关键地位。本文将...

关键字: 工业控制 抗干扰设计 看门狗

在嵌入式系统开发中,NVIC(嵌套向量中断控制器)凭借其灵活的中断优先级管理机制,成为保障实时性的核心组件。然而,当高优先级任务因低优先级任务持有共享资源而被阻塞,同时被中优先级任务抢占CPU时,优先级反转的噩梦便悄然降...

关键字: 中断 NVIC 嵌入式系统

该项目为运行在 UNIHIKER M10 嵌入式系统板上的 PicoClaw 的图形化仪表盘添加了 MCP 功能。

关键字: 嵌入式系统 AIoT UNIHIKER M10

在全球电气化转型加速的今天,从新能源汽车到工业自动化,从智能电网到消费电子,电气化设计正朝着高效、智能、安全、集成的方向迭代。作为嵌入式系统的“大脑”,微控制器(MCU)凭借其高集成度、低功耗、强实时性的优势,成为串联电...

关键字: 嵌入式系统 微控制器 软硬件协同

在嵌入式系统、桌面应用和移动端开发中,C语言开发者常面临三大困境:环境差异(Windows/Linux/macOS的编译器差异)、依赖管理(第三方库路径与版本冲突)、条件逻辑(不同平台需执行不同代码块)。传统Makefi...

关键字: CMake 嵌入式系统
关闭