一种防止程序跑飞的“热启动”方法

2004-03-18 12:01郭春柱
电子世界 2004年3期
关键词:字节中断指令

郭春柱

在编写、调试系统软件的过程中,往往会出现这样的情况:编程时只注重每一条指令的执行结果而忽略指令执行后相应标志位状态的变化;或是MCU系统投入运行后,由于外界干扰使MCU内核三总线上的地址信号错乱而导致程序运行的失控,这些都将导致程序跑飞,而更有甚者将程序引入死循环使得整个系统完全瘫痪。如何拦截失去控制的程序流向?如何尽可能无扰动地恢复系统正常运行状态呢?笔者通过实践,提出了一种在不增加系统制作、调试的硬件投资和设备基础上,能够有效防止程序跑飞软件容错的设计方法。

1.软件陷阱的设计 当单片机的CPU受到干扰后,往往会误将一些操作数当作指令码来执行,而导致程序运行的混乱。例如当程序跑飞到某一双字节指令上,就可能落到其操作数上而将操作数当作指令码来执行;当然,若程序跑飞到三字节指令上,因三字节指令有两个操作数,那么出错的概率就更大了。因此在MCS-51 系统中,在对程序流向起决定作用的双字节或三字节指令(如LCALL、ACALL、LJMP、AJMP、SJMP、JZ、JNZ、CJNE、DJNZ、JC、JNC、JB、JNB、JBC、RET、RETI等)之后,需增加一段软件陷阱程序,才能使得跑飞的程序很快被纳入程序的正常轨道。这个软件陷阱程序可由三条指令构成,具体程序代码如下:

NOP

NOP

LJMP WRONG

其中WRONG为出错处理程序的标号。这段软件陷阱程序可依据实际的系统软件编程情况相应安排在未被使用的中断向量区(例如未使用串行口中断,就在ORG 0023H指令之后设陷阱)、未被使用的ROM空间中、读取数据表格或散转表格指令之后、关键的程序区(如RET、RETI、LJMP、AJMP、SJMP等指令之后)等位置上。

2.出错处理程序的设计 以上的软件陷阱程序只解决了如何发现系统被干扰和如何捕捉住失控的程序。当然,我们重点考虑应当是如何让MCU根据被破坏的现场残留信息使程序段自动恢复到正常的工作状态。在此我们可应用一系列的指令来模拟硬件复位功能,在这种软件复位方法中可根据系统编程的实际需要,对程序涉及到的各专用寄存器在主程序初始化过程中进行复位;而对于硬件复位方法中能够自动清除原先被激活的中断标志位的功能,可以通过以下程序段的设计来模拟完成。这部分程序代码如下:

WRONG: CLREA;关中断(软件复位程序)

MOV DPTR,#ERR ;准备返回地址

PUSHDPL

PUSHDPH

RETI;清除高级中断激活标志

ERR:CLRA ;准备复位地址

PUSHACC ;压入复位地址

PUSHACC

RETI;清除低级中断激活标志

这段程序先执行关中断,以便后续复位工作能顺利地进行,然后用两个RETI指令清除了所有可能存在的已被激活的中断标志位。对于软件陷阱捕捉来的程序只激活一个中断标志位的情况也不会妨碍程序复位后的执行。

采用防止程序跑飞的“热启动”方法可以有效地提高系统运行的可靠性,还可用于PIC、AVR等其它类型的MCU应用系统中,具有实用性、通用性等优点。并且,只通过简单改变这段程序,还可作为其它系统程序模块的一种容错设计方案。

猜你喜欢
字节中断指令
一样,不一样
TMS320F28335外部中断分析与研究
字节跳动瞄准教育等新业务
《单一形状固定循环指令G90车外圆仿真》教案设计
雪后林鸟
新机研制中总装装配指令策划研究
跟踪导练(二)(5)
新闻浮世绘
人类进入“泽它时代”
太空第一人