winnie 发表于 2009-4-26 10:58:50

主程序和中断程序调用同一个函数,在主程序调用前用di()后

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

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

voidSCI_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:00

此时必须保证主函数和中断函数不会在同一时刻调用同一个非中断函数。通常,可以通过在调用函数前屏蔽总中断,以达到上述目的;在被调函数内屏蔽中断是不可行的.”这说明在主函数在调用非中断函数前加“di();”在调用之后加“ei();”应该可以的
页: [1]
查看完整版本: 主程序和中断程序调用同一个函数,在主程序调用前用di()后