本主题是专门对付你(也是大多数人)的观点--"即使主程序跑飞,定时器仍然可以正确的产生中断到向量处开始处理中断程序。"
请看: while (1) {//主循环,特别注意标志GF0_ PCON |= GF0_ | IDL_;//进入空闲状态(GF0=1) /*----------------------------------------------------------------- P1.7 = 0 (主程序死循环,等待T2中断捕捉)模拟主程序的错误 -------------------------------------------------------------------*/ if (!P1_7)//在在菜单Peripherals/IO-Ports/Port 1中点击P1.7死循环 while(1);//主程序死循环,等待T2中断捕捉 } 以上小节若P1_7==0时,将会进入死循环.
再引用你的话: "可以做个实验,在ROM的空闲处放置SJMP $的指令。那么即使主程序跑飞到这些软件陷阱里,你的中断仍然会定时去喂狗的!而使你的程序无法恢复到正常。正确的喂狗方法应该在主程序中去执行喂狗动作。"
确实如此"中断仍然会定时去喂狗的"!!! 但"黄雀在后"...
且看: /*------------------------------------ 定时器T2中断服务程序(XX.XXmS) ------------------------------------*/ void t2proc() interrupt TF2_VECTOR { TF2 = 0; if (PCON & GF0_) {//中断是从主循环内跳入的才能喂狗 ClrWdt();//清除看门狗计数器 PCON &= ~GF0_;//清除标志 } else {//软件狗复位入口 /*----------------------------------------------------------- 在下句中设置断点可以T2外的任何错误,条件T2能中断 ------------------------------------------------------------*/ IE = 0;//关闭所有中断 _reset_();//hotins.h内有定义,执行2次reti并跳入0x0000 } ..... }
但语句 if (PCON & GF0_) {//中断是从主循环内跳入的才能喂狗 ClrWdt();//清除看门狗计数器 PCON &= ~GF0_;//清除标志 }
出乎你的意料...它必须与主循环"通讯"才可喂狗!!!
再看异常捕捉:
else {//软件狗复位入口 /*----------------------------------------------------------- 在下句中设置断点可以T2外的任何错误,条件T2能中断 ------------------------------------------------------------*/ IE = 0;//关闭所有中断 _reset_();//hotins.h内有定义,执行2次reti并跳入0x0000 }
它的依据是: 如果保证定时器能正常工作及中断,那么,疯狗就成了"如来佛"...
|
文章评论(0条评论)
登录后参与讨论