由于项目到后来抗干扰实验没有通过,需要加入看门狗,喂狗指令怎么加?加到什么地方比较合适?这是一个很有意思的问题,自己总结下,够后人参考。
目前有两个理论:主程序喂狗论和中断喂狗论;主程序喂狗论最大的依据就是:程序跑飞了但中断不一定会死,因为中断一般都有自己固定的中断向量地址,这个时候中断喂狗就失去了看门狗的意思。而中断喂狗论则认为:(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++;
if(Dog_Count<50)//如果程序正常运行,主程序中有清0,一定会喂狗。
{
WDT = 0;//喂狗
}else
{
while(1);//如果程序死机50个周期,开始不喂狗,等待硬件复位。
}
}
main()
{
Dog_Count = 0;//在主程序中清除计数位
...............
Dog_Count = 0;
..............
Dog_Count = 0;
..............
}
主程序中清0相当于看门狗喂狗的条件,这样就可以实现主程序和中断相结合,最终抗干扰效果要比单一的方法好很多。