两种“软件陷阱技术”的比较
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
两种“软件陷阱技术”的比较
引 言
单片机应用系统的抗干扰具体可分为软件和硬件两方面,其中,软件抗干扰
以其设计灵活、节省硬件资源、降低成本等优势越来越得到广泛采用。软件抗干
扰技术主要有“指令冗余技术”、“软件陷阱技术”、“软件看门狗技术”、“数
字滤波技术”等。本文就软件陷阱技术对单片机应用系统抗干扰的原理与具体实
现方法进行探讨和研究,给出实现软件陷阱技术的两种形式,并将该技术成功地
使用在多个实际的单片机应用系统中,保证系统的可靠运行。
1 程序跑飞和软件陷阱技术概述
程序正常运行时,程序计数器PC 始终指向正在执行的这条指令的下一条指
令的第一个字节的程序存储器单元地址,这样就保证了单片机能够正确地读取每
一条指令的各个字节,即CPU 先读取操作码,再读取操作数(如果有操作数字节
的话)。在MCS-51 系列单片机中,程序计数器PC 的寻址范围是0000H~FFFFH,
共64 KB。用户应用程序中,根据系统要求,规定了程序运行的惟一路径。这体
现在系统上电后,程序计数器PC 有唯一的变化历程,保证了程序正常、有序地
运行。程序跑飞是指系统受到某种干扰后,程序计数器PC 的值偏离了给定的唯
一变化历程,导致程序运行偏离正常的运行路径。程序跑飞因素及后果往往是不
可预计的。
在很多情况下,程序跑飞后系统会进入死循环而导致死机。这时,应采取有
效措施引导跑飞的程序尽快退出死循环并迅速复位。实践证明,软件陷阱技术能
有效引导跑飞的程序尽快退出死循环并迅速复位。
2 两种软件陷阱技术的比较分析
当单片机应用系统的CPU 受到干扰时,不良影响的主要形式有:①非正常修
改程序计数器PC 指针;②改写可编程输出端口的状态;③非正常修改重要数据
区的数据。以上三个方面的不良影响会使单片机应用系统程序失控,控制状态失
灵,其后果是非常严重的,它甚至会使系统崩溃,造成严重的工业事故。以上几
个方面的不良影响可以使用软件陷阱技术加以解决。现将这一技术的实现方法归
纳总结为两种。
2.1 软件陷阱技术实现形式之一
单片机应用系统的用户应用程序一般由循环结构的主程序和中断服务子程
序组成.将下面的软件陷阱程序段插入到用户应用程序中(如何插入的问题将在
下面的第3 点中详细讨论),即在用户应用程序存储器不用区域写入代码.
当单片机应用系统工作正常时,单片机的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 的内容,
而且无法将跑飞的程序纳入正确的轨道。可以使用下面的软件陷阱技术解决这个
问题。
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 的写入是由指令来完成的。当
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 种形式的软件陷阱技术是一种有效实用的单片机应
用系统抗干扰技术。本文所介绍的软件陷阱技术已成功地使用在多个实际的单片
机应用系统中,保证了系统的可靠运行