(1)引言
相信大多数人都遇到过这样的情形:他们每天使用的计算机出现"挂起"或"死机",即由于某种原因停止工作(反复执行一个未指定的操作,或者停止操作且不接收任何指令)必须重启。在大多数情况下,用户知道计算机的工作状态,能够识别已经发生故障,并采取适当措施(重启)。
嵌入式微控制器应用是指什么? 用户通常不是专家。事实上,用户甚至并未意识到正在使用微控制器。如果用户发现有问题,他们可能会采取措施,如从墙面插座上拔下插头。但是不可能一直监控应用程序,而且期望用户采取正确的决定并执行适当的处理并不合理的。
与此同时,应用程序正变得越来越大和越来越复杂。这使得即使设计人员要完整理解程序的每个部分也是很困难的。因此,要在程序设计中对可能出现的程序故障采取措施是不可能的(对于初学者,在考虑对策之前,首先必须提高程序的实现水平)。如果不能单单从程序采取对策,必须寻求硬件的帮助。
用于监控程序正常操作的具有代表性的硬件功能就是看门狗定时器。
(2) 什么是看门狗定时器?
看门狗定时器(简称WDT)是一种简单的定时器用于监视程序是否正常操作。定时器可以由正在被监控的程序清零,但不能被停止。当看门狗定时器溢出时,会产生WDT中断或复位。
正常情况下,看门狗定时器会被定期清零,以防止溢出而产生的WDT中断或复位。下图说明了看门狗定时器的操作过程。如图所示,与其它功能不同,正确使用WDT意味着它不操作(看门狗应当不出声)。
(3) WDT结构和操作 (概述)
看门狗定时器可以被清零但不能被停止(即它是无限运行的定时器)。一旦启动,看门狗定时器就持续地对指定的时钟计数。下图给出了看门狗定时器的操作过程图。从启动到溢出的时间是由水滴的频率(计数时钟的频率)决定的。当开始储水(时钟开始计数)时,如果水容器的底部被打开,即在水(定时器)溢出之前放水(对定时器清零),就没有问题了。但是,如果有人忘记放水了,或者没有及时放水,并产生溢出,则就要打开引爆xx的开关(产生复位)。这一过程会促使对程序故障进行检测。
(4) 怎样使用WDT (概述)
当程序正常操作时,如果定时对WDT清零,则将WDT设计为不需进行操作。
(5) WDT的局限
一旦程序挂起,或出现了其它故障,WDT就无法定期清零。这会引起WDT中断或复位(狗叫了),从而进行故障检测。但是,如果即使出现程序故障,WDT仍继续按规定清零,则无法对该故障进行检测。
之所以会出现这种情况是因为没有重视对WDT的清零操作,就好像夜贼在给一个顽皮的看门狗喂肉吃,那么这只狗只知道摇摆它的尾巴而不会吼叫。毫无疑问WDT是不安全的。
而且有些微控制器的内部WDT在初始化的时候就停止了(狗睡着了),所以无法工作(不能起到正常的保护作用),除非把它xx(把狗叫醒)。
(6) 目前的看门狗定时器
如今的微控制器中的看门狗定时器已经克服了上面提到的局限性,而且更方便使用。主要改进之处如下所示。
- 除非向看门狗定时器写入特定的数据参数,否则不能对它清零;如果写入的是其它值就会产生复位。
(除非给狗喂经常吃的食物,否则它就会咬人。)
- 严格规定WDT清零时序,如果定时器以其它时序清零则会产生复位。
(如果狗不饿的时候给它喂食,它就会咬人。)
- 使用不能停止的专用时钟启动WDT。
(狗一直醒着,看护财产。)
今后会有进一步的改进措施。
(7) 使用注意事项
使用WDT时需要重点关注的是在其溢出之前可以使用多长时间以及定时器清零的时序。如果溢出前的时间很短,那么定时器就必须经常清零,这样会增加对系统的限制(看见狗一饿就必须喂它,这样主人就不能离开屋子)。
但是如果清零时间设置得过于接近溢出,那么定时器可能会因为硬件变化,如计数时钟的变化,或者软件变化,如按照程序处理内容的执行时间变化或因中断产生的不同步,而无法按时清零。因此,在设计系统时必须考虑这些问题以保证WDT即使在最坏的情况下也不发生溢出。
此外,也要考虑当CPU停止,如进入待机模式时,应当如何处理WDT。
常犯的错误是对WDT清零赋予{zg}优先级,这样做过于简单,会出现诸如在定时器中断期间对WDT清零的情况(需要时才给狗喂食是一种痛苦,所以使用自动喂食机给狗喂食,以使它从来不会感到饥饿)。这{jd1}是狗摇摆尾巴的时候。
(8)内部与外部看门狗定时器的比较
集成在微处理器内部的看门狗定时器
本文无法在有限的篇幅内列举各种微处理器(?P) WDT的案例,而是以MAXQ2000微控制器的内部WDT为例进行说明。该定时器比上述基本的计数寄存器复杂一些,类似于多数商用化微控制器芯片的WDT功能。
没有看门狗清零操作时,MAXQ2000'的WDT溢出,由此触发中断,经过512个系统时钟周期后自行复位。中断为保存调试信息提供了“{zh1}一次机会”,大多数设计人员认为这一机会对于电路开发及故障排查至关重要。除了存储调试信息外,中断还用于从故障状态下恢复工作,xx看门狗计数器。后者会对系统的可靠性产生一定的影响。
与其它内部WDT类似,MAXQ2000的看门狗可以通过软件禁止。值得注意的是,这一功能可能是一把双刃剑:在程序运行失效时会禁止看门狗,导致系统的进一步混乱。
有些处理器将它们的WDT连接到一个独立于系统时钟的内部振荡器。虽然MAXQ2000的WDT时钟由系统时钟驱动,MAXQ2000的时钟电路可以在主时钟失效时切换到备份RC振荡器。
看门狗定时器IC
专用的、外部WDT IC能够提供多项功能选择,许多厂商都可提供这种器件。有些器件,例如; MAX6752,具有“窗检测看门狗”功能。MAX6752还可通过外部电容调节看门狗的超时周期和复位脉冲宽度,以满足微处理器和具体应用的要求。
MAX6369 WDT的逻辑输入引脚可以禁止定时器工作,防止复位。它通常连接到微处理器的一个逻辑引脚,这种方式对可靠性构成一定的威胁,因为在程序运行失效时可能会意外禁止看门狗功能。大多数情况下,需要在上电过程中(处理器导入程序时)禁止看门狗功能。MAX6369在复位后提供了一个额外的长周期看门狗超时。看门狗{dy}次清零后恢复到常规超时周期。这种方式比从外部禁止看门狗功能或重新使能看门狗功能更加可靠。
外部看门狗定时器还可以监测VCC电源,在电压跌落到指定的门限以下时触发系统复位。有些定时器还提供了具有去抖动电路和ESD保护的手动复位输入。这种IC内部的电压检测器能够在整个工作温度范围内保持较高精度,优于集成在处于电源失效状态的微处理器内部的方案。
表1列举了外部和内部WDT的优势和劣势,采用外部看门狗定时器IC相对成本较高,但可满足高可靠性系统的要求。将WDT的禁止输入连接到微处理器(可以通过软件禁止看门狗复位),会影响内部看门狗定时器的可靠性。集成在微处理器内部的看门狗定时器比较适合对可靠性要求不高的应用,好处是能够降低成本。
表1. 看门狗定时器比较
(9) 小结
WDT功能并不完善,要使WDT能够有效操作需要对程序有完整的理解。但是,如果用户掌握了WDT的操作,了解了它的局限性,就可以把它作为程序故障检测的有效手段。