嵌入式系统/看门狗定时器
在嵌入式环境中,远离实验室,远离程序员、工程师和技术人员,各种问题都可能发生,嵌入式系统需要能够自行修复。请记住,一旦你关闭盒子并收缩包装你的产品,就很难再进入并修复你的错误。
在典型的计算机系统中,宇宙射线大约每月翻转一次RAM位[需要引用]。如果这种情况发生在错误的位上,程序可能会“挂起”,陷入一个短暂的无限循环。
关闭电源然后重新打开可以解决问题。但是,当你在巴黎,而你的嵌入式系统在南极洲时,如何摆弄电源开关呢?或者你在地球上,而你的嵌入式系统在海王星附近呢?
嵌入式系统工程师最重要的工具之一是看门狗定时器(WDT)。WDT是一个具有很长时间保险丝(通常为几秒钟)的定时器。
WDT 像电影中炸弹上的红色大数字一样倒计时到零(*)。如果任其自行运行,最终计数器将达到零。当计数器达到零时,WDT 将重置微控制器(就像电源关闭然后重新打开一样)。
当系统正常运行时,你不想让它随机重置自身,因此你需要确保你的程序始终在时间用完之前“喂狗”。良好的做法是在倒计时过半之前重置 WDT。例如,如果 WDT 的定时器为 20 秒,那么你将希望至少每 10 秒喂狗一次。
与我们的英雄在电影中处理炸弹不同,喂狗不会停止倒计时。当代码使用“重置”或“清除”命令喂狗时,它仅仅将 WDT 重置为某个较大的数字——然后看门狗定时器立即从那里开始倒计时。
如果程序员未能及时喂狗——或者程序因任何原因挂起——那么迟早 WDT 会超时,程序将重置,希望能够使你的系统恢复正常。
一些“多级”看门狗有一个第一级会中断 CPU。相应的中断处理程序记录有关当前状态信息(崩溃转储)的调试信息,并尝试“软”恢复。如果某些故障导致软恢复超时,看门狗的最后阶段将重置整个系统。 [1]
(*) 一些看门狗向上计数。对于这种类型的看门狗,“喂狗”将它重置为零。如果它达到某个上限,它将重置系统。
- ↑ Jim Lamberson. "使用单级和多级看门狗定时器". 设计世界. 2013.
- Massmind: 看门狗定时器
- 嵌入式控制系统设计/设计模式#看门狗定时器
- "手榴弹定时器:抵御恶意移动代码的看门狗定时器" 由 Frank Stajano 和 Ross Anderson (2000) 撰写——通过使用“非常节俭的硬件资源”,为“没有保护模式硬件的非常低成本的微控制器”提供了“保护模式”硬件的大部分优势。