发新帖我要提问
12
返回列表
打印

(keil手册上)所谓的“提高容错能力”的iret语句有用么??

[复制链接]
楼主: xlsbz
手机看帖
扫描二维码
随时随地手机跟帖
21
xlsbz|  楼主 | 2009-12-9 16:44 | 只看该作者 回帖奖励 |倒序浏览
20# 冷漠

没太看明白楼上是啥意思。冷漠大侠啥意思?

使用特权

评论回复
22
ZRL700424| | 2009-12-9 16:48 | 只看该作者
哎,要是程序都跑到这些没开的中断里了,其他地方可能早就被破坏得不像样了,出不出得来都无所谓了。

使用特权

评论回复
23
冷漠| | 2009-12-9 16:58 | 只看该作者
如何拉回的?利用C51编译器对中断的支持特点:
void extern_ISR_X(void) interrupt X{}

C51编译器给这段中断定义分配一个中断向量X,它的地址在X*8+3。X的取值从0-31,因为8051的中断向量表最大为0xff,可以计算一下:31*8+3=0xfb。你若设置X=32,就有编译警告:OUT OF ...范围。

因此,用户可以利用这种方法在程序正常轨道之外的固定位置挖掘32个陷阱!位置:0x03,0x0B,0x13,0x1b,0x23,0x2b,......0xf3,0xfb。每个陷阱里有一条RETI语句!这是这条语句的特殊性把掉入陷阱的异常程序拉回了SP堆栈指针所指向的原本正常程序的轨道位置点,异常程序被修正从这一点重新开始运行了。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1
24
冷漠| | 2009-12-9 17:02 | 只看该作者
本帖最后由 冷漠 于 2009-12-9 17:04 编辑

把下面这段程序编译一下:

void mian()
{
  
}

void INT_ISR31(void)  interrupt  31 { }


void mian()

        RSEG  ?PR?mian?C1234
mian:
  ; {
                        ; SOURCE LINE # 9
; }
        RET         
; END OF mian

CSEG        AT        000FBH
        LJMP        INT_ISR7

; void INT_ISR7(void)  interrupt  31 { }

        RSEG  ?PR?INT_ISR31?C1234
        USING        0
INT_ISR31:
            RETI         
; END OF INT_ISR31

        END

使用特权

评论回复
25
不亦心| | 2009-12-9 18:10 | 只看该作者
不太了解C,如果LZ说的iret和汇编中的RETI的功能一样的话,那么在未用的中断入口处插入这一条语句确实可以提高容错力,而且进的去出的来。
进入中断不一定非要是中断使能寄存器开启且中断标志置位。当系统受到干扰,PC值改变(或ljmp到中断入口),程序也有可能跳到中断入口的,如果中断入口没有这样的一条中断返回语句,那么单片机会把中断入口处单元的随机值当作操作码来执行,这样程序会飞到哪,随也不知道。
汇编中常用的方法是在未用中断入口处插入,nop,nop,ljmp *,来把程序拉回来。

使用特权

评论回复
26
xlsbz|  楼主 | 2009-12-10 08:07 | 只看该作者
如何拉回的?利用C51编译器对中断的支持特点:
void extern_ISR_X(void) interrupt X{}

C51编译器给这段中断定义分配一个中断向量X,它的地址在X*8+3。X的取值从0-31,因为8051的中断向量表最大为0xff,可以计算一 ...
冷漠 发表于 2009-12-9 16:58


请问 冷漠大侠:你写程序时,一般都挖陷阱么?
典型51仅仅有6个中断,那么也得至少挖(32-6 = 26)个陷阱?

什么情况一般要挖陷阱?什么情况可以考虑不挖陷阱?:)

多谢

使用特权

评论回复
27
冷漠| | 2009-12-10 10:52 | 只看该作者
本帖最后由 冷漠 于 2009-12-10 11:08 编辑

挖多少陷阱取决于程序员的意愿和容错知识。例如你的系统应用于强干扰工业环境下驱动继电器电感类(电动机类),肯定会有程序跑飞异常事件发生的情况下,就必然要采用一些软硬件容错技术。陷阱方法只是容错技术之一。挖多少陷阱,在什么地方挖陷阱,不跟猎人一样吗?它是根据具体野兽可能的路径判断来的。每个猎人(程序员)的经验不一样,不同野兽(程序)的路径也不一样。没有定式。

做控制系统安全容错技术的职业,工资要比一般嵌入式系统程序员高得多。这也是为什么要用RTOS平台上编程序的原因之一。因为操作系统这个平台很坚固(robust)。

顺便在这里说一句:keil的RTX51操作系统要比中国人做的所谓51_RTOS健壮性要好得多。就是因为RTX51带有容错技术,而国人做的51操作系统仅仅注重功能,——花拳绣腿。根本不能在强干扰工业系统环境下工作。如此脆弱的平台能称为操作系统?

还不如我最简单的陷阱方法:把程序分段(按模块或者函数),然后分段编译,各段之间空出若干000000空间,这就是最简单的陷阱了。会玩汇编的人在这里填入020202020202,然后在程序段 0x0202 处编写自己的恢复程序即可。
具体恢复到程序轨道的哪一点,就看程序员的水平发挥了。《匠人手记》上介绍了一种方法,简单实用。

LZ/keil介绍的这种方法,是给那些连汇编都不需要的用户使用的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则