英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

标题: 主程序和中断程序调用同一个函数,在主程序调用前用di()后 [打印本页]

作者: winnie    时间: 2009-4-26 10:58
标题: 主程序和中断程序调用同一个函数,在主程序调用前用di()后
环境:PICMATE2002 V3.3  HT-PICC8.05PL  pic16f877
问题:编译时出现“function _Parity appear in multiple call graghs:  rooted at_Service and _main”
        这似乎提示Parity函数被主程序和中断程序有调用冲突,但是我在主函数调用Parity函数
之前用了di(); (用GIE=0;也一样)屏蔽了中断,可是还是出现同样的编译错误。

(void)main(viod)
{
               ---
              SCI_Transmit(0x68)
              ---
}

void  SCI_Transmit(uchar data)
{
            if(RCEND)
            {
   
                          SCI_Initial();
                          di();
                          TX9D=Parity(0x68);
                          ei();
             }

           TXREG=data;
           TXEN=1;
}
void interrupt Service(void)
{   
            ---
           Parity(RCREG);
           ---
}
bit Parity(uchar data)   
{
          uchar i;

          PAEV=0;
         for(i=8;i>0;i--)
         {
                     if(data&0x80){PAEV=!PAEV;}
                     data=data<<1;     
          }
           return(PAEV);
}
作者: winnie    时间: 2009-4-26 10:59
此时必须保证主函数和中断函数不会在同一时刻调用同一个非中断函数。通常,可以通过在调用函数前屏蔽总中断,以达到上述目的;在被调函数内屏蔽中断是不可行的.”这说明在主函数在调用非中断函数前加“di();”在调用之后加“ei();”应该可以的




欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://www.enroobbs.com/) Powered by Discuz! X3.2