#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数据区后会发生什么,只有天知地知.
而你我都不知的...
不知我是否表述明白...
|
|
|
|
文章评论(0条评论)
登录后参与讨论