| 
关于喂狗的问题,今天思索了一下,总结如下:| 直接在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等前辈点评
 | 
 |