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

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 3655|回复: 1
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2009-4-26 10:58:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
环境: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);
}
2#
 楼主| 发表于 2009-4-26 10:59:00 | 只看该作者
此时必须保证主函数和中断函数不会在同一时刻调用同一个非中断函数。通常,可以通过在调用函数前屏蔽总中断,以达到上述目的;在被调函数内屏蔽中断是不可行的.”这说明在主函数在调用非中断函数前加“di();”在调用之后加“ei();”应该可以的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-12-25 09:00 , Processed in 0.051990 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表