这是第一次写一写下自己的学习的过程,这只是个开始,呵呵,当然没有结束的一个开始
今天没有事情,就看看单片机的书,突然发现自己学了这么长的时间还没有用过看门狗这个东东~~表示很惭愧,(*^__^*)嘻嘻……
既然这是自己的第一篇文章,那就来个简单,但是也好写的东东吧~~~
001.软件看门狗
当程序跑飞到一个临时构成的死循环中时,这是如果没有人为的操作(也就是按下复位键),那么软件系统将完全瘫痪。那么我们就要让MCU自己实现监视系统运行的情况,这就是程序运行监视系统(WatchDog)。
简单来说吧,好比一个主人养了一条狗,主人在正常工作时总是不忘记每隔一段时间就喂一次狗,狗吃过东西就安静下来,这样也就不会影响主人生活。但是如果主人打瞌睡忘记喂狗,那么时间到了,狗就饿了,发现主人还没有喂它,就会大叫起来,把主人吵醒。呵呵,这就是喽。。。。。。国外把这种程序运行监控系统成为WatchDog(看门狗)。其中看门狗的特性有:
1》本身能独立工作,基本上不依赖于CPU(这里还要解释一下,它占用CPU主要是那么几微秒,既喂狗)
2》CPU在一个固定的时间间隔和系统打一次交道(也就是喂狗,1中已经提到),以表明系统目前正常
3》当CPU陷入死循环后,能即使发觉并可以使系统复位
下面就是程序的设计过程了~~~
当系统陷入死循环后,什么样的程序才能使它跳出来呢?只有比这个死程序更高级的中断程序才能夺走死程序对CPU的控制权。为此,咱们可以用一个定时器来做看门狗,将它的溢出中断设定为高优先级中断,然后将系统的其它中断设定为低优先级的中断(这里一定要保证你设定的看门狗的那个中断一定要比你程序中的其它的中断要高!!!!)(这里的设置方法很多,但是刚才说的原则一定要满足!)。那就比如说吧,用T0作看门狗,定时约为16ms,如果你的系统中没有用到INT0,那么你就不需要设置PTO了(这里我就不多解释了~~大家懂得的)。
当看门狗启动后,系统工作程序必须经常“喂它”,而且每两次的间隔不得大于16ms(这里还是上边的例子)
当程序陷入死循环后,16ms之内即可引起一次T0中断,产生高优先级中断,从而结束死循环。同时,建议在T0中断里直接转向出错处理程序,也就是在中断向量区放置一条“LJMPERROR”就哦了(这里用汇编语言好解释~~)
下面是用汇编写的看门狗程序,它包含模拟的主程序,“喂狗”(DOG)程序和空弹返回0000H(TOP)程序。
ORG0000H
AJMPMAIN
ORG000BH
LGMPTOP
MAIN:MOVSP,#06H;模块硬件复位,这些可根据系统对资源的使用情况增减
MOVPSW,#OOH
MOVSCON,#01H
.
.
.
MOVIE,#00H
MOVIP,#00H
MOVTMOD,#01H
LCALLDOG;调用DOG的时间间隔应该小于例题中的16ms
.;这里就省了要添加的程序,自己根据自需要来添加就哦了,我也就不费话了
.
.
DOG:MOVTH0,#0B1H;这就是喂狗程序,这里用的是定时计数器0
MOVTL0,#0E0H
SETBTR0
RET
TOP:POPACC;空弹断点地址,也就是先将你压入的地址取出来,然后赋予新的值
POPACC;这里赋值为0,你懂得,也就是要让它返回到程序的开头~~
CLRA;当然你也可以不这样做,这里也可以来一个调用指令,自己搞定吧!
PUSHACC
PUSHACC
RETI;(这里是RETI,不是RET)
到这里看门狗的都该说清楚了~~~
这是软件抗干扰的方法之一,还有一种方法就是软件陷阱技术,这个也挺简单的,我也就不多赘述了~~
提示:软件陷阱就是一条引导指令强行将捕获的程序引向一个指定的地址,再那里有一段专门对程序出错进行处理的程序,用来使程序按既定的目标执行。真正的软件陷阱由三条指令组成:
NOP
NOP
LJMP ERROR