原创 PICC菜鸟费了2小时功夫终于从黄河里飞起来了!!!

2006-12-28 23:02 5732 13 13 分类: MCU/ 嵌入式


PICC菜鸟求助(不直接寻址):如何使中断程序不保护现场?
mood25.gif hotpower 发表于 2004-11-6 11:32 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴


张工及二斑竹和各位大侠:

我有个程序需要这样,由于我的程序都在中断中完成,而PIC(我用中档MCU)又是一个中断向量,所以中断现场的保护和恢复实在没用,而且都是些废指令.

请教: 用PICC如何使中断程序不保护现场?(最好不用汇编,能通过什么编译开关就最好了)

先谢谢大家了!


* - 本贴最后修改时间:2004-11-6 11:37:16 修改者:hotpower
* - 修改原因:*





签名:


●█〓██▄▄▄▄▄▄ ●●●●●●→
▄▅██████▅▄▃▂ 灌水入坛,传播非典!
██████████████
◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤




在几个PIC坛子都求助无果,只好求助张工了!!!
mood25.gif hotpower 发表于 2004-11-6 20:53 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴


不知张工有空否,哪怕5分钟,或说:"如果你是用PICC写的,那自动保护的,不想保护也难."之类的话,我就不再期待了...

看来我这样的用途PICC肯定没有,因为他不会照顾1/10**1023的要求...



确实没有
mood25.gif 张明峰 发表于 2004-11-7 11:04 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴


至少W和STATUS将会自动保护。



谢谢张工,这就死心了
mood25.gif hotpower 发表于 2004-11-7 11:29 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴


好象天下的MCU的C编译器中断程序都会自动保护...我心里很明白...

别的我肯定要保护的,只有PIC想例外...

非常感谢!!!!!!!!


也是因为Hotpower老兄太“邪”了
mood25.gif 张明峰 发表于 2004-11-8 10:15 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴


一天到晚传播“非典”型应用。---怕害了小辈。







见到了黄河心还跳着
mood25.gif hotpower 发表于 2004-11-8 13:06 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴


再研究研究...心不甘呀...


 



PICC菜鸟费了2小时功夫终于从黄河里飞起来了!!!
mood25.gif hotpower 发表于 2004-11-8 22:01 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴


只在疯狗里加了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




 



PICC菜鹅自辩
mood25.gif hotpower 发表于 2004-11-11 00:01 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴


1.就本帖的"技术水准"从今起PICC菜鸟变成了PICC菜鹅.

2.本帖的主题是如何使中断程序不保护现场?
  而非是否合理或如何定罪.

3.已声明本帖为--少儿不宜之帖.

4.既然我已给出"辩护"程序的正解,肯定自有用途...

5....

PARTNER CONTENT

文章评论0条评论)

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