在做项目时添加看门狗一个好的办法

来源:互联网 发布:命令模式入门 java 编辑:程序博客网 时间:2024/06/06 02:14

由于项目到后来抗干扰实验没有通过,需要加入看门狗,喂狗指令怎么加?加到什么地方比较合适?这是一个很有意思的问题,自己总结下,够后人参考。

目前有两个理论:主程序喂狗论和中断喂狗论;主程序喂狗论最大的依据就是:程序跑飞了但中断不一定会死,因为中断一般都有自己固定的中断向量地址,这个时候中断喂狗就失去了看门狗的意思。而中断喂狗论则认为:(1)只在主程序喂狗,由于中断被无意关断,那么主程序实际就只干傻喂狗功能,这种不工作也不死的 ,比死了更难受;(2)如果主程序陷入死循环,而死循环刚好又有喂狗程序,则起不到让系统复位的作用。

实际上无论哪种方法都不可能把所有的意外情况处理掉,我们能做的只是尽可能的处理意外事件。最好的办法就是主程序和中断相结合的方法喂狗,这个需要根据实际程序中断的特点编写相应的喂狗功能。我有两种想法实现主程序和中断相结合的办法。

(1)interrupt void ISR(void)//中断服务程序,定时周期为T

{

if(Dog_Save != Dog_Flag)//看门狗标志位不同表示程序在正常运行

{

WDT=0;//喂狗

Dog_Count=0;//用于计数

}

else

{

WDT=0;//喂狗

Dog_Count++;

if(Dog_Count>50)//死机50个周期后开始不喂狗

while(1);//等待看门狗使系统复位,此处也可软件复位。

}

}

main()

{

Dog_Flag = 1;//看门狗标志位

...............

Dog_Flag = 2;

..............

Dog_Flag = 3;

..............

}

在主程序中设置许多软狗标志位,定时器中不断检测软狗标志位是否变化,以此来检测主程序是否在正常运行。从而使看门狗系统能够可靠的保证程序在异常情况下实现系统复位!

(2)

interrupt void ISR(void)//中断服务程序,定时周期为T

{

Dog_Count++;l

if(Dog_Count<50)//如果程序正常运行,主程序中有清0,一定会喂狗。

{

WDT = 0;//喂狗

}

else

{

while(1);//如果程序死机50个周期,开始不喂狗,等待硬件复位。

}

}

main()

{

Dog_Count = 0;//在主程序中清除计数位

...............

Dog_Count = 0;

..............

Dog_Count = 0;

..............

}

主程序中清0相当于看门狗喂狗的条件,这样就可以实现主程序和中断相结合,最终抗干扰效果要比单一的方法好很多。
原创粉丝点击