在嵌入式系统中,“看门狗”(Watchdog Timer, WDT)是一种关键的硬件或软件定时器机制,用于检测和恢复系统因软件错误(如死循环、死锁、任务阻塞)或外部干扰导致的系统挂起或崩溃。其核心思想是“系统正常工作时应定期重置看门狗;若未及时重置,看门狗将强制系统复位”。
一、核心原理
独立计时器
- 看门狗是一个独立的硬件计数器(或由软件模拟的计数器),启动后开始自动递减计数。
- 与主系统时钟分离,即使主CPU卡死,看门狗仍能独立运行。
喂狗(Kicking the Dog)
- 系统正常运行时,需在看门狗超时前通过特定操作(如写寄存器)重置计数器,称为“喂狗”。
- 喂狗行为证明系统逻辑流正常运行。
超时复位
- 若系统因故障未能及时喂狗,看门狗计数器溢出会触发复位信号(如MCU的RESET引脚),强制系统重启。
二、工作流程
1 | 启动看门狗 |
三、类型与实现
1. 硬件看门狗
- 独立芯片:如MAX706、TPS3823等,通过专用引脚连接MCU。
- 集成在MCU内部:如STM32的IWDG(独立看门狗)和WWDG(窗口看门狗)。
- 特点:可靠性高,不受软件崩溃影响。
2. 软件看门狗
- 通过操作系统任务或中断实现(如FreeRTOS的软件定时器)。
- 风险:若系统完全阻塞(如所有任务死锁),软件看门狗可能失效。
四、关键用法与配置
超时时间设置
- 根据系统关键任务的最长执行时间确定,通常为任务周期的2-3倍。
- 示例:任务周期100ms → 看门狗超时可设为200-300ms。
喂狗策略
- 单任务系统:在主循环中喂狗。
- 多任务系统:由独立监控任务检查各任务状态,确认正常后喂狗。
- 中断服务程序(ISR):谨慎使用,避免中断阻塞导致喂狗失效。
窗口看门狗(高级特性)
- 要求喂狗时间在特定“窗口”内(如STM32的WWDG)。
- 作用:防止过早或过晚喂狗,增强对异常流程的检测。
五、典型应用场景
防止死循环
1
while (1) { /* 卡死在某个条件 */ } // 看门狗超时触发复位
恢复死锁任务
多任务中因资源竞争导致的死锁。抗电磁干扰(EMI)
强干扰导致程序跑飞时复位系统。电池供电设备
电压不稳导致MCU异常时复位。
六、开发注意事项
喂狗位置选择
- 避免在长时间阻塞的操作(如
delay(1000)
)后喂狗。 - 在多任务系统中,需确保所有关键任务状态被监控。
- 避免在长时间阻塞的操作(如
调试陷阱
- 调试时临时禁用看门狗,防止单步调试触发复位。
- 发布版本必须启用!
喂狗间隔抖动
使用确定性高的代码路径喂狗,避免执行时间波动导致误复位。看门狗与低功耗模式
- 休眠模式下可能需暂停看门狗(根据MCU手册配置)。
- 唤醒后立即重启看门狗。
七、伪代码示例(基于STM32 HAL库)
1 | // 初始化硬件看门狗(超时1秒) |
八、常见问题
- 频繁复位 → 喂狗间隔过短或未覆盖所有代码分支。
- 从不复位 → 喂狗过于频繁或看门狗未启用。
- 多任务漏检 → 未监控某个关键任务的状态。
总结
看门狗是嵌入式系统的“安全网”,通过超时复位机制保障系统可靠性。设计时需:
- 合理设置超时时间;
- 确保喂狗逻辑覆盖所有正常流程;
- 在多任务系统中实现协同监控;
- 避免调试和低功耗模式下的副作用。
在关键设备(如医疗、工业控制)中,看门狗是功能安全认证(如IEC 61508) 的必备组件。实际项目中建议优先选择硬件看门狗,并严格测试喂狗逻辑的完备性。