原创 中断喂狗论之证明

2006-12-30 01:35 5186 9 9 分类: MCU/ 嵌入式
HotPower 发表于 2004-9-20 19:14 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴


本主题是专门对付你(也是大多数人)的观点--"即使主程序跑飞,定时器仍然可以正确的产生中断到向量处开始处理中断程序。"

请看:
  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
  }

它的依据是:
    如果保证定时器能正常工作及中断,那么,疯狗就成了"如来佛"...

http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?v=&ID=1372164
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条