Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

在嵌入式系统中,“看门狗”(Watchdog Timer, WDT)是一种关键的硬件或软件定时器机制,用于检测和恢复系统因软件错误(如死循环、死锁、任务阻塞)或外部干扰导致的系统挂起或崩溃。其核心思想是“系统正常工作时应定期重置看门狗;若未及时重置,看门狗将强制系统复位”。

一、核心原理

  1. 独立计时器

    • 看门狗是一个独立的硬件计数器(或由软件模拟的计数器),启动后开始自动递减计数。
    • 与主系统时钟分离,即使主CPU卡死,看门狗仍能独立运行。
  2. 喂狗(Kicking the Dog)

    • 系统正常运行时,需在看门狗超时前通过特定操作(如写寄存器)重置计数器,称为“喂狗”。
    • 喂狗行为证明系统逻辑流正常运行。
  3. 超时复位

    • 若系统因故障未能及时喂狗,看门狗计数器溢出会触发复位信号(如MCU的RESET引脚),强制系统重启。

二、工作流程

1
2
3
4
5
6
7
8
9
10
11
12
启动看门狗

看门狗倒计时开始

系统主循环运行

[正常情况] [故障情况]
定期喂狗 未及时喂狗
↓ ↓
重置倒计时 看门狗超时
↓ ↓
继续运行 触发系统复位

三、类型与实现

1. 硬件看门狗

  • 独立芯片:如MAX706、TPS3823等,通过专用引脚连接MCU。
  • 集成在MCU内部:如STM32的IWDG(独立看门狗)和WWDG(窗口看门狗)。
  • 特点:可靠性高,不受软件崩溃影响。

2. 软件看门狗

  • 通过操作系统任务或中断实现(如FreeRTOS的软件定时器)。
  • 风险:若系统完全阻塞(如所有任务死锁),软件看门狗可能失效。

四、关键用法与配置

  1. 超时时间设置

    • 根据系统关键任务的最长执行时间确定,通常为任务周期的2-3倍。
    • 示例:任务周期100ms → 看门狗超时可设为200-300ms。
  2. 喂狗策略

    • 单任务系统:在主循环中喂狗。
    • 多任务系统:由独立监控任务检查各任务状态,确认正常后喂狗。
    • 中断服务程序(ISR):谨慎使用,避免中断阻塞导致喂狗失效。
  3. 窗口看门狗(高级特性)

    • 要求喂狗时间在特定“窗口”内(如STM32的WWDG)。
    • 作用:防止过早或过晚喂狗,增强对异常流程的检测。

五、典型应用场景

  1. 防止死循环

    1
    while (1) { /* 卡死在某个条件 */ }  // 看门狗超时触发复位
  2. 恢复死锁任务
    多任务中因资源竞争导致的死锁。

  3. 抗电磁干扰(EMI)
    强干扰导致程序跑飞时复位系统。

  4. 电池供电设备
    电压不稳导致MCU异常时复位。

六、开发注意事项

  1. 喂狗位置选择

    • 避免在长时间阻塞的操作(如delay(1000))后喂狗。
    • 在多任务系统中,需确保所有关键任务状态被监控。
  2. 调试陷阱

    • 调试时临时禁用看门狗,防止单步调试触发复位。
    • 发布版本必须启用!
  3. 喂狗间隔抖动
    使用确定性高的代码路径喂狗,避免执行时间波动导致误复位。

  4. 看门狗与低功耗模式

    • 休眠模式下可能需暂停看门狗(根据MCU手册配置)。
    • 唤醒后立即重启看门狗。

七、伪代码示例(基于STM32 HAL库)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 初始化硬件看门狗(超时1秒)
void Watchdog_Init(void) {
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_32; // 分频系数
hiwdg.Init.Reload = 0x0FFF; // 重载值(约1s超时)
HAL_IWDG_Init(&hiwdg);
}

// 主循环中喂狗
int main(void) {
Watchdog_Init();
while (1) {
Process_Data(); // 主任务处理
HAL_IWDG_Refresh(&hiwdg); // 喂狗
}
}

八、常见问题

  • 频繁复位 → 喂狗间隔过短或未覆盖所有代码分支。
  • 从不复位 → 喂狗过于频繁或看门狗未启用。
  • 多任务漏检 → 未监控某个关键任务的状态。

总结

看门狗是嵌入式系统的“安全网”,通过超时复位机制保障系统可靠性。设计时需:

  1. 合理设置超时时间;
  2. 确保喂狗逻辑覆盖所有正常流程;
  3. 在多任务系统中实现协同监控;
  4. 避免调试和低功耗模式下的副作用。

在关键设备(如医疗、工业控制)中,看门狗是功能安全认证(如IEC 61508) 的必备组件。实际项目中建议优先选择硬件看门狗,并严格测试喂狗逻辑的完备性。

推荐阅读
windows11 wsl 里的VSCode 出现如下报错:The window terminated unexpectedly(reason crashed, code -36861) windows11 wsl 里的VSCode 出现如下报错:The window terminated unexpectedly(reason crashed, code -36861) Linux系统监控数据 - /proc/stat Linux系统监控数据 - /proc/stat C++如何在main函数开始之前(或结束之后)执行一段逻辑? C++如何在main函数开始之前(或结束之后)执行一段逻辑?

评论