原创 单片机编程经验

2011-5-27 23:12 2413 13 14 分类: MCU/ 嵌入式
       经验之一:用“软件陷阱+程序口令”对付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)高层,就要问问是不是你的王国根基(硬件)有问题了?而非出在意识形态(软件)上!硬件为本!软件为标!标本兼治铸就坚强体魄,方能百毒不侵!

        经验之二、不要轻信软件狗

       关于软件狗的讨论,论坛上多矣。匠人也曾经查阅过许多关于软件狗的文章。有些大师确实提出了一些比较有技巧性的方法。但是,匠人的忠告是:不要轻信软件狗!其实,软件狗相当于软件的一种自律行为。一般的思路都是通过设立一个计数器,在计时中断中对其+1,在主程序的适当地方对其清零。如果程序失控了,清零指令未被执行,但中断造常发生,则计数器溢出(狗狗叫了)。但是这里有个问题:万一干扰导致中断被屏蔽了,那软件狗就永远不会叫了!——针对这种可能,有人提出在主程序中反复刷新中断使能标志,保证不让中断被屏蔽。——但万一程序飞到某个死循环中去了,不再执行“刷新中断使能标志”这一功能了,还是有可能把狗狗活活饿死。

   
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

xucun915_925777961 2011-5-28 09:24

不错,路过,来学习一下^_^
相关推荐阅读
oceancjc 2015-02-15 19:01
[博客大赛] 关于OFFER,关于研究生三年——写在毕业前
好久没写什么了,之前一直忙毕业设计,找工作,忙完之后突然就没心思写东西了。可能是看了论坛上众多朋友们晒的offer,谈的研究生人生,又或许是昨天的情人节。。。。。。突然,在这个寂静的凌晨,我睡不着...
oceancjc 2014-06-09 10:22
【博客大赛】用对待信号的态度设计精密电源
        刚做完几个项目,来做点记录。跟大伙交流交流。本人没怎么做过电源。这个项目是头一个。一直做模拟信号高速信号的我,对待电源的认识很浅,望大家多多提意见。为我指点指点哈。      ...
oceancjc 2014-04-25 17:30
硬件工程师该如何成为软件专家
硬件工程师该如何成为软件专家 要想成为某个方面的专家可不是件容易的事,需要付出艰辛的努力,尤其是涉及到嵌入式软件方面。嵌入式技术的变化速度至少可以说是很快的。虽然用来编写软件的编程语言仍然是C和C+...
oceancjc 2014-04-14 12:55
零点、极点的比喻(转载)
看到这篇文章还蛮有趣的,转载到这里。作者:hfxin2001         自觉浪费了很多时间在学校里,在我那一直延续到三十多岁的求学生涯中,仅有两门课可说修正了我的思维习惯。这两门课都发生在加...
oceancjc 2013-08-27 14:41
【博客大赛】12.5G锁相环设计调试的心路历程
       亲爱的EDN的网友们,终于,我回来了。带着满身疲倦又面带微笑的回来了。这次我要跟大家分享一下我最近3个月断断续续设计加调试的12.5G锁相环的心路历程。看过我之前的博文的朋友们肯定知...
oceancjc 2013-02-05 12:53
【博客大赛】 大话OFDM-PON及其关键技术——同步
       上篇博文虽然反响不是那么好,可能是因为实质性的东西没有讲太多的关系,但还是感谢不少网友的支持。前一阵子在忙OFDM-PON的项目,所以,现在有点空来开始这一篇的博文。从这一篇起,我们...
EE直播间
更多
我要评论
1
13
关闭 站长推荐上一条 /3 下一条