摘要:在工业控制领域,程序的失效恢复问题是一重要而棘手的问题,一般采用方法是在程序正常运行必然要经过的地方安插WatchDog复位指令,当遇到程序死锁、跑飞等程序失效问题时,启动WatchDog,使程序恢复正常。但WatchDog并非绝对安全,常常失去有效性,使系统瘫痪。本文对WatchDog失效机理与对策做了一些探讨,并结合工程应用给出了几款有效的硬件WatchDog电路。
关键词:WatchDog;失效机理;对策;硬件电路
引言
WatchDog是一种用于监视CPU正常运行的电路,也称监督定时器,实际上是一个计数器,它需要在一定的定时周期内被复位,如果没有复位动作,看门狗电路的定时器将溢出并产生一个复位信号以使系统重新启动或产生一个非屏蔽中断信号(NMI),通过执行故障恢复子程序使程序恢复正常运行[1]。原理图如图1所示。

图1 看门狗原理图
只要在程序中能证明程序正常运行的地方插入看门狗复位指令,程序运行就能得到很好的监控。然而,这样一个理想的“地方”总能找到吗?WatchDog的监督总是有效吗?回答是否定的。下面就列举出一些WatchDog失效现象,并对其机理以及对策进行探讨。
1 WatchDog失效现象分类
在微机系统运行中,常常遇到WatchDog失效现象,其失效现象一般分以下几类:
(1)看门狗启动失败。
(2)程序跑飞,使看门狗失效。
(3)部分程序跑飞或异常,使看门狗失效。
(4)部分程序永远运行不到。
(5)恢复失败。
(6)硬件损坏。
2 WatchDog失效机理分析
2.1 看门狗启动失败
WatchDog失效多见于许多单片机片内自带看门狗电路和工控主机板的情况,单片机复位时将片内自带看门狗电路禁止,只有当程序访问该电路时,电路启动。如51系列单片机对SFR中的0A6H地址顺序写入#01EH、#0E1H;而96系列单片机则对SFR中的0A6H地址顺序写入#1EH、#0E1H;工控主机板上看门狗电路本身并不要求复位后重新启动,但BIOS在复位后将板上看门狗禁止,启动和喂狗方法与单片机相同。如研祥的FSC-1713主板,在WatchDog编程状态,只要执行如下两条指令:
outportb(0x2e,0xf6);
outportb(0x2f,TIME-OUT-VALUE);
可实现WatchDog的启停,其中TIME-OUT-VALUE ≠0启动;TIME-OUT-VALUE =0停止[2]。能够用指令禁止看门狗是为了适应用户程序开发阶段的需要,这同时给看门狗启动和运行失败留下了后门,在看门狗启动时或启动前遇干扰而使程序跑飞,则看门狗启动失败,无法行使监控职能。
2.2 程序跑飞
程序跑飞,看门狗失效又可分很多情况,以下对常见情况给予介绍。
2.2.1 程序跑飞,看门狗没觉察到
所谓没觉察到是指程序跑飞后,看门狗仍能收到有效的喂狗信号,即在溢出前能被复位,又可分为两种情况:
(1)看门狗的复位指令放置位置不当,程序运行至此并不能很好地代表程序是正常运行,如将其放在中断子程序中,一般来说只要中断屏蔽寄存器中的相应位开放,中断程序就能正常响应中断,所以中断子程式序中喂狗是有时不能正常起作用。
(2)程序跑飞后,在重构的“程序”运行时,仍能在每次看门狗溢出前产生有效的看门狗访问,这多见于片外看门狗,如广受欢迎的XICO公司X5045,只要对其片选(CS)产生一次访问,即可使其内部定时器复位,接法如图2所示,这是一个经典的引脚接法,就是直接与单片机的I/O口相连,假如CS与51系列单片机的P1.0相连,那么产生对P1.0访问的不同指令有一百多条[1],这是一个可怕的数字,在64K的程序寻址空间中找出一对能产生负脉冲的指令太容易了,尤其当看门狗定时常数较大时,风险更大。

图2 X5045和单片机相接
2.2.2 因程序跑飞,看门狗被禁止
部分单片机的片内看门狗、所有的片外看门狗芯片及工控主板均具有禁止看门狗的操作,甚至只要一条指令,这一点风险很大,写程序时应予以重视。
2.2.3 因程序跑飞,看门狗时钟消失
看门狗时钟消失情况多见于片内看门狗,大多单片机里看门狗与CPU共用时钟源,有些单片机可以禁止时钟以省电待机,程序跑飞时可能会出现时钟被禁止的现象,如果片外看门狗依赖此时钟,例如,用ALE作为看门狗时钟时,则无法正常工作。笔者在一个使用89C55WD的控制电路应用中,曾为此现象所困,这时如用有源晶振仍无济于事,后不得不重新设计电路。
2.3 部分程序跑飞或异常
对于运行于多进程多线程环境的工控系统,笔者尚未发现有硬件上能支持多线程级别的监控的,这一点往往未能引起开发人员的重视,而实际上应对运行在一个操作系统下所有进程的所有线程进行同时监控,只要有一个线程工作异常,就应控制计算机进入异常处理程序或重新启动计算机。
2.4 部分程序永远运行不到
WatchDog定时周期过短,致使部分功能无法完成或根本没运行到就已溢出,复位后又重复这一过程,有时这种现象比较隐蔽,如只在某特定条件下这部分功能才有表现,不易发现。一般情况下,只要在调试时,注意测试复位引脚有无复位脉冲,就能发现。但是,也可能只在需要运行这部分功能的条件具备时,才出现WatchDog溢出现象,这时就要通过分析程序,较精确地计算出一个合适的WatchDog定时周期值并人为创造这种“最不利”条件来测试它。
2.5 恢复失败
有些应用中,不必通过复位恢复程序功能,如部分功能失效、程序死锁等,只需通过非屏蔽中断(NMI)触发错误处理程序既可恢复正常,但当恢复必需的参数被破坏时,恢复失败。这时错误处理程序自动通过死锁等待复位信号到来,使程序全部恢复,所以硬件复位信号是必要的。
2.6 硬件损坏
在运行中,由于看门狗电路硬件损坏,造成WatchDog不起作用也是WatchDog失效的原因之一。
3 解决方案
至于解决WatchDog失效问题的对策可以从两个方面着手:其一为软件,这是一种经济和方便可行的方法,许多文献中对此做了大量探讨,这里不准备展开讨论[3];其二,硬件方法,改进看门狗电路。下面介绍几款看门狗电路供大家参考,其中用到了CPLD(或FPGA等)芯片,因为用CPLD芯片构造电路比较方便,而且它也非常便宜,许多电路中已有了这样的芯片,只需编程和稍微改动电路连线即可实现,也可用其它元件构造电路,其原理相同。
3.1 脉冲喂狗式
它替代普通的片外看门狗,结构原理如图3,这种方法适用于板上有CPLD的情况,节约一片专用看门狗芯片或一个看门狗电路。

图3 脉冲喂狗方式
3.2 编码喂狗式
编码喂狗式可分为串行式并行式,可用单编码字节或多编码字节喂狗。利用CPLD可方便地构造多个WatchDog,这样就可以实现对多模块或多线程的监视[4][5]。下面以双编码字节、多狗方式为例说明其工作原理,其结构如图4。

图4 编码喂狗方式
图中只画出了一路WatchDog,其喂狗方式为向地址Y1先写0xE1;再写0x1E。计数器的Clr为跳沿有效。其它路同此,喂狗的编码字节可取不同值有利于提高抗干扰能力,计数器位数可根据程序需要取不同值。
串行方式节约I/O口线,可实现很高的性能。又可分为异步和同步两种方式。异步方式因占用宝贵的串口资源,不推荐使用,如确实需要,可参考同步方式,图5是一个同步方式接线例子。

图5 同步方式
并行方式适用于电路中已有CPLD,只用其富余资源实现WatchDog功能。图6是一并行总线连接方式的例子,图中CPU与CPLD芯片之间以并行总路线相连,但实际设计中并不局限于此。

图6 并行总线连接方式
4 结论
程序失效的原因多源自恶劣的现场环境,用于测量、控制用途的计算机必须设有WatchDog,以保证其程序失效后的可靠恢复,但有了WatchDog并不能说明系统的失效恢复就是可靠的了,本文通过对各种WatchDog失效情况的分析基本找到了问题的实质,并给出了几款有效的硬件解决方案。值得注意的是WatchDog是系统可靠运行的最后一道防线,频繁出现WatchDog溢出而使系统复位的系统,是不可靠的,实际应用中是不允许的。所以,尽管有了可靠的WatchDog,还必须在电路设计和软件编程等方面注意加强抗干扰措施,从根本上提高系统抗干能力。
参考文献
[1] “看门狗”电路配套程序设计原理与技巧[J]. 电子技术应用,1996, (8)
[2] 研祥智能股份. 主板系列说明书[M],2003年7月
[3] 郑培余. 支持多线程监控的外置WatchDog监控组件的设计[J].计算机工程,2004, (24)
[4] Altera Corporation.Altera Digital Library[M], March 2002
[5] Altera Corporation.MAX7000Programmable Logic Device Data Sheet[M], August 2000
|