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

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

目前有两个理论:主程序喂狗论和中断喂狗论;主程序喂狗论最大的依据就是:程序跑飞了但中断不一定会死,因为中断一般都有自己固定的中断向量地址,这个时候中断喂狗就失去了看门狗的意思。而中断喂狗论则认为:(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相当于看门狗喂狗的条件,这样就可以实现主程序和中断相结合,最终抗干扰效果要比单一的方法好很多。

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值