一种防止程序跑飞的“热启动”方法
2004-03-18郭春柱
电子世界 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等指令之后)等位置上。……
登录APP查看全文
