单片机编程经验(一)
发布时间:2008/5/27 0:00:00 访问次数:411
经验之一:用“软件陷阱+程序口令”对付pc指针的弹飞
当cpu受到外界干扰,有时pc指针会飞到另一段程序中,或跳到空白段去。其实,如果pc指针飞到空白段去,倒也好处理。只要在空白段设立软件陷阱(拦截指令),将程序拦截到初始化段或程序错误处理段。但是,如果pc指针飞到另一段程序中去了,系统如何办?小匠在这里推荐一种方法——程序口令,思路如下:
1、首先,程序必须模块化。每个模块(子程序)执行一个功能。每个模块只有一个出口(ret)。
2、设立一个模块(子程序)id寄存器。
3、为每个子程序配置一个唯一的id号码。
4、每当子程序执行完毕,要返回(ret)之前, 先将本子程序的id号送入 id寄存器。
5、返回到上级程序后,先判断id寄存器中的id号。
如果正确,则继续执行;如果不正确,则表示pc指针有可能已经跳错了,子程序没有按预计的出口返回,这时将程序拦截到初始化段或程序错误处理段。
这种方法,如同在程序中设立了若干个岗哨,每次调用子程序返回后,都要对口令(id号),验明正身后再放行。再配合软件陷阱,基本上可以将大多数pc指针弹飞的现象检测到。到了程序错误处理段,要杀要剐(冷启动还是热启动)就由您了。
仅以一条代码来揭示程序飞跑的本质!750102h ;mov 01h,#02h ,如当前pc不是指向75h,而是指向01h或02h,那么51内的指令译码器将把她们忠实地翻译成ajmp x01h 或 ljmp xxxxh 而xx01h xxxxh又是什么呢?天知道!这样恶性飞跑下去那还不死定!改革一下:
clr a ;0c4h
inc a ;04h
mov r1,a ;0f9h
inc a ;04h
mov @r1,a ;86h
每一字节代码都不能在生成跳转和循环,且都是单字节指令!往那跑去?跑出去了都要自己回来!“在家”千日好!“跳出”事事难嘛!这样只要平时习惯了用累加器和寄存器把数倒一倒,把那些危险代码都给倒掉,这样虽说给pc的“足”上多加了两字节的“包”可它不好“跑”啊!“足包”====跑!有朋友会问:要是pc抓做02h--ljmp 又有抓做了老鼻子远的xxh,再抓做隔壁的yyh不就没用了吗?提这样的问题只有zenyin这种钻牛角得才会提!pc那一位最活跃啊?pc0啊!要“扯拐”显然发生在她身上,至于那pc15同志啊,睡得更死猪一样,雷爆(强干扰)来了都打不醒?此外如果干扰都强到了pc高位都出错的地步!关电!关电!不干了!“不是我们不行而是敌人太强大”!反过来要是敌人在你的专政下,只是偶尔出来捣捣乱,但一出来就冲到屁西(pc)高层,就要问问是不是你的王国根基(硬件)有问题了?而非出在意识形态(软件)上!硬件为本!软件为标!标本兼治铸就坚强体魄,方能百毒不侵!
经验之一:用“软件陷阱+程序口令”对付pc指针的弹飞
当cpu受到外界干扰,有时pc指针会飞到另一段程序中,或跳到空白段去。其实,如果pc指针飞到空白段去,倒也好处理。只要在空白段设立软件陷阱(拦截指令),将程序拦截到初始化段或程序错误处理段。但是,如果pc指针飞到另一段程序中去了,系统如何办?小匠在这里推荐一种方法——程序口令,思路如下:
1、首先,程序必须模块化。每个模块(子程序)执行一个功能。每个模块只有一个出口(ret)。
2、设立一个模块(子程序)id寄存器。
3、为每个子程序配置一个唯一的id号码。
4、每当子程序执行完毕,要返回(ret)之前, 先将本子程序的id号送入 id寄存器。
5、返回到上级程序后,先判断id寄存器中的id号。
如果正确,则继续执行;如果不正确,则表示pc指针有可能已经跳错了,子程序没有按预计的出口返回,这时将程序拦截到初始化段或程序错误处理段。
这种方法,如同在程序中设立了若干个岗哨,每次调用子程序返回后,都要对口令(id号),验明正身后再放行。再配合软件陷阱,基本上可以将大多数pc指针弹飞的现象检测到。到了程序错误处理段,要杀要剐(冷启动还是热启动)就由您了。
仅以一条代码来揭示程序飞跑的本质!750102h ;mov 01h,#02h ,如当前pc不是指向75h,而是指向01h或02h,那么51内的指令译码器将把她们忠实地翻译成ajmp x01h 或 ljmp xxxxh 而xx01h xxxxh又是什么呢?天知道!这样恶性飞跑下去那还不死定!改革一下:
clr a ;0c4h
inc a ;04h
mov r1,a ;0f9h
inc a ;04h
mov @r1,a ;86h
每一字节代码都不能在生成跳转和循环,且都是单字节指令!往那跑去?跑出去了都要自己回来!“在家”千日好!“跳出”事事难嘛!这样只要平时习惯了用累加器和寄存器把数倒一倒,把那些危险代码都给倒掉,这样虽说给pc的“足”上多加了两字节的“包”可它不好“跑”啊!“足包”====跑!有朋友会问:要是pc抓做02h--ljmp 又有抓做了老鼻子远的xxh,再抓做隔壁的yyh不就没用了吗?提这样的问题只有zenyin这种钻牛角得才会提!pc那一位最活跃啊?pc0啊!要“扯拐”显然发生在她身上,至于那pc15同志啊,睡得更死猪一样,雷爆(强干扰)来了都打不醒?此外如果干扰都强到了pc高位都出错的地步!关电!关电!不干了!“不是我们不行而是敌人太强大”!反过来要是敌人在你的专政下,只是偶尔出来捣捣乱,但一出来就冲到屁西(pc)高层,就要问问是不是你的王国根基(硬件)有问题了?而非出在意识形态(软件)上!硬件为本!软件为标!标本兼治铸就坚强体魄,方能百毒不侵!
上一篇:单片机编程经验(二)
上一篇:星载单片机系统抗干扰技术