2019-08-06 21:18发布
shenmu2012 发表于 2014-1-26 23:22 中断中喂狗是常见的处理方式的 ,我一般的都会在定时中断中做为狗处理的 ...
pluto55 发表于 2014-1-27 09:35 while(1) { 进入低功耗;line1
dirtwillfly 发表于 2014-1-27 11:05 msp430进入低功耗模式,被中断唤醒进行入中断服务程序后,如果在中断服务程序里没有退出低功耗模式的程序 ...
最多设置5个标签!
网上看到HotPower大侠关于这个问题的理解:
这样就归类为网上长期争论不休的2种喂狗方法。即“主程序喂狗论”和“中断喂狗论”。
实际上2种方法都有缺点!!!
“主程序喂狗论”提出: 在系统进入一个不正常的循环时,中断喂狗仍然起作用,看门狗
失去它本来的作用。
“中断喂狗论”也可提出:在系统运行一个很正常的循环时,主程序喂狗在起作用,看门狗
保持它本来的作用。但是在中断被意外关断不能有效工作时,主程序“正常”
有何实际意义???
为什么要叫“狗”呢???因为狗记路是靠撒尿的~~可能菜农说话粗鲁~~~
当程序经过某处时,要置标志说明程序已在此处运行过,如狗撒尿一般。
通常在主循环即后台的某处设置一标志(俗称软狗标志),在中断(一般在定时器)即前台的某处
检测此软狗标志,若有则认为主程序此时运行正常,否则不喂狗直到狗咬人(复位)。
反之也可在前台设置软狗标志,在后台真正喂狗。
这种方法是前后台依据软狗标志互相沟通以达到正确而有效的喂狗目的。
而此种方法的中断喂狗一般用于低功耗的系统中,它的优点是喂狗周期固定,而且很容易做到在
一处真正喂狗。
此种方法的主循环喂狗的缺点是喂狗周期相对不固定,有可能需要多处喂狗。
下面这个代码是中断喂狗的示例:
我觉得还是不错的,尽量都照顾到了:
uint SoftWatchDog; // 软件看门狗
void main(void)
{
系统初始化并启动硬件看门狗;
while(1)
{
执行主程序任务;
SoftWatchDog = 0; // 复位软件看门狗
}
}
void IntT2(void) interrupt 5 using 1
{
复位硬件看门狗;
WatchSystem(); // 监测系统
执行其它任务;
}
void WatchSystem(void)
{
if (++SoftWatchDog >= 设定值) // 系统监测 ,当然还可以监测系统的其它状态
系统复位;
}
如果T2不能进入中断必然导致硬件看门狗复位系统,如果T2能中断必然能检测到死循环或系统状态是否正常,在不正常时复位系统了,仅供参考。
msp430进入低功耗模式,被中断唤醒进行入中断服务程序后,如果在中断服务程序里没有退出低功耗模式的程序指令的话,在退出中断服务程序后,仍然进入低功耗模式。
若是在中断服务程序中有退出低功耗模式的指令,会按照你说的进行执行。
是的,一进入中断,SR被清零,所有中断模式被退出,
退出中断时SR的值会恢复到初始状态,即仍然是低功耗模式,除非有退出低功耗的代码
一周热门 更多>