两种“软件陷阱技术”的比较
扫描二维码
随时随地手机看文章
单片机应用系统的抗干扰具体可分为软件和硬件两方面,其中,软件抗干扰以其设计灵活、节省硬件资源、降低成本等优势越来越得到广泛采用。软件抗干扰技术主要有“指令冗余技术”、“软件陷阱技术”、“软件看门狗技术”、“数字滤波技术”等。本文就软件陷阱技术对单片机应用系统抗干扰的原理与具体实现方法进行探讨和研究,给出实现软件陷阱技术的两种形式,并将该技术成功地使用在多个实际的单片机应用系统中,保证系统的可靠运行。
1 程序跑飞和软件陷阱技术概述
程序正常运行时,程序计数器PC始终指向正在执行的这条指令的下一条指令的第一个字节的程序存储器单元地址,这样就保证了单片机能够正确地读取每一条指令的各个字节,即CPU先读取操作码,再读取操作数(如果有操作数字节的话)。在MCS-51系列单片机中,程序计数器PC的寻址范围是0000H~FFFFH,共64 KB。用户应用程序中,根据系统要求,规定了程序运行的惟一路径。这体现在系统上电后,程序计数器PC有唯一的变化历程,保证了程序正常、有序地运行。程序跑飞是指系统受到某种干扰后,程序计数器PC的值偏离了给定的唯一变化历程,导致程序运行偏离正常的运行路径。程序跑飞因素及后果往往是不可预计的。
在很多情况下,程序跑飞后系统会进入死循环而导致死机。这时,应采取有效措施引导跑飞的程序尽快退出死循环并迅速复位。实践证明,软件陷阱技术能有效引导跑飞的程序尽快退出死循环并迅速复位。
2 两种软件陷阱技术的比较分析
当单片机应用系统的CPU受到干扰时,不良影响的主要形式有:①非正常修改程序计数器PC指针;②改写可编程输出端口的状态;③非正常修改重要数据区的数据。以上三个方面的不良影响会使单片机应用系统程序失控,控制状态失灵,其后果是非常严重的,它甚至会使系统崩溃,造成严重的工业事故。以上几个方面的不良影响可以使用软件陷阱技术加以解决。现将这一技术的实现方法归纳总结为两种。
2.1 软件陷阱技术实现形式之一
单片机应用系统的用户应用程序一般由循环结构的主程序和中断服务子程序组成,主程序的结构如图1所示。将下面的软件陷阱程序段插入到用户应用程序中(如何插入的问题将在下面的第3点中详细讨论),即在用户应用程序存储器不用区域写入代码“OO00020000H”。
NOP
NOP
LJMP O000H
当单片机应用系统工作正常时,单片机的CPU不会执行软件陷阱程序段;但是,当单片机应用系统受到干扰而程序跑飞后,由于程序计数器PC值错误,破坏了正常的指令格式,导致执行非正常指令,从而执行软件陷阱程序段,落入软件陷阱,将跑飞的程序引导到复位入口地址0000H。软件陷阱程序段中的连续2条NOP指令是为了增强“LJMP 0000H”被捕获的能力,即“IJMP0000H”不会被冲散,当程序跑飞后会得到完整地执行,从而使跑飞的程序纳入正常轨道。
2.2 软件陷阱技术实现形式之二
虽然上述的软件陷阱技术能实现可靠回复功能,但是有两个方面的严重隐患。第一,隐患主要是在对中断的处理上:首先,程序跑飞很可能是发生在中断服务子程序中,其次,一些未使用的中断很可能因为程序跑飞而被错误地激活,而这时只是简单地让跑飞的程序从头开始运行,就不能关闭已激活的中断,这样,单片机的中断系统会认为程序仍在处理中断,就不会再响应同级中断。第二,大部分单片机应用系统在上电复位初始化后,不希望在程序跑飞而用软件陷阱回复后又重新初始化。
为了解决第一个隐患,当程序跑飞时,一定要想办法关闭可能发生的中断,然后再执行用户应用程序。大家知道,当CPU进入中断后,就只能用RETI指令关闭中断.解决第一个隐患的具体方法是,改变软件陷阱程序段:当程序跑飞后,将跑飞的程序引到0202H处,然后在0202H处完成关闭中断的工作,即在用户应用程序存储器不用区域写入代码“0000020202H”。需要注意的是,程序存储器不用区域的最后两个存储单元,一定要分别写入代码“00H”。
NOP
NOP
LJMP 0202H ;前面的连续2条NOP指令是为了
;增强“LJMP 0202H”被捕获的能力
而在0202H开始的程序存储器单元进行如下的编程:
ORG 0202H
MOVDPTR,#ERRl
PUSH DPL
PUSH DPH
RETI ;关闭第1级中断,并跳转到ERRl处
ERRl: CLR A
PUSH ACC
PUSH ACC
RETI ;关闭第2级中断,软件回复到0000H处
这样,就保证了无论在什么情况下,都可以关闭2级中断。当然,如果没有中断被激活时运行了这段程序,也不会有什么不良影响。
为了解决第二个隐患,可以在系统主程序入口处加一个软件开关来判别是上电复位直接进入0000H的,还是经过软件陷阱回复而进入0000H的,根据不同的判别结果执行不同的程序。
单片机应用系统上电时,上电复位电路会使单片机处于复位状态。这一般称为冷启动。
但是,软件陷阱技术使跑飞的程序回复到主程序入口地址0000H时,不影响特殊功能寄存器SFR的有效位。解决第二个隐患的具体方法是,设置上电复位标志。例如,以PSW.5作为上电标志位,当PSW.5=0时,表示是上电复位;当PSW.5=l时,表示是软件陷阱回复。图2是上电复位与程序跑飞后软件陷阱回复初始化处理框图。0000H是MCU的复位入口,程序启动后,首先判断是上电复位,还是程序跑飞后软件陷阱回复。上电复位是开机操作,要建立上电标志,并进行系统的完全初始化。程序跑飞后软件陷阱回复应该进行相关资源的检查与修复,以防止系统运行出错。另外,根据系统特点,需要保留一些过程数据,不得进行完全初始化。
为了解决上述两个隐患,有如下具体编程。其中,START0为系统上电复位完全初始化于程序入口,ER-ROR为程序跑飞后软件陷阱回复应进行的系统部分初始化和相关资源的检查与修复程序入口,LOOP是用户应用程序功能模块入口。
ORG0000H
LJMP START
ORG 0100H
START: MOV C,PSW.5
JC ERROR
SETB C
MOV PSW.5,C
LCALL STARTO
LJMP LOOP
ERROR: ……
L00P: …… ;应用程序功能模块
LJMP LOOP
ORG 0200H
NOP
NOP
MOV DPTR,#ERRl
PUSH DPL
PUSH DPH
RETl ;关闭第1级中断,并跳转到ERRl处
CRRl: CLR A
PUSH ACC
PUSH ACC
RETI ;关闭第2级中断,软件回复到0000H处
3 软件陷阱在用户应用程序中的安排位置
软件陷阱程序段可以插入到主程序中或者中断服务子程序中。根据实际应用情况,对软件陷阱程序段的位置安排可以有5种方式。
(1)在主程序的应用功能模块之间
在单片机应用系统程序设计时,将软件陷阱程序段分散地放在各应用功能模块之间空余的程序存储器单元里。当用户应用程序正常运行时,这些软件陷阱程序段并不会执行,但是,当单片机应用系统的CPU受干扰而使程序失控时,程序计数器PC指针一旦落入这些陷阱区,就可以马上将跑飞的程序拉回到正确的轨道。这种方法的确很有效。软件陷阱的多少一般依据用户应用程序大小而定,一般1KB的用户应用程序有2~3个软件陷阱就可以了,具体方法如下:
应用功能模块1
软件陷阱程序段
应用功能模块2
软件陷阱程序段
(2)在闲置未使用的EPROM/Flash ROM空间
在闲置未使用的EPROM/Flash ROM空间设置软件陷阱,即在这些闲置未使用的EPROM/Flash ROM空间写满代码“0000020202H”。值得注意的是,最后两个存储单元一定要分别写入代码“OOH”。当程序跑飞而进入此区后,便会被软件陷阱迅速拉回正常轨道。
(3)在中断服务子程序中
软件看门狗(soltware watchdog)实际上是软件陷阱的一个应用实例。以MCS-5l系列单片机为例,在系统初始化时将MCU内部的定时器/计数器T0设置为定时器,并将TO定时溢出中断设置为高级中断.如果系统采用6 MHz时钟,可以用如下的初始化程序段使TO定时约130 ms来形成软件看门狗:
MOV TMOD, #01H ;将T0设置为16位定时器
SETB ETO ;允许TO中断
SETB PTO ;将TO定时溢出中断设置为高级中断
MOV TH0,#0;给TO赋初值,定时约130/ms
MOV TLO,#0
SETB TR0 ;启动T0开始定时
SETB EA ;允许CPU中断
另外,TO定时溢出中断服务子程序编程如下:
INTO-PRo; MOV A,#02H
PUSH ACC
PUSH ACC
RET1 ;中断返回到0202H单元
当用户应用程序运行正常时,在小于130 ms的时间内,CPU应该及时“喂狗”一一执行清狗指令“MOV THO,#0”和“MOV TLO,#0”。这样,TO就不会产生定时溢出,从而T0定时溢出中断服务子程序不会被执行。但是,当单片机应用系统的CPU受干扰而使程序失控时,CPU就不会及时执行清狗指令,以致于产生TO定时溢出中断,就可以马上将跑飞的程序拉回到正确的轨道。实现及时“喂狗”的具体方法是在用户应用程序中的适当位置插入指令“MOV TH0,#0”和“MOV TLO,#O”。实际上,TO定时溢出中断服务子程序就是一个软件陷阱,一旦执行T0定时溢出中断服务子程序,就是把跑飞的程序强行拉回到0202H程序存储器单元。由前面的分析可知,已经跑飞的程序可以迅速地被纳入正确的轨道。
(4)在未使用的程序存储器地址空间
对MCS-51系列单片机而言,程序计数器PC的寻址范围是0000H~FFFFH,共64 KB;然而,在实际的单片机应用系统中,一般没有使用到64 KB的程序存储器,这样就会余下大量的程序存储器地址空间。例如,系统中仅选用了1片2764作为程序存储器,其地址空间为8 KB。那么将有56 KB程序存储器地址空间被闲置。当CPU受到干扰而使程序计数器PC指向这些被闲置的程序存储器地址空间时,CPU取指令得到的指令代码为“0FFH”(这个结论可以根据图3所示电路分析后得出)。该代码是“MOV R7,A”指令的机器码。显而易见,当单片机应用系统的CPU受干扰而使程序失控时,程序计数器PC指针一旦落入这些被闲置的程序存储器地址空间时,CPU执行该指令不仅将错误地修改寄存器R7的内容,而且无法将跑飞的程序纳入正确的轨道。可以使用下面的软件陷阱技术解决这个问题。
如图3所示,EPROM芯片2764的地址空间为0000H~lFFFH,译码器74LSl38的输出Y0为其片选信号,2000H~FFFFH为未使用的程序存储器空间。当程序计数器PC的值落入2000H~FFFFH空间时,一定有Y0为高电乎;当取指令操作时,PSEN为低电平,则74LS244的选通信号有效,所以74LS244被选中。进一步分析图3所示电路可知,当用户应用程序失控而程序计数器PC指向被闲置的程序存储器地址空间2000H~FFFFH时,总线驱动器74LS244被选通,这时CPU通过总线读入的指令机器码为020202H,正好是一条转移指令“LJMP0202H”,这样,使程序计数器PC指向0202H程序存储器单元。由前面的分析可知,已经跑飞的程序可以迅速地被纳入正确的轨道。
(5) 对外部RAM写操作实旆监控保护而设置软件陷阱
在单片机应用系统的外部数据存储器RAM中,一般保存了大量的预置数据和程序运行时产生的中间数据。外部数据存储器RAM的写入是由“MOVX@DPTR,A”指令来完成的。当CPU受干扰程序跑飞而误执行了该指令时,就会改写RAM中内容,导致RAM中的重要数据丢失。为了减小这种RAM中数据丢失的可能性,应在外部RAM写操作之前,对写操作进行条件判断。如果条件满足才执行写入操作;如果条件不满足,则将写入操作屏蔽,并使程序落入陷阱,进入死循环。在程序落人死循环陷阱后,便只能由其他软、硬件抗干扰技术(如看门狗技术)使系统退出死循环陷阱,从而使系统恢复正常。具体源程序代码如下(不妨设要写入外部RAM的内容存放在累加器A中,要写入数据的外部RAM单元地址存放在DPTR中):
MOV 6EH, #55H
MOV 6FH, #OAAH
LCALL WRlTE
RET
WRITE:NOP
CINE 6EH,#55H,TRAP
;写入条件是(6EH)=#55H
CJNE 6FH,#OAAH,TRAP且(6FH)=#OAAH
MOVX @DPTR,A
NOP
M0V 6EH,#00H
M0V 6FH,#OOH
RET
TRAP, SJMP TRAP ;落入死循环陷阱
4 结 论
与第1种形式的软件陷阱技术比较,第2种形式的软件陷阱技术消除了两个严重的隐患,因此,第2种形式的软件陷阱技术是一种有效实用的单片机应用系统抗干扰技术。本文所介绍的软件陷阱技术已成功地使用在多个实际的单片机应用系统中,保证了系统的可靠运行。