原创 [转]软件陷阱技术

2009-8-20 17:27 2596 9 9 分类: MCU/ 嵌入式

本文出自:http://www.52rd.com/Blog/Detail_RD.Blog_sfmcu_13428.html#52RD


CPU受到干扰后,往往将一些操作数当作指令码来执行,造成程序执行混乱.我在A51的做法主要有以下几种:


1.中断向量区
ORG 0000H
START: LJMP MAIN
LJMP INT0
NOP
NOP
LJMP ERR ;陷阱
LJMP TOINT
NOP
NOP
LJMP ERR ;陷阱
- - - -
ORG 0040H
ERR:
-----------



2.在表格区
在表格区的最后安排5个字节的陷阱
TABEL1:
DB ------------
DB ------------
NOP
NOP
LJMP ERR



3.在未使用的ROM空间
未使用的ROM空间一般全是 0FFH,对于51来说是"MOV R7,A"的单字节指令,程序一旦弹飞到这个区域,将会飞流直下.一般在一些固定的地址加入软件陷阱,捕获弹飞的程序.
ORG 6000H
NOP
NOP
LJMP ERR
ORG 7FFBH
NOP
NOP
LJMP ERR



4.在子程序后面
XXXX:
;;;;;;;;;;
;;;;;;;;;;
RET
NOP
NOP
LJMP ERR


以及在一些长跳转的断裂点...


注: ERR子程序,应当重新设定堆栈,等一些初始化的参数,但对于RAM区的部分数据可以判断保留.
至于是否能有所作用只有天知道了.(呵呵~ ~),不过我写的程序一般是最稳定的,也许是这玩意在起作用吧!







以下由我增加:


如果程序分成几个大块的话,可以定义一个变量TRAP_DATA,在进入每个块时对变量附不同的值,之后在程序块中检测这个变化是否与本入口值所附的值相同,不同则跳向EER程序。


MAIN:


。。。。


block1:


        TRAP_DATA=1;


       ...


     if(TRAP_DATA!=1)


              goto   ERR.


block2:


    TRAP_DATA=2;


    ...


   if(TRAP_DATA!=2)


       goto   ERR.






注意:


      当程序跑飞时其PC值可能是任意的,最好在陷阱入串口处放两三个NOP,因为很多单片机(51,AVR等)其很多指令是多字节指令,(PIC系列为单字节),如果PC正好飞到一条多字节指令中间处,那么后面的指令基本上都乱了。放入NOP是因为可以使PC能正确取址。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /3 下一条