一、看门狗是什么?先建立准确的直觉
1.1 为什么需要看门狗
嵌入式程序运行时,可能因为各种意外情况"跑飞"或者卡死:
外部干扰导致程序计数器PC跳到了错误的地址
某个外设操作卡在了死循环里等一个永远不会来的标志位
之前"内存管理笔记"提到的栈溢出踩坏了关键数据
第三方库或者自己代码里的隐藏bug,某些边界条件下进入死循环
这些情况一旦发生,产品可能就此完全失去响应,
如果是没人值守的现场设备(工业控制器、传感器节点),
没有人能随时跑去手动按复位键,产品会一直卡死在那里。
看门狗就是解决这个问题的硬件机制:
一个独立运行的计数器,program必须在计数器溢出之前"定期打卡"(俗称"喂狗"),
如果因为程序跑飞、卡死,导致长时间没有"打卡",
看门狗就会认定"程序已经失控",强制触发芯片复位,让系统重新启动、恢复运行
这不是"修复bug",而是一种"失控之后的兜底恢复手段"——
出现异常时,与其让设备一直死机,不如自动重启,至少能恢复响应,
生产环境里能大幅降低"死机后需要人工现场处理"的概率。
1.2 STM32F103 的两种看门狗——对比清楚才不会用混
| 对比项 |
IWDG(独立看门狗) |
WWDG(窗口看门狗) |
| 时钟来源 |
独立的内部低速时钟LSI(约40kHz) |
挂在APB1总线时钟(PCLK1)上 |
| 与主时 |