原创 对张工"无论如何,不能在中断服务程序中清看门狗"有意见

2007-1-16 00:28 6163 10 10 分类: MCU/ 嵌入式
HotPower 发表于 2004-9-18 22:02 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

对张工"无论如何,不能在中断服务程序中清看门狗"有意见


#include <pic.h>
/*--------------------------------------------------------
              PIC疯狗演示程序(HotPower@126.com)
“论据”见菜地里来了一条疯狗(中断养狗喂狗演示)
http://www.21icbbs.com/club/bbs/showEssence.asp?id=5384

张工见笑了...我不怕挨骂...因为我有很多"论据"可述...
---------------------------------------------------------*/
persistent unsigned int RamTest;//内存自检标志

void SystemInit(void);
void SystemIoInit(void);
void SystemTmrInit(void);

union {
  struct {
    unsigned b0: 1;
    unsigned b1: 1;
    unsigned b2: 1;
    unsigned b3: 1;
    unsigned b4: 1;
    unsigned b5: 1;
    unsigned Wdt: 1;//软件疯狗
    unsigned Work: 1;
  }Bit;
  unsigned char Bits;
}SystemFlag;//系统标志

typedef struct Systemstruct{//系统数据结构
  unsigned char T0Count;
}SystemData;

SystemData SystemBuffers;//申请系统数据结构

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


void SystemInit(void)
{
  SystemBuffers.T0Count = 0;
  SystemFlag.Bits = 0;
  if (RamTest != 0x55aa) {//内存被破坏
/*-------------------------------------
    系统上电初始化
--------------------------------------*/
    RamTest = 0x55aa;
  }
  SystemIoInit();
  SystemTmrInit();
}

void SystemTimerInit(void)
{
  OPTION = 0x08;
}

void SystemIoInit(void)
{
  TRISA = 0b11111111;
  PORTA = 0b00000000;
}

void SystemTmrInit(void)
{
  TMR0 = -80;//为方便演示,随便设个值
  T0CS = 0;//TMR0工作于定时器方式
  PSA  = 1;//TMR0不用分频
}

void main(void)
{
  SystemInit();//系统初始化
  for (;;) //主循环(不运行任何程序,所有程序都在中断中处理)
  {
    SystemFlag.Bit.Wdt = 1;//喂软狗(置标志)
    T0IE = 1;//开放TMR0中断
    ei();//打开总中断开关
  }
}

void interrupt ISR(void) //中断服务程序
{
  if (T0IE && T0IF) //判TMR0中断
  {
    T0IF = 0; //清除TMR0 中断标志
    TMR0 = -80;//为方便演示,随便设个值
    if ((SystemFlag.Bit.Wdt) && (RamTest == 0x55aa)) {
/*-------------------------------------------------------
    主循环中若清过软狗定时器且内存没被破坏,才能喂狗
--------------------------------------------------------*/
      CLRWDT();//在此喂这条到处挨骂的疯狗!!!
      SystemFlag.Bit.Wdt = 0;//清除软狗定时器(清标志)
    }
    else {
      di();
/*-------------------------------------------
    程序飞捕捉
--------------------------------------------*/
      PCLATH = 0;
      PCL    = 0;//goto main软件复位
    }
/*-------------------------------------------
    在此加入TMR0中断服务
--------------------------------------------*/
  }
  if (TMR1IE && TMR1IF) //判TMR1 中断
  {
    TMR1IF = 0; //清除TMR1 中断标志
/*-------------------------------------------
    在此加入TMR1中断服务
--------------------------------------------*/
  }
/*-------------------------------------------
   其他任务处理
--------------------------------------------*/
}//中断结束并返回


 



张明峰 发表于 2004-9-19 21:22 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

差不多啦


老兄你能在主循环定期设“SystemFlag.Bit.Wdt=1”,若把它换成“CLRWDT()”,中断中不是就不必清WDT了吗?

 



hotpower 发表于 2004-9-20 00:50 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

张工: 我认为两者差距很大


首先,我给出的疯狗演示已经过"数学"论证,"无论如何,不能在中断服务程序中清看门狗"这句话欠妥.
其次,两者差距很大.
设主循环喂狗为A,中断喂狗为B.

A: 当中断被异常关闭后,主循环就会永远瞎喂!!!
   系统看似正常但实际与死机一样.
   故必须在喂狗的同时还需监视定时器是否正常工作才行...
   而且捕捉异常的能力也较差...
   我感到...真的活着比死了还难受...
B: 当主程序发生异常后,若定时器还能中断后会立即捕捉到异常发生.
   "疯狗论"主要依据两个"中断向量"(1.主循环喂软狗地址.2.定时器中断向量)
   由于他们的地址固定不变,故异常发生后是不会执行到此处的.
   软硬狗联合作战,协同掩护,共同看家...


再: 我准备请教张工几个PICC的问题(几个疑惑).
    我是PICC"法盲",因为那几个疑惑,使我一直在用汇编.(当然是HPL)

张工见笑了...我希望能讨论真正的技术问题,而非...


xieyuanbin 发表于 2004-9-20 12:00 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

部分同意hotpower


在PIC中,不存在数据被当作指令的可能,所以在中断中判断主程序中是否清狗没有必要,如果在主程序中不能按时清狗那程序本身就不正常,有死循环的可能,如果软件没有问题,那么不管跑飞到主程序中的哪一段都可恢复,跑到无程序的地方,最终也能跑回来。
所以在这里提中断中喂狗没多大意义。但这个议题在其它“冯.诺依曼”结构的MCU中是很有必要。



HotPower 发表于 2004-9-20 13:06 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

张工: 我准备有空在本坛散布一些歪理邪说,请见谅


xieyuanbin:
  您说的"在PIC中,不存在数据被当作指令的可能"有些欠妥...
再者,"不管跑飞到主程序中的哪一段都可恢复,跑到无程序的地方,最终也能跑回来。"也...

真要能做成这样,PIC真成了"火星人"做的MCU了...

程序分页,实际就是一种"病毒"...它是以上2条欠妥语的最大祸根之所在...

有空再论证...

请张工及xieyuanbin见谅...


张明峰 发表于 2004-9-20 13:10 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

同意Hotpower的论述


原谅我说的太绝对了,向老兄你的这种做法是可靠的,因为虽然在中断里喂狗,但不是漫无目的的喂。我主要针对那些在定时中断直接喂狗的设计而言。

欢迎讨论。

xieyuanbin 发表于 2004-9-20 13:18 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

多谢HOTPOWER。


世界之大,无奇不有,我还没碰到这种情况,什么时候HOT兄有空,吾等愿洗耳恭听。

HotPower 发表于 2004-9-20 13:36 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

疯狗之"精狗肉"难于言表


主程序"轻描淡写"的一句喂软狗,"狗肉味"很浓郁...
其一,省去了主程序多任务过长需各任务喂狗的烦恼...
其二,免去了主程序多任务过长需各任务检查定时器正常的忧愁...
其三,简化了主程序发生异常后的异常捕捉处理...
其四,主程序只有主循环没有任务,任务都移入中断中的做法,对于低功耗系统有利,且对抗干扰更有利...
其XX......................

xieyuanbin: 我说的那2条您会想明白的...

该上班了,有空再聊...


xieyuanbin 发表于 2004-9-20 16:21 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

狗肉汤香鲜浓郁


我想了解一下您是否碰到在什么情况下PIC里面数据有可能被当作指令?


张明峰 发表于 2004-9-20 16:33 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

我也有疑问


看Hotpower老兄提供的C例程还是有51的影子。主程序什么事都不做,全部靠中断响应,是PIC编程的大忌(个人体会)。至于对低功耗有利,对抗干扰有利,我也不同意。难道一条重复的"goto"指令比"mov"指令省电?

HotPower 发表于 2004-9-20 20:52 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

让张工见笑了


"C例程还是有51的影子"--非也,我是针对各种编程手法的综合考虑.
说到影子,其实这个C例程是我PICC的"处女作"...

一个PICC的"法盲"能写成这样就将就着吧...

但有一点,张工说的很对!--"全部靠中断响应,是PIC编程的大忌"

何也???
因为在PIC中低档MCU中,一般只有一个中断向量,而非每个中断一个.
这样,当进入中断服务程序后,就不得不"分检",而非51等的"特快专递"!!!

虽有大忌,但在相对"低速"并能"忍受"时,合理地编排"中断优先级"可使这个"大忌"变为"小忌",甚至变成"张无忌"!!!

至于低功耗和抗干扰,那是后话,肯定这个例程做不到!!!


HotPower 发表于 2004-9-20 23:18 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

xieyuanbin: 我们好像偏离主题方向了,不知楼主有何感受


"在什么情况下PIC里面数据有可能被当作指令?"

在887A等中档机中,如果我没记错的话,应该有一条dw指令.

这也证明PIC的数据并非只能由retlw读取.

而dw中的数据宽度应该与指令宽度相同,这与51中的db指令有何不同???

无非51有movc指令,而pic中档机无类似指令.

但可以用函数ReadFlash()或WriteFlash()进行在线读写.

我是PICC法盲,不知有无这2个函数,但我相信自己能用汇编做出来,PICC应该也难不倒我...

再例PIC低档机如12c508a/509a中,常用dw做"电子标签"...

可能我不用再说下去了吧...程序异常后飞入dw数据区后会发生什么,只有天知地知.

而你我都不知的...

不知我是否表述明白...
PARTNER CONTENT

文章评论0条评论)

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