EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2009/1/20 21:44:30

0

关于投票

软件看门狗

http://www.21icbbs.com/club/bbs/showEssence.asp?id=10305

hotpower 发表于 2009-1-18 21:22 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖


28楼: 关于23楼软件看门狗的问题

大致应该这样(测试速度比23楼快):
#define    SOFT_DOG_TIME  XX    // xx小于硬件狗溢出时间的一半
volatile bit   flg_soft_dog=1;//注意加volatile,好像Keil的bit不需要
main()
{
  ...
  while(1)
  {
     ...
     //-----------------
     flg_soft_dog = 1;
     //-----------------
     ...
  }
}

time_interrupt()    //通用定时器
{
static uchar soft_dog_timer=0;//应该用局部变量,最好少用全局变量
  ...
  //--------------------------
  if(flg_soft_dog)
  {
    flg_soft_dog = 0;
    soft_dog_timer = 0;
  }
  else
  {
    soft_dog_timer++;
    if(soft_dog_timer>=SOFT_DOG_TIME)
    {
      soft_dog_timer = 0;
      soft_reset();        //软件复位
    }   
  //--------------------------
  }
  ...    
}

系统分类: 单片机  |  用户分类: 看门狗专栏  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1206) | 回复(0)

发表于 2009/1/16 20:03:43

1

关于投票

55AA+外部看门狗的检测方法技巧和代码注解

更多讨论见: http://bbs.21ic.com/club/bbs/list.asp?boardid=11&t=3212332

hotpower 发表于 2009-1-16 20:04 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖


楼主: 55AA+外部看门狗的检测方法技巧和代码注解

volatile unsigned int SystemRamTest;

void SystemInit(void)
{
  PortInit();
  TimerInit();
//.......
  WdtTest();//测试外部看门狗
}

void PortInit()
{
  P0 = 0xff;
  P1 = 0xff;
  P2 = 0xff;
  P3 = 0xff;
}

void WdtTest()
{
  WdtClr();//喂外狗
  if (SystemRamTest != 0x55aa)
  {//上电复位可认为SystemRamTest是随机且不可能为0x55aa(概率几乎为0)
    LedInit(1);//上电复位,初始化Led全亮,这样在外狗坏时常亮!!!
    Delay100mS();//这里要用软件延时,因为这里还未开中断
    XBYTE[0x0200] = 0x77;//复位DSP
    XBYTE[0x1000] = 0x04;//写板型,上报PC
    SystemCommand = 0;//复位系统命令,但只有在上电时1次复位
    SystemRamTest = 0x55aa;//设置上电复位结束及RAM测试标志
    while(1);//等待外部看门狗复位,测试外部看门狗喂狗硬件引脚
  }
  else
  {//外部看门狗复位测试通过,外狗器件完好
    LedInit(0);//软件或看门狗复位,初始化Led全灭,外狗好时Led闪烁1次!!!
  }
}

void main()
{
  IE = 0;//关中断
  _start_();//启动时执行2次RETI
  SystemInit();
  while(1)
  {
    EA = 1;//开中断
    WdtClr();//喂狗
    TaskMain();//主任务
    PCON |= IDL_;//进入空闲状态
  }
}

本贴由菜农提供"技巧"答谢诸位"狗友"~~~,转贴请注明出处(雁塔菜地)
HotPower@126.com 2009.1.16 于雁塔菜地
catwill 发表于 2009-1-16 20:30 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

2楼: 有些不懂,请教大虾

_start_();//启动时执行2次RETI    ??

    XBYTE[0x0200] = 0x77;//复位DSP  ??
    XBYTE[0x1000] = 0x04;//写板型,上报PC  ??
    SystemCommand = 0;//复位系统命令,但只有在上电时1次复位  ??

菜鸟蠢钝,参透不得,希望大虾赐教。
hotpower 发表于 2009-1-16 20:33 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

3楼: 参见<Keil C51红杏出墙记>

 

Keil C51红杏出墙记

catwill 发表于 2009-1-16 20:47 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

4楼: 看“红杏出墙”很晕倒啊

小鸟不懂汇编,不过看了您的hotIns.h好像是用C51来“模拟”汇编??
还有,“中断隐身”的概念小鸟不懂,好像机器码都上来了??
可能我对RETI的理解不够深刻吧!
还有hotIns.h里也没有对_start_();的声明吧?

    XBYTE[0x0200] = 0x77;//复位DSP  ??
    XBYTE[0x1000] = 0x04;//写板型,上报PC  ??
    SystemCommand = 0;//复位系统命令,但只有在上电时1次复位  ??
这3句还是不懂……
请赐教。
hotpower 发表于 2009-1-16 21:03 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

6楼: 实际是非常广泛应用的一句~~~

这是村里的程序片段摘要~~~

1.
XBYTE[0x0200] = 0x77;//复位DSP  ??

它是51通过双口RAM与DSP通讯的代码.
51上电时通知DSP进行软件复位.

DSP指令:
command = FLASH[worknum] >> 8;//取命令
switch(command)
{
  case 0x77:
       if (worknum == 0)
       {
         SWI_Reset();//复位DSP
       }
       break;
//.....
}

2.
XBYTE[0x1000] = 0x04;//写板型,上报PC  ??

它是51(发送)通过CPLD与工控(PC)单板通讯的代码.

3.
SystemCommand = 0;//复位系统命令,但只有在上电时1次复位  ??

它是51(接收)通过CPLD与工控(PC)单板通讯的代码.
接收数据在SystemCommand中.
而且只能在51上电时初始化为0一次.

这种应用非常广泛~~~

Keil C51复位后不改写RAM内容的方法

hotpower 发表于 2009-1-16 21:55 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

10楼: _start_();和2次RETI的问题

_start_();实际是"汇编数组"~~~

2次RETI的真正目的是:
保证清除2级"隐身"的中断优先级状态触发器~~~


/*------------------------------------------------------------------------------------------*/
#define _intjmp_(ADDR) DPTR = (void *)ADDR;_icall_(__reset_code__) //中断隐身函数_intjmp_()声明
#define _reset_() DPTR = __reset_code__ + 5;_icall_(__reset_code__) //软复位函数_reset_()声明
#define _start_() _icall_(__reset_code__ + 4);_icall_(__reset_code__ + 4); //软启动函数_start_()声明
#ifndef __reset__code__
  #define __reset__code__
  _db_(__reset_code__, "\xc0\x82\xc0\x83\x32\xe4\xc0\xe0\xc0\xe0\x32");//装载数据DB 0xc0..0x32
#endif
/*--------------------------------------------------------------------------------------------
装载代码   __reset_code__: PUSH  DPL;//非典的软复位函数入口(执行2次RETI)
                           PUSH  DPH
                             RETI;//_intjmp_()函数调用到此为止中断退出并跳入子程序隐身(让出中断)
                           CLR   A;//经典的软复位函数入口(执行1次RETI)
                           PUSH  ACC
                           PUSH  ACC
                           RETI;//_reset_()函数调用从此处跳入0x0000开始执行
/*------------------------------------------------------------------------------------------*/

MCS-51系统软复位的深入研究

 

catwill 发表于 2009-1-16 22:03 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

11楼: 呵呵,大虾透露了很多“高深武功”啊

可惜我功力尚浅,还不能理解,不过都记下了,以后慢慢参透。

还有借问一句:内部硬件WDT与外部独立WDT不一样吗?
为什么应用少呢?

我用C8051F一般就省去了外部的WDT,因为3V的器件不好找
我这里小地方,不好买。

真诚的希望您去新手园地指导一下小鸟们接地的问题!

hotpower 发表于 2009-1-16 22:15 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

12楼: 家花(内狗)不如野花(外狗)香,可路边的野花你末要采~~~

内狗一般在上电和复位时是默认关闭的.
外狗一般在管脚悬空时认为关闭,有电平信号(固定或脉冲)是开启的.

故一般外狗的喂狗引脚都上拉电阻,即不可关闭.

所以一般在高可靠应用上都是三狗(内狗,外狗,野狗(软狗))联合应用~~~

 

古道热肠 发表于 2009-1-17 10:27 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

16楼: 哈哈,有趣

不怕一万,就怕万一.
{//上电复位可认为SystemRamTest是随机且不可能为0x55aa}
万一上电时SRAM中就是55AA,您就无法复位DSP,写板型了.
要再上加强筋!

hotpower 发表于 2009-1-17 11:34 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

17楼: 关于55AA的上电概率问题

菜农首次使用55AA可能要追述到1983年左右,主要启蒙于硬盘主引导扇区的55AA.

在一个16年至今的产品中,数万台55AA出现的概率俺没见一次.

在32位ARM中俺喜欢55AA55AA, 在8/16位的MCU/DSP中俺一般使用55AA.

在一些系统中也使用长整型进行RAM上电测试.

新的MCU/ARM/DSP都配备的硬件看门狗和复位标志,但俺还是喜欢用55AA~~~

本主帖主要是一种基本应用方法及实现,真的系统要比其更可靠和复杂.

在有内狗的MCU中,实际还需外狗的冗余保护,它实际是由两层55AA保护的.

所以上电RAM出现55AA的概率几乎为零,何况工控环境几乎都是永不停机的...

hotpower 发表于 2009-1-17 15:53 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

20楼: 硬件看门狗的功能测试对批量产品很有用

尤其是外部看门狗,如813,706,1232等众多硬件看门狗芯片。
以及如74hc123等TTL芯片搭成的外狗更为重要。

因为外狗有喂狗信号引脚,它存在有连接问题,而复位脚也是如此。

这2线有1条出问题都不可,当然还有外狗的电源引脚和外围器件问题。

假若认为外狗都是好的,不附加任何检测程序及手段,那么外狗不起

作用也是从表面看不出来的。

如本主贴一样,施加检测程序后,程序上电时:

若外狗坏,某个LED常亮,如运行灯(假设正常运行时1S闪烁)
若外狗好且无喂狗信号,则LED快闪(复位期间LED灭,测试时亮)

都正常时,LED按1S规律闪烁。

故此方法从1只LED即可检测(看出)外狗是否正常。

系统分类: 单片机  |  用户分类: 看门狗专栏  |  标签: 看门狗  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(853) | 回复(0)

发表于 2006/12/30 1:57:41

1

关于投票

菜地里来了一条疯狗(中断养狗喂狗演示)

菜地里来了一条疯狗(中断养狗喂狗演示)
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,强迫硬狗复位
------------------------------------------------------------*/
}

系统分类: 单片机  |  用户分类: 看门狗专栏  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1206) | 回复(0)

发表于 2006/12/30 1:37:00

1

关于投票

与狼同舞的豺狗--中断喂狗论

与狼同舞的豺狗--中断喂狗论
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

系统分类: 单片机  |  用户分类: 看门狗专栏  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1063) | 回复(0)

发表于 2006/12/30 1:36:21

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

系统分类: 单片机  |  用户分类: 看门狗专栏  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1167) | 回复(0)

发表于 2006/12/30 1:35:16

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

系统分类: 单片机  |  用户分类: 看门狗专栏  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1272) | 回复(0)

发表于 2006/12/30 0:59:52

0

关于投票

菜农不会习文只会弄武耍大刀

hotpower 发表于 2006-3-19 03:21 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

菜农不会习文只会弄武耍大刀

任何事物的存在必然有它建立和灭亡之生存道理.

在串行通讯中,线数的组合就是"硬道理".

2的N次方的真理是不可超越的,但应用中却可用上跳和下跳来违背"真理".

串行通讯的筋骨是时钟.

按理说单线协议只能流过数据0和1.但却可以用数据的宽度再次超越"真理".

即下跳同步,低电平的宽度决定了复位,读写'1',读写'0'.

在双线协议中,肯定要用其中一线的下跳作为同步(启动)信号的,这必然要遵循串行通讯的规则.

在三/四线协议中,由于有片选信号,这样就在很大程度上减轻了通讯协议的复杂度.

付出必有回报,但付出的方式不同,故收获肯定不同.

在实际中,协议的制订和选取要根据系统的要求选择最佳的协议操作方式.

天色已晚,天亮还要耕作,以后在忽悠吧...

系统分类: 单片机  |  用户分类: 看门狗专栏  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1157) | 回复(0)

发表于 2006/12/28 22:43:52

0

关于投票

"中断喂狗论"更能掌控"程序制空权"

hotpower 发表于 2006-3-4 09:56 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

"中断喂狗论"更能掌控"程序制空权"

在"主程序喂狗论"中,最"强有的理论依据"就是---"程序跑飞了可是中断不一定会死"

而"中断喂狗论"恰恰就是利用了这个"理论依据"!!!

中断一般都有自己固定不变的中断向量地址,这样即使主程序飞,中断也能正确地跳入自己的轨道继续运行.

如果每个其他事件即程序模块都设置一个"执行标志",即执行过后都设置此标志.

那么,在定时(节拍)中断中,可以从这些"执行标志"掌握程序的运行状况,达到检控的目的.

若全部模块正常运行,则清除全部标志,否则,进行硬件复位(不喂狗)或软件复位(在没硬件看门狗时或需要立即复位时).

由于各模块的运行周期不定,喂狗中断可以灵活掌握.

"中断喂狗论"和"主程序应答喂狗论"(不同于乱喂)效果基本相同,都能达到同样的目的,但是它的喂狗周期不定,在低功耗的系统中,主循环的喂狗检测较耗电.
而且主循环飞后只能期待硬件看门狗的复位了,故一般用在有硬件看门狗的系统中.而前者可用于有无硬件看门狗的系统中(当然要保证定时器及中断不能被关闭,一般在主循环中刷新中断配置较好).

当然,"中断喂狗论"要耗损一些在中断中的时间,但在定时(节拍)中断中,是很短暂的,基本不影响系统的性能.
http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?v=&ID=1998935

系统分类: 单片机  |  用户分类: 看门狗专栏  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1177) | 回复(0)

发表于 2006/12/28 1:53:18

1

关于投票

何处喂或如何喂都不重要,重要地是对异常的捕捉能力

 

何处喂或如何喂都不重要,重要地是对异常的捕捉能力
雁塔菜农 发表于 2006-12-28 1:50:00
IceAge 发表于 2006-12-27 23:52 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

35楼: 这样的问题智者见智,N驳没有必要啊

看问题的角度不一样,结论就会不一样。同样,程序的设计结构不一样,喂狗的方式就不一样。那位中断喂狗缺点论的老兄可能只是思路狭隘,没有想到还有其他不同的甚至更好的结构,同样,我们自认为更好的结构,难道就不会在别人的眼里认为不值一提么?
主程序+中断是最流行的mcu结构,我们看到的例程几乎都是这种结构,所以在主程序中喂狗就顺理成章,主程序与中断之间的关系也就缠绕在一起,难分难解,这也是何处喂狗的难题所在,除非你能说服别人放弃这种结构,否则无法使人放弃中断喂狗缺点论。

这种问题争论有益,但不会有结果。


hotpower 发表于 2006-12-28 01:39 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

36楼: 还是IceAge高论~~~

本想再论,无奈硬盘格式化才完毕,真倒塌了~~~
说实话在何处喂或如何喂都不重要,重要地是对异常的捕捉能力.

像fsaok同志开的玩笑很搞笑:"近日有朋友说,外狗比内狗好,因为晶振停了,外狗还会起作用,又有人说,既然晶振停了,那狗叫还有什么意义?
"
实际他为我们解答了1个问题:
主程序喂狗,中断(管理程序入OS的定时中断)跑飞.主程序"正常"有何用???
中断喂狗,主程序跑飞,中断程序"正常"又有何用???

所以必须两者都能保证正常且互相检测才能提高(没人敢保证万无一失,像邓苗同志的高境界很少人能达到~~~).

我模拟的2种喂狗方式在程序飞时的表现基本说明了单一喂狗方式的危害性.

大家可能都编过或用过PC级的软件,程序发生异常是不可避免的,否则美国鬼子再N航天飞机也要落地,也要推后发射.

但是提高对异常的捕捉和处理能力才是我们最后需要解决的议题.

养狗不是为了咬人,更不是为了害人.

设备在运行时没人愿意让看门狗复位!!!即使事后你向老板说"这是由于干扰造成的系统(看门狗)复位".
当老板的和当领导的没工夫听你说,用户更让你先闭着嘴~~~

所以我们在编程序时应当考虑到任何所能出现的问题,哪怕连鬼都不相信会出现的问题我们都要考虑周到!!!

我们应该如何去检测可能发生的异常,在异常发生后且捕捉后用什么容错方法去"遮住老板的眼睛"~~~

在好些系统中,采用内狗中断外狗复位的方法来拦截异常的发生.使异常带来的损失降为最小.

"狗论"也论的差不多了,就如IceAge说的再争论N多年也和梁山的军师---无用~~~

系统分类: 单片机  |  用户分类: 看门狗专栏  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1126) | 回复(0)

发表于 2006/12/26 22:45:46

2

关于投票

LPCARM中断喂狗正确方法及异常模拟裸奔程序详解

祥见:http://blog.21ic.com/user1/46/archives/2006/33384.html

LPCARM中断喂狗正确方法及异常模拟裸奔程序详解
雁塔菜农 发表于 2006-12-26 21:36:00
/*-----------------------------------------------------------------------------------------------------------
          LPCARM中断喂狗正确方法及异常模拟裸奔程序详解(别名ARM疯狗)
雁塔菜农HotPower   2006.12.26 21:32   于菜地Http://HotPower.21ic.org/
------------------------------------------------------------------------------------------------------------*/
#i nclude  //ARM菜鸟HotPower创建定义文件(最新为倒塌版)
/*---------------------------------------------------------------------------------
注意:(今天是菜农时代伟人的113年诞辰日,特发此帖!!!)
  (姊妹篇--LPCARM主程序喂狗正确方法及异常模拟裸奔程序详解)---随后发布
菜农累了,不想多费口舌,先自己看明白吧。欢迎拍砖有利于菜农进一步改进
 
LPC213XDEF.H文件请在user1/46/archives/2006/16994.html下载
可将LPC213XDEF.H拷贝到Keil\ARM\INC\PHILIPS目录下
点击下栽本裸奔程序详解完整包:uploadfile-/2006-12/1226389582.rar
----------------------------------------------------------------------------------*/

系统分类: ARM  |  用户分类: 看门狗专栏  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1254) | 回复(0)

发表于 2006/12/26 22:44:42

2

关于投票

LPCARM主程序喂狗正确方法及异常模拟裸奔程序详解

祥见:http://blog.21ic.com/user1/46/archives/2006/33387.html

LPCARM主程序喂狗正确方法及异常模拟裸奔程序详解
雁塔菜农 发表于 2006-12-26 22:31:00

/*----------------------------------------------------------------------------------
          LPCARM主程序喂狗正确方法及异常模拟裸奔程序详解
雁塔菜农HotPower   2006.12.26 21:32   于菜地Http://HotPower.21ic.org/
----------------------------------------------------------------------------------*/
#i nclude  //ARM菜鸟HotPower创建定义文件(最新为倒塌版)
/*---------------------------------------------------------------------------------
注意:(今天是菜农时代伟人的113年诞辰日,特发此帖!!!)
  (姊妹篇--LPCARM中断喂狗正确方法及异常模拟裸奔程序详解)---以先期发布
菜农累了,不想多费口舌,先自己看明白吧。欢迎拍砖有利于菜农进一步改进


LPC213XDEF.H文件请在user1/46/archives/2006/16994.html下载
可将LPC213XDEF.H拷贝到Keil\ARM\INC\PHILIPS目录下
点击下栽本裸奔程序详解完整包:uploadfile-/2006-12/1226664240.rar

----------------------------------------------------------------------------------*/

系统分类: ARM  |  用户分类: 看门狗专栏  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1178) | 回复(0)

发表于 2006/12/25 23:14:28

2

关于投票

N驳"中断喂狗缺点论"

hotpower 发表于 2006-12-25 22:58 侃单片机 ←返回版面    

楼主: N驳"中断喂狗缺点论" 


    20余年一直为中断喂狗是否正确而争论不休,实际很没意思,因为这种人根本就不知道人们
为什么要养此“宠物”。

现引用今天在博客中看到的一篇文章:
-------------------------------------------------------------------------------------

喂狗 
主程序中喂狗的优点:
   系统资源占用少;
   简单;
缺点:
   1.要保证你的主程序不会进入死循环,而且死循环中又有喂狗的情况;
   2.要保证1.6S至少被调用一次,要保证所有可能的正常运行时,都能正常喂狗,
     但是有不能在主循环中加过多的喂狗指令,以免出现1那样的情况;
  

任务中喂狗:
    一定要保证在正常情况下,1.6S内该任务至少被调用一次


中断喂狗:
     缺点: 在系统进入一个不正常的循环时,中断喂狗仍然起作用,看门狗失去它本来的作用
                    系统资源占用比较多 
-------------------------------------------------------------------------------------

真倒塌了!!!看后气的肚子痛。(对事不对人!!!)

  “喂狗”是我们这个圈子里人的“黑话”,外行可能以为我们在骂架...它实际上是在看门狗
定时器溢出前对其进行的一次复位操作,以迫使看门狗定时器复零,以避免错误的系统复位。
    豢养此“宠物”的目的是在程序跑飞时,为使损失降低到最小极限而“异想天开”设立的。
它的看家能力的总概率应该评估为50%. 如文章中的“1.要保证你的主程序不会进入死循环,
而且死循环中又有喂狗的情况;”实际以承认了这点。故养狗也不能100%地放心。
    文章将喂狗分为3种,实际应该为2种,因为“任务中喂狗”不应该再包含在“主程序中喂狗”
中,而在OS中的任务实际由定时中断激活的,虽然它的级别和在主程序一样,但还应该归“中断
喂狗”。
    这样就归类为网上长期争论不休的2种喂狗方法。即“主程序喂狗论”和“中断喂狗论”。
实际上2种方法都有缺点!!!        
    “主程序喂狗论”提出:  在系统进入一个不正常的循环时,中断喂狗仍然起作用,看门狗
                    失去它本来的作用。
    “中断喂狗论”也可提出:在系统运行一个很正常的循环时,主程序喂狗在起作用,看门狗
                    保持它本来的作用。但是在中断被意外关断不能有效工作时,主程序“正常”
                    有何实际意义???
    为什么要叫“狗”呢???因为狗记路是靠撒尿的~~可能菜农说话粗鲁~~~

当程序经过某处时,要置标志说明程序已在此处运行过,如狗撒尿一般。

通常在主循环即后台的某处设置一标志(俗称软狗标志),在中断(一般在定时器)即前台的某处
检测此软狗标志,若有则认为主程序此时运行正常,否则不喂狗直到狗咬人(复位)。
反之也可在前台设置软狗标志,在后台真正喂狗。

这种方法是前后台依据软狗标志互相沟通以达到正确而有效的喂狗目的。
而此种方法的中断喂狗一般用于低功耗的系统中,它的优点是喂狗周期固定,而且很容易做到在
一处真正喂狗。
此种方法的主循环喂狗的缺点是喂狗周期相对不固定,有可能需要多处喂狗。

真倒塌了~~~真不知道我在网上是几驳"中断不能喂狗论"了~~~

大家圣诞愉快~~~

系统分类: 单片机  |  用户分类: 看门狗专栏  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1533) | 回复(1)

Total , Page /