基于MCS-96单片机控制系统的程序失控防范
扫描二维码
随时随地手机看文章
1 引言
单片机构成控制系统时,在满足了各项控制功能后,为了使系统投入实用,必须提高其可靠性。但是,由于工业现场环境恶劣,常会受到电磁设备启动、停止、电源波形畸变等因素的影响,各种干扰不可避免,若只靠避错设计很难满足要求,而且也很难确保这些硬件万无一失,必须为系统配备容错功能。所以,抗干扰设计、容错设计(包括故障检测与诊断技术)和功能设计成为单片机系统设计缺一不可的重要内容。
在工业现场,大多数情况下干扰不会造成单片机系统硬件的损坏,主要是对软件运行造成不良影响。其主要特征是:指令码或数字码受干扰,使程序的执行出现错误。最典型的错误有:1)CPU的程序计数器PC的值发生跳变,使程序跑飞,转去执行一个毫无意义或错误的程序段,使系统出现混乱或失控,严重时可能会造成设备损坏,甚至危及人身安全;2)输出口被失控程序非法操作,使控制量发生波动或使系统出现“死机”;3)RAM区域受干扰,造成数据被冲毁,使系统出现运行不正常,输出出错。下面以MCS-96系列单片机所组成的实时控制系统为例,提出一些有效、实用的程序失控防范措施。
2 捕捉跑飞程序的方法
2.1 指令冗余
单片机最易受干扰的是内部程序计数器——PC的值。在受到强干扰时,PC的值被改变,改变后的值是随机的不确定值。这可使CPU将程序从正确的位置跑飞到ROM中的任何一个地址,当PC值飞到用户工作程序ROM区内时,可采用指令冗余的方法使程序走上正轨。具体方法是:1)在一些对程序流向起决定性作用的指令,如SJMP、 LJMP、LCALL、CALL等之前插入几条NOP指令;2)在某些对系统工作至关重要的指令,如中断、堆栈等之前插入几条NOP指令;3)在程序中每隔若干条指令,插入一条NOP指令;4)在多字节指令前插入一条或两条NOP指令。
由于单片机指令大多数为单字节指令,在一个程序中,其中断和堆栈指令使用的次数也很有限,因此,采用这种方法增加存储单元的数量不会太多。区,如EPROM中未被使用的空间或程序中的数据表格区时,常采用软件陷阱的方法来使程序纳入正轨。
所谓软件陷阱,就是一条引导指令,利用这条指令强行将程序引向一个指定的地址,在指定的地址上有一个专门的出错处理程序。假设该程序的入口标号为EPROM,则软件陷阱由以下3条指令构成:
NOP
NOP
LJMP ERROR
该软件陷阱除了安装在未使用的用户EPROM区外,还常常安置在未使用的中断向量区、表格区的最后和程序的断裂点后(断裂点是指象LJMP、SJMP、RET等类指令)。
2.3 看门狗(WATCHDOGTIMER)
当跑飞的程序既没有落入软件陷阱,又没有遇到冗余指令,而是在用户程序之间或用户根本未使用的地址空间内跳来跳去,自动形成一个死循环,解决这一问题的办法是利用软件启动单片机的监视定时器,俗称“看门狗”。当出现上述情况时,利用它来使系统复位。这种方法简单、直观,只需不超过64K状态周期(16ms)的时间(用12M晶振时),计算机就可恢复正常。但此时,一定要通过软件每隔一定时间(如15ms)使WATCHDOG TIMER复位一次。
3 无扰动重恢复
上述各项措施,只解决了如何发现系统被干扰和如何捕捉到失控的程序,这对于巡回检测、显示之类的普通单片机应用系统已经足够了。但是,在一些关键的工业控制系统中,由于工作过程和生产工艺的逻辑性和顺序性,当程序失控后,希望引导系统恢复执行刚才失控发生时的那个程序模块,不希望,甚至不允许程序从入口处重新执行。更重要的是,失控程序往往会乱涂乱写,不仅会破坏一些重要的信息,而且会对输出口进行非法操作。在此情况下前述方法就显得太不完整了。因此,如何恢复系统的重要信息,尽量无扰动地重新进入正常工作状态,是一个必须解决的问题,同时也是一个比较难解决的问题。
3.1 利用软件选择启动方式的方法
复位有两种方式:即初始复位和再次复位。习惯上称前者为“冷启动”,后者为“热启动”。“冷启动”时,系统的状态全部无效,需进行彻底的初始化操作。而 “热启动”仅对系统的当前状态进行修复和有选择的初始化,从而使系统尽可能快的恢复正常。系统初次上电投入运行时,必须是“冷启动”。运行过程中,由于抗干扰措施引起的复位,一般均为“热启动”。为了使系统能正确地决定采用何种启动方式,往往由软件用“上电标志”来区分。系统入口程序设计策略如图3—1 所示。
为使“热启动”顺利进行,首先要关中断,重新设置堆栈,将所有的I/O口设置为安全状态,封锁I/O操作,以免事态扩大,然后进行信息的恢复和状态的重入工作。
3.2 使受扰程序快速重入正常运行状态的方法
系统软件是由完成各种功能的程序组成的,因此可分成若干个功能模块。为了能使程序快速重入系统的正常运行状态,首先要将系统软件编制成模块化结构,并尽可能的将其细分为若干功能模块,每个功能模块在运行中需具有写入和记录功能,即设置RAM区的有效标志;记录编号和首地址;记录关键的又不可重新获得的数据;模块还应具有给运行监视系统发脉冲的功能等。为判断程序是否跑飞,要求在每个功能模块的结尾处将指定单元中保存的标志与本功能模块预先设置的标志进行对比。若不同,则程序跑飞,然后将它恢复到指定单元中保存的标志所对应的功能模块去重新执行;若相同,则运行正常。对于功能模块中的程序跑飞,可根据具体情况对结果的合理性进行分析和判断。若不合理,则返回重新执行;若合理,则进入下一个功能模块。具有这种功能的程序流程图如图3—2所示。
3.3 利用数据冗余技术实现RAM内容自救的方法
为了保证系统实现无扰动重入正常运行状态,必须保证重要数据的正确性。实现这一目的的方法是采用数据冗余技术。
在实时控制过程中,干扰会造成RAM中的数据被冲毁。数据被冲毁的情形,一般有如下3类: 1)整个RAM区数据被冲毁;2)RAM中某一片数据被冲毁;3)个别数据被冲毁。由于RAM中保存的是各种原始数据、标志、变量等,如果被破坏,会造成系统出错或无法运行。不过,对几乎所有的单片机实时控制系统而言,RAM中的大部分内容是为了进行分析、计算、比较而临时寄存的,不允许丢失的数据也只占RAM内容的极少部分。在这种情况下,除了那些不允许丢失的数据外,其余大部分内容允许短时被破坏,最多有过引起系统一个很短时间的波动,但很快就能恢复正常。因此,在实时软件中,只要注意对少数不允许丢失的数据进行保护即可。常用方法有“校验法”和“设标法”。这两种方法各有千秋,校验法比较繁琐,但查错的置信度高;设标法简单,但对数据表中个别数据被冲毁的情况无能为力。在编程中应综合使用。具体做法是:1)将RAM工作区重要区域的始端和尾端各设置一个标志码“0”或“1”;2)对RAM中固定不变的数据表格设置校验字。
在程序执行过程中,每隔一定时间通过事先设计的查错程序来校验各标志码是否正常,如果不正常,则利用数据冗余技术通过抗干扰处理程序来进行修正。冗余设计的一般原则是:在RAM区中相隔尽可能远且远离堆栈区的不同区域将数据备份3份,当读取数据时,把3份数据备份相比较,采用 3取2的表决原则,确保数据的正确性。
3.4 锁定输出口的方法
为了防止失控程序对输出口发生非正常操作,引起控制量产生波动和破坏系统的安全性,必须对输出口的操作进行严格的审查。解决的办法是硬件上采用锁定控制器,软件上采用功能块标志和口令字。
锁定控制器由两个D触发器来实现,如图3—3所示。
平时两个锁定控制器的输出端Q1、Q2均为低电平,而且Q1、Q2只要有一个信号是低电平,输出通道就处于被封锁状态。只有Q1、Q2同时为高电平时,该通道才被打开。为了防止程序对输出通道的非法写入,平时程序通过端口控制信号和置Q1、 Q2为低电平来关闭输出通道。而仅当需要输出时,程序通过端口控制信号和置Q1、Q2为高电平打开输出通道。程序输出时,需先给出口令字。输出模块程序流程图如图3—4所示。
4 结束语
采用上述这些措施可以有效地提高系统运行的可靠性,获得令人满意的控制效果,并且稍做修改即可用于其它类型的单片机控制系统,具有很强的实用性和通用性。
[参考文献]
[1] 王幸之.单片机应用系统抗干扰技术[M].北京航空航天大学出版社,2000,2.
[2] 周航慈.单片机应用系统程序设计技术[M].北京航空航天大学出版社,1991,7.
[3] 刘大茂.智能仪表[M].机械工业出版社,1998.5.