比较合理的喂狗方式

最近代码走读,我又纠结于“主程序喂狗”和“中断喂狗”的问题,以前一直都认为不能在中断中喂狗,今天在网上搜了下,原来有更好的解决办法。

———————-以下内容摘自网络:————————————-
原帖地址:http://bbs.mcu123.net/bbs/thread-6121-1-1.html

通常在主循环即后台的某处设置一标志(俗称软狗标志),在中断(一般在定时器)即前台的某处
检测此软狗标志,若有则认为主程序此时运行正常,否则不喂狗直到狗咬人(复位)。
反之也可在前台设置软狗标志,在后台真正喂狗。

这种方法是前后台依据软狗标志互相沟通以达到正确而有效的喂狗目的。
而此种方法的中断喂狗一般用于低功耗的系统中,它的优点是喂狗周期固定,而且很容易做到在
一处真正喂狗。
此种方法的主循环喂狗的缺点是喂狗周期相对不固定,有可能需要多处喂狗。

uint SoftWatchDog; // 软件看门狗
void main(void)
{
系统初始化并启动硬件看门狗;
while(1)
{
执行主程序任务;
SoftWatchDog = 0; // 复位软件看门狗
}
}

void IntT2(void) interrupt 5 using 1
{
复位硬件看门狗;
WatchSystem(); // 监测系统
执行其它任务;
}

void WatchSystem(void)
{
if (++SoftWatchDog >= 设定值) // 系统监测 ,当然还可以监测系统的其它状态
系统复位;
}

如果T2不能进入中断必然导致硬件看门狗复位系统,如果T2能中断必然能检测到死循环或系统状态是否正常,在不正常时复位系统了,仅供参考。

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注