新闻中心

EEPW首页 > 嵌入式系统 > 学习方法与实践 > 两种“软件陷阱技术”的比较

两种“软件陷阱技术”的比较

——
作者:时间:2007-11-19来源:单片机及嵌入式系统应用收藏
       引 言

       应用系统的抗干扰具体可分为和硬件两方面,其中,抗干扰以其设计灵活、节省硬件资源、降低成本等优势越来越得到广泛采用。抗干扰技术主要有“指令冗余技术”、“软件技术”、“软件看门狗技术”、“数字滤波技术”等。本文就软件技术对应用系统抗干扰的原理与具体实现方法进行探讨和研究,给出实现软件技术的两种形式,并将该技术成功地使用在多个实际的应用系统中,保证系统的可靠运行。 

       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个软件陷阱就可以了,具体方法如下:

     
linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭