只在疯狗里加了2句,PICC菜鸟就从黄河里飞起来了!!! 看来现在是PICC菜鹅了!!!(鹅毛不沾水嘛)
#include <pic.h> /*-------------------------------------------------------- PIC疯狗演示程序(HotPower@126.com) ---------------------------------------------------------*/ 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 (;;) //主循环(不运行任何程序,所有程序都在中断中处理) { //打补丁,为非典不保护STATUS付出的代价!!! STATUS = 0;//消除PICC优化的bug!!!否则下句不知置哪个bankxSystemFlag.Bit.Wdt = 1; //"PICC优化的bug"实际是"非典"给C编译器优化出的难题,但可以看出疯狗的作用 //PIC优化的主要任务之一就是优化banksel //从这个"bug"中可以看出PIC并非是真正的"单指令集" SystemFlag.Bit.Wdt = 1;//喂软狗(置标志) T0IE = 1;//开放TMR0中断 ei();//打开总中断开关(ISR中断退出后由于没保护STATUS,所以不知在哪个bankx) } }
#pragma regsused//中断时不保护任何寄存器(regsused后未跟保护寄存器),若加此条伪指令,则必须加补丁语句STATUS = 0;否则被狗咬!!! //#pragma regsused w//中断时只保护w //#pragma regsused status//中断时只保护status //上2条伪指令编译都一样,可以去掉那条补丁语句STATUS = 0;因为都保护了status 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 {//如果主循环中没有STATUS = 0;在此将被此疯狗捕捉!!! //di();没必要,它是从51疯狗中直接照般过来的,在PIC中没多大作用,PIC会自动di(); di();//不要命的把STATUS = 0;屏蔽掉,就会被疯狗咬到此处!!! /*------------------------------------------- 程序飞捕捉 --------------------------------------------*/ PCLATH = 0; PCL = 0;//goto main软件复位 } /*------------------------------------------- 在此加入TMR0中断服务 --------------------------------------------*/ } if (TMR1IE && TMR1IF) //判TMR1 中断 { TMR1IF = 0; //清除TMR1 中断标志 /*------------------------------------------- 在此加入TMR1中断服务 --------------------------------------------*/ } /*------------------------------------------- 其他任务处理 --------------------------------------------*/ }//中断结束并返回
反汇编列表入口地址0x0004处...哈哈...)
78: #pragma regsused//中断时不保护任何寄存器(regsused后未跟保护寄存器) 79: //#pragma regsused w//中断时只保护w 80: void interrupt ISR(void) //中断服务程序 81: { 82: if (T0IE && T0IF) //判TMR0中断 000004 1A8B BTFSC 0xb, 0x5 000005 1D0B BTFSS 0xb, 0x2 000006 281B GOTO 0x1b 83: { 84: T0IF = 0; //清除TMR0 中断标志 000007 110B BCF 0xb, 0x2 85: TMR0 = -80;//为方便演示,随便设个值 000008 30B0 MOVLW 0xb0 000009 1283 BCF 0x3, 0x5 00000A 1303 BCF 0x3, 0x6 00000B 0081 MOVWF 0x1 86: if ((SystemFlag.Bit.Wdt) && (RamTest == 0x55aa)) { 00000C 1F21 BTFSS 0x21, 0x6 00000D 2818 GOTO 0x18 00000E 0823 MOVF 0x23, W 00000F 3A55 XORLW 0x55 000010 30AA MOVLW 0xaa 000011 1903 BTFSC 0x3, 0x2 000012 0622 XORWF 0x22, W 000013 1D03 BTFSS 0x3, 0x2 000014 2818 GOTO 0x18 87: /*------------------------------------------------------- 88: 主循环中若清过软狗定时器且内存没被破坏,才能喂狗 89: --------------------------------------------------------*/ 90: CLRWDT();//在此喂这条到处挨骂的疯狗!!! 000015 0064 CLRWDT 91: SystemFlag.Bit.Wdt = 0;//清除软狗定时器(清标志) 000016 1321 BCF 0x21, 0x6 92: } 000017 281B GOTO 0x1b 93: else { 94: di(); 000018 138B BCF 0xb, 0x7 95: /*------------------------------------------- 96: 程序飞捕捉 97: --------------------------------------------*/ 98: PCLATH = 0; 000019 018A CLRF 0xa 99: PCL = 0;//goto main软件复位 00001A 0182 CLRF 0x2 100: } 101: /*------------------------------------------- 102: 在此加入TMR0中断服务 103: --------------------------------------------*/ 104: } 105: if (TMR1IE && TMR1IF) //判TMR1 中断 00001B 1683 BSF 0x3, 0x5 00001C 1C0C BTFSS 0xc, 0 00001D 0009 RETFIE 00001E 1283 BCF 0x3, 0x5 00001F 180C BTFSC 0xc, 0 106: { 107: TMR1IF = 0; //清除TMR1 中断标志 000020 100C BCF 0xc, 0 108: /*------------------------------------------- 109: 在此加入TMR1中断服务 110: --------------------------------------------*/ 111: } 112: /*------------------------------------------- 113: 其他任务处理 114: --------------------------------------------*/ 115: }//中断结束并返回 000021 0009 RETFIE
|
|
文章评论(0条评论)
登录后参与讨论