0

关于投票
菜地里来了一条疯狗(中断养狗喂狗演示)
菜地里来了一条疯狗(中断养狗喂狗演示)
HotPower 发表于 7/23/2004 9:04:26 PM 侃单片机 ←返回版面 按此给该网友发送邮件 按此察看该网友的资料 按此把文章加入收藏夹

#include
#include
#include //最新版


/*------------------------------------------------
AT89S5X
--------------------------------------------------*/
sfr   WDTRST  = 0xa6;//内狗

sbit  WDT     = P1^0;//外狗
//#define GF0_    0x04//PCON.4软狗
void main(void)
{
/*--------------------------------------------------
  为了演示,省去了很多。。。。
---------------------------------------------------*/
  IE  = 0;
  _start_();//hotins.h内有定义,执行2次reti
  IP  = 0;
  PT2 = 1;//设置T2中断最高级
  TR2 = 1;
  ET2 = 1;
  EX0 = 1;
  IT0 = 1;
  EX1 = 1;
  IT1 = 1;
  ET0 = 1;
  ET1 = 1;
  ES  = 1;
  TI  = 0;
  RI  = 0;
  EA  = 1;
  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中断捕捉
  }
}

void ClrWdt(void)//喂狗
{
  WDT    = 0;//内狗
  WDTRST = 0x1e;//89s52内狗
  WDTRST = 0xe1;//89s52内狗
  WDT    = 1;//内狗
}

/*------------------------------------
         外部INT0中断服务程序
------------------------------------*/
void int0proc() interrupt IE0_VECTOR
{
//在菜单Peripherals/IO-Ports/Port 3中点击P3.2死循环
  while(1);//Int0死循环,等待T2中断捕捉
}

/*------------------------------------
         外部INT1中断服务程序
------------------------------------*/
void int1proc() interrupt IE1_VECTOR
{
//在菜单Peripherals/IO-Ports/Port 3中点击P3.3死循环
  while(1);//Int1死循环,等待T2中断捕捉
}

/*------------------------------------
         定时器T0中断服务程序(XX.XXmS)
------------------------------------*/
void t0proc() interrupt TF0_VECTOR
{
//在菜单Peripherals/Timer/Timer 0中点击TR0死循环
  while(1);//T0死循环,等待T2中断捕捉
}

/*------------------------------------
         定时器T1中断服务程序(XX.XXmS)
------------------------------------*/
void t1proc() interrupt TF1_VECTOR
{
//在菜单Peripherals/Timer/Timer 1中点击TR1死循环
  while(1);//T1死循环,等待T2中断捕捉
}

/*------------------------------------
         串口SIO中断服务程序
------------------------------------*/
void sioproc() interrupt SIO_VECTOR
{
  if (TI) {//在菜单Peripherals/Serial中点击TI死循环
   TI = 0;
   while(1);//发送死循环,等待T2中断捕捉
  }
  if (RI) {//在菜单Peripherals/Serial中点击RI死循环
   RI = 0;
   while(1);//接收死循环,等待T2中断捕捉
  }
}

/*------------------------------------
         定时器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
  }

/*-----------------------------------------------------------
  P1.2 = 0 (T2死循环,等待硬狗复位)模拟T2不能中断后的错误
------------------------------------------------------------*/
  if (!P1_2)//在菜单Peripherals/IO-Ports/Port 1中点击P1.2死循环
    while(1);//T2死循环,等待硬狗复位
/*-----------------------------------------------------------
  也可用更狠毒的方法,在菜单Peripherals/Timer/Timer 2中
  点击TR2关闭定时器T2,强迫硬狗复位
------------------------------------------------------------*/
}

系统分类: 单片机
用户分类: 看门狗专栏
标签: 无标签
来源: 原创
发表评论 阅读全文(712) | 回复(0)

0

关于投票
与狼同舞的豺狗--中断喂狗论
与狼同舞的豺狗--中断喂狗论
HotPower 发表于 2004-7-24 18:24 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴

在主程序喂狗之说中,若无硬件狗的"空中保护",搞借助定时器运行标志的方法,此法养的"疯狗"将会被"一滴水""闷死"的,所以,本人"大胆地"认为,这只是一条"家狗"或"宠物狗",对"看家"没什么"大本领",在强盗闯入家中时,只能叫几声而已.若给其扔个"肉包子",肯定是"肉包子打狗,一去不回",更可气的是,强盗走时它还对强盗摇几下尾巴!!!

例如: 在MCU中,一条指令不可能用一个字节(8位机)或1个字(16位机)或双字(32位机)一次完成的,这就形成了一条指令的尾可能与另一条指令的头组成一条"火星人"编写的指令!!!
例: sjmp $;
最容易被闷死的组合肯定是:while(1) clrwdt();

大家知道: 有狗也是会被闷死的,但没有狗"活着比死了更难受"!!!(睡觉都在做恶梦)

由于,狗的"成活率"在概率论中是50%. 若"倒霉狗"遇上组合while(1) clrwdt();那将是可悲的!!!(同情之中)

但是,"菜地里的疯狗"却有些不同,它不怕while(1) clrwdt();
因为,主循环的代码段的范围只有可知的几个字节,即它的代码地址范围是已知的,所以,遇上此组合,在中断喂狗前也可通过中断返回地址便可"变相地算出"是真的主人喂狗还是强盗喂狗!!!

所以,"菜地里的疯狗"应该更名为"与狼同舞的豺狗"会"更准确"些...
哈哈,豺狼是不吃"肉包子"的,狼会吃"人"的,豺能吃豹子的.

2种喂狗论实际只是"包"与"豹"之分,效果却是不一样的...
http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?v=&ID=1293162
系统分类: 单片机
用户分类: 看门狗专栏
标签: 无标签
来源: 原创
发表评论 阅读全文(417) | 回复(0)

0

关于投票
驳"软狗无用论"及"唯硬狗论"
驳"软狗无用论"及"唯硬狗论"
HotPower 发表于 2004-7-24 20:05 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴

首先,请所长别介意,老农是"对"事不"论"人.

"软狗无用论"就像文革时期的"读书无用论".
"唯硬狗论"也和"学好数理化,走遍世界都不怕"相近...

但本人的意见是"又红(软狗)又专(硬狗)"才更完美...

在"唯硬狗论"中,若遇上"仙人指路"的语句while(1) clrwdt();肯定必被"闷杀"!!!

在"软狗无用论"中,主要认为它不可靠,很容易被"闷杀"!

但两者的结合将会使被动的防御变为主动的"进攻"...

软狗需要硬狗的"空中掩护",硬狗也离不开软狗的"地面支持".

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

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

系统分类: 单片机
用户分类: 看门狗专栏
标签: 无标签
来源: 原创
发表评论 阅读全文(536) | 回复(0)

0

关于投票
中断喂狗论之证明
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
系统分类: 单片机
用户分类: 看门狗专栏
标签: 无标签
来源: 原创