在。
(4) 人为性
在实时控制软件中常要求通过人-机对话, 操作人员可直接干预系统的运行, 设置。 调整相应的系统参数。
在正常情况下, 实时控制软件是按照上述四个特性规定的秩序执行。但受到现场的干扰后或用户的不正确使用, 就会破坏程序的正常运行, 导致整个系统失控。
干扰对系统的影响大致可分成如下几个方面: (1) 程序\跑飞\
干扰使CPU中的程序计数器PC出错, 使程序\跑飞\ 转去执行一个毫无意义或错误的程序段, 使系统出现严重混乱或失控。 (2) RAM内容被破坏
RAM区域受到干扰, 造成其数据段被冲毁, 使系统出现运行不正常, 输出出错。
(3) 程序的错误走向
程序\跑飞\后的去向, 一种可能是转入无意义的\循环\中去出不来,这 就是所谓的\死循环\另一种可能是PC值不断增大, 当PC值增至FFFFH值之后, 转为执行地址从0000H开始的程序, 这等于是重新启动控制程序, 这一般是不允许的, 是控制失误的另一种形式。 (4) 不响应中断
如在CPU执行中断服务程序未返回之前程序\跑飞\ 则由于开放中断的指令未执行, CPU将对其它中断不响应。这样优先级低的中断申请就不会的得到响应, 造成低级中断丢失。
在得到以上分析结果后, 我们就可以针对错误的不同特点来在程序中采取一定的手段来给以克服, 提高系统可靠性。
§7.2 抗干扰及容错技术简介
抗干扰和容错技术多种多样, 各自有不同的针对方面, 下面对其有代表性
的技术给以简要介绍。
(一) 抗干扰技术
1. 在程序中插入空操作指令NOP以实现PC的容错 分析MCS-51单片机的指令系统可知, 对八位二进制数
00H~FFH中256个数值全部具有定义的指令的操作码, 而指令的长度又有一、二、三字节三种不同的指令。 操作码在程序中的具体地址是根据程序顺序安排、无规律放置的, 操作数往往是随机的, 不具有确定的机器码。而单片机最易受到干扰的是内部程序计数器---PC的值。在受到强干时, PC的值被改变, 改变后的值又是随机的, 为一不确定值, 这就使CPU误将程序从正确位置跳到另一个无意义的区域内执行,使整个程序处于无序状态。 处于这种状态下的时间越短对系统的影响越小。 解决这一问题的办法, 就是有意识地在程序中插入一些空操作指令NOP。由于该指令为单字节指令, 它对CPU的工作状态无任何影响。这就使失控的程序在遇到该指令后, 使PC的内容得以调整, 而使PC内容修改到正确秩序, 使接下来的指令得到正确的执行。其插入原则为:
(1) 在跳转或多字节指令前插入, 以使程序得到正确转移或指令正确执行。
(2) 在比较重要的指令前插入, 如中断。 堆栈等有关指令。 (3) 在程序中每隔若干条指令, 插入一次。
(4) 根据具体情况, 每个地方只需连续插入一到两条空操作指令即可。
2。 采用WATCHDOG来避免程序长期陷入死循环。
WATCHDOG就是\程序运行监视系统\也叫\看门狗\它有如下特性:
(1) 本身能独立工作, 基本上不依赖CPU;
(2) CPU在一个固定时间间隔中和该系统打一次交道(喂一次狗), 以表明系统\目前尚正常\
(3) 当CPU掉入死循环后, 能及时发觉并使系统复位。 在8096系列单片机和增强型8051系列单片机中, 已将该系统做入芯片内, 使用起来很方便。 但在普通型8051系列单片机中, 必须由用户
自己建立。 如要达到WATCHDOG的真正目标, 该系统必须包括一定的硬件部分, 它完全独立于CPU之外。 如为了简化硬件电路, 也可以采用纯软件的WATCHDOG系统。 其思想是用比死循环更高级的中断子程序夺得对CPU的控制权。 为此, 可使用一个定时器来做WATCHDOG, 将它的溢出设为高级中断, 系统中的其它中断设为低级中断。 可让T0定时为一固定时长 (具体要看软件主程序多久能完成一次循环, 设为两到三个循环时长即可),系统启动后就给它一个计时值, 例如16ms, WATCHDOG启动后系统工作程序必须不断喂它——给它重新送值, 每两次之间的间隔不能超过16ms, 每喂一次可以使它安静一段时间。这个送值动作可放在监控循环中或另外一个定时中断中(定时周期小于16ms)。 当程序运行错误, 掉入死循环后, 16ms之内即可引起T0溢出, 产生高级中断, 从而退出死循环。 在T0中断向量区安放一个软件陷肼, 引导到出错处理程序, 由出错处理程序来完成各种善后工作, 并用软件方法使系统复位。
纯软件WATCHDOG需要系统让出一个定时器资源, 如果系统难以办到, 可以让T0作兼职WATCHDOG, 由T0中断子程序分担部分工作任务。这时可以另外用一个单元作为计数器, 来统计T0中断的次数。当中断次数达到某个规定值时 (例如5次), 即作出错处理。 这时在主程序中应加入使计数器清零的指令。系统正常运行时计数器的值增加不起来,故不会引起出错处理。 如果系统受到干扰进入死循环, 计数器就会加到指定值而引起出错处理。
出错处理一般采用 \热启动\的方法模拟复位来使系统恢复正常。这里有一点比较关键的是要注意清除可能存在的中断激活标志, 否则可能会阻止所有中断响应。 中断标志只有RETI指令才能清除, 而且要连续两次使用RETI指令才能保证清除全部中断激活标志。
3。 设置软件陷肼。
软件陷肼设置在程序正常运行不可能到达的地方。 一般只有在系统出错时才有可能运行到这里。 一旦程序被软件陷肼 \捕获\就转到出错处理程序, 从而使系统恢复正常运行。
4。 采用数据冗余技术实现RAM内容的自救。
对实时系统来说, 干扰造成的比较严重的危害之一就是冲毁RAM中的数据, 由于RAM中保存的是各种原始数据、标志、变量等, 如果被破坏, 会造成系统出错或无法运行。 对RAM 数据的保护常用的方法有 \
校验法\和 \设标法\。这两种方法各有千秋, 校验法比较繁琐,但查错的置信度高。设标法简单, 但对个别数据被冲毁的情况, 查错则无能为力。 所以在编程中一般应综合使用。 其具体做法为:
(1) 将RAM工作区重要区域的始端和尾端各设置一个标志码\或\
(2) 对RAM中固定不变的数据表格设置校验字。
在程序的执行过程中, 每隔一定的时间通过事先设计的查错程序来检查其各标志码是否正常, 如果不正常, 则利用数据冗余技术通过抗干扰程序来修正。
(二) 容错技术
容错技术又分为软件容错和硬件容错, 在许多场合中,软件容错更为优越, 下面只介绍软件容错技术。按设计思想软件容错可简单分为时间冗余和信息冗余两种。 实际应用时常有机配合之。 1。 时间冗余
时间冗余是通过消耗时间资源来达到容错的目的, 它包括指令复执和程序卷回两种常用方法。 (1) 指令复执
当程序因为外界干扰或其它原因引起瞬间性错误时, 计算机将发生错误甚至无法执行。 指令复执等于程序中每条指令都是重新启动点, 一旦发生错误, 就重新运行被错误破坏的现行指令, 实现指令复执的基本要求是:
* 当发现错误时, 能准确保留现行指令的地址, 以便重新取出执行。
* 现行指令使用的初始数据必须保留, 以便重新执行时使用。 在指令复执时, 应注意不能让当前的指令执行完毕,而要在传送结果之前就要停止现行指令的执行, 以保持上一条指令结束时的现场。此外, 程序计数器PC还要回退一步, 即 PC-1→PC。
指令复执的目的是在于消除瞬间性故障对系统的影响, 通常要控制指令复执的次数, 在一定次数或时间内复执成功就算故障排除。
(2) 程序卷回
程序卷回是一小段程序的重复执行。 为了实现卷回 (追溯),也要保留现场。 具体做法如下:
* 程序分成若干小段, 卷回时也就卷回到小段而不是程序的起点。
* 在第N段之末, 将当时各寄存器。 程序计数器的内容移入内存, 并将内存中被第N 段程序所更改的单元另行开辟一区保存起来。 如在第(N+1)段不出错, 则将第(N+1)段现场存档, 并撤消第N段的档案。
* 如果在第 (N+1)段中出了错, 就把第N 段的档案送给机器的有关部分, 然后从第 (N+1) 段的起点开始重复执行第(N+1)段程序。 如果卷回一次不解决问题, 可以卷回若干次, 直到故障排除或者判断故障不能排除为止。
2。 信息冗余
信息冗余是靠增加信息的多余度来提高可靠性的。 一般而言, 附加的信息位越多, 其检错和纠错的能力越强。奇偶码、汉明码、循环码等都有很强的检错和纠错能力。它的优点是增加的冗余度比别的方法低, 而且许多码的信息位和校验位在运算中统一处理。此外, 它能纠正瞬间错误,提供故障的自检测、自定位、自纠正。其缺点是产生延时,不能纠正编码器及译码器自身的错误。
由上述抗干扰容错技术的一般性讨论, 我们可以看到抗干扰容错手段多种多样, 其针对的错误特性也不尽相同, 而采取哪几种措施来提高系统的可靠性, 要看其花费的代价和可能取得的效果以及对系统抗干扰容错标准的技术性要求。一般来说, 在要求不太严格的系统中只需选择性地使用两到三种有不同针对性的措施即可。
§7.3 系统采用的抗干扰及容错措施