原文
概要
我们平时使用的电脑,由于某种原因导致动作异常(反复执行指定外的操作,或者没有任何反应),这种情况被认定为程序失控(out of control)或者程序中止了。对于用户而言,可以知道程序出现了异常,需要采取一定的措施。
对于嵌入式系统而言,用户可能连是否使用了微控制器都不知道。当发现系统异常时,很可能的操作就是拔电源重启系统,根本谈不上监视异常、明确的判断和处理措施。
另一方面,各种应用,程序变得越来越大,越来越复杂。连设计人员也很难对整个系统理解清楚。程序中采用哪种预防措施是很困难的。那么,是否可以借助某个硬件模块来预防这种系统异常呢?
用于监视系统是否存在异常动作的硬件单元,典型的就是看门狗定时器Watchdog timer。
WDT
WDT是用于监视系统异常动作的硬件单元。WDT也是定时器的一种,可以在程序中clear,stop,当WDT溢出时,产生WDT中断,并产生复位信号。
通常,定期清除WDT,不会溢出,不会产生中断,也不会产生复位信号。为了便于理解,使用下图说明WDT的正常工作状态。
WDT构成和动作
作为定时器的一种,WDT可以被清除,一直执行(can not stop?),启动后,按照指定的计数值开始计数。如下图所示。水滴的频率决定了溢出的时间。水滴会一直这样滴下去(计数器值变化)只要在溢出前,清空槽里面的水(clear counter),就什么都不会发生。如果忘记定时清除槽中的水,到达一定时间后,就会发生溢出,引爆水槽旁边的炸弹(reset)。这样,检测数系统的异常。
WDT使用方法概要
程序正常工作时,会定期清除WDT,因此,WDT没有任何动作。
WDT局限
如果程序发生异常,如死循环,WDT无法定期清除,这样的话,WDT会溢出,同时产生WDT中断以及复位信号,程序可以检测出这种异常。但是,如果程序发生异常时,还是能够执行定期清除WDT操作,(如多个task中,某个task进入死循环,WDTtask还是可以执行清除操作),这种异常是无法检出的。
因此,WDT并不是万能的。
WDT现状
上面说明以WDT的局限性,但是,最近的微控制器中内置的WDT已经进行了改善,变得越来越智能了。
- 必须写入特定额计数值,否则无法清除,且写入其他值后会产生复位信号
- 限制了清除动作的时点,其他时点执行清除会产生复位信号
- 使用专用的时钟,启动时开始执行,不会停止
上面就是主要的改善点,而且,今后WDT还会继续得到改良。
WDT使用注意点
使用WDT时,最需要注意的问题集中在两个:一、溢出时间设置多少?二、在什么时点执行清除操作。
溢出时间越短,执行清除动作越频繁,限制了系统的性能。
清除时点越小,像计数器时钟变动等硬件变动,程序时间的变动,中断处理引起的异步变动,都会导致时间有所延迟,考虑到这些,最坏的情况,设计中必须保证不要发生移除。
另外,当CPU处在休眠状态时,需要考虑才此时WDT应该如何处理。
最常见的错误是,以清除WDT为目的设计程序,如在定时器中断中喂狗,这样做就本末倒置了。
WDT总结
WDT是一种能够检出程序异常的手段,但是,在使用的时候,一定要理解WDT的特点和局限性。