关于喂狗的问题,今天思索了一下,总结如下:
直接在while(1)内无条件清狗,只能监控主程序异常和中断跑飞的情况,但无法监控中断被异常关闭的情况.
结构修改如下: #define N 20 /*若主函数在20个定时中断周期中仍然未执行到清除U8Globe_CounterDog计数器指令,则判断主程序异常,可执行软件复位处理*/ volatile unsigned char U8Globe_CounterDog; //软件复位用计数器 volatile bit fGlobe_EnClsWDT; //允许喂狗标志
void main(void){ test_system_reset(); //测试系统复位情况.. init_system(); while(1){ U8Globe_CounterDog = 0; //
....//任务代码 fGlobe_EnClsWDT = 1; //在需要狗看门的地方,设立此标志 .... //任务代码 } }
void interrupt TimerIsr(oid){ U8Globe_CounterDog ++; if (U8Globe_CounterDog > N) ProcTimerOutReset(); // else if (fGlobe_EnClsWDT) { CLS_WDT(); fGlobe_EnClsWDT = 0; } ...//处理其他事情 }
分析: 优点: 1 主程序跑飞,则无法置fGlobe_EnClsWDT标志和清计数器U8Globe_CounterDog ,则中断服务程序也无法喂狗,将发生超时软件复位或者看门狗复位; 2 若中断被异常关闭,则无法喂狗,将发生看门狗复位; 3 若中断没被关闭但跑飞,也将无法喂狗,将发生看门狗复位;
缺点: 1 占用一定的中断处理器时间; 2 要求TimerIsr优先级为最高;
若有人觉得在ISR中喂狗不好,那么也可以反过来,在TimerIsr中设立标志和清计数器,而在主程序中喂狗和处理超时软件复位.
至于代码中加了计数器U8Globe_CounterDog,个人觉得,用户可以在复位前做一些工作,不象看门狗复位过程中,用户无法控制.
请hotpower,xwj等前辈点评
|
|