基于MCS-96单片机控制系统的程序失控防范
1 引言
本文引用地址://m.amcfsurvey.com/article/172098.htm单片机构成控制系统时,在满足了各项控制功能后,为了使系统投入实用,必须提高其可靠性。但是,由于工业现场环境恶劣,常会受到电磁设备启动、停止、电源波形畸变等因素的影响,各种干扰不可避免,若只靠避错设计很难满足要求,而且也很难确保这些硬件万无一失,必须为系统配备容错功能。所以,抗干扰设计、容错设计(包括故障检测与诊断技术)和功能设计成为单片机系统设计缺一不可的重要内容。
在工业现场,大多数情况下干扰不会造成单片机系统硬件的损坏,主要是对软件运行造成不良影响。其主要特征是:指令码或数字码受干扰,使程序的执行出现错误。最典型的错误有: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所示。
评论