打印
[AVR单片机]

IAR AVR 编译问题。

[复制链接]
1623|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dudongdao|  楼主 | 2008-10-17 18:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

从ICC移值过来的程序~  到了IAR不正常,把所有优化都去掉,还是不正常。
C程序是
void ProcessCommuData(void)
{

if(m_st_Commu.u8GetDataOk == 1)//    
{
    if(m_st_Commu.u8RecData[1] == (~m_st_Commu.u8RecData[0]))//看是否正确接收了数据
        {
            //更新压缩机等状态标志
            m_st_SysControl.u8JudgeBit &= 0xe0;
            m_st_SysControl.u8JudgeBit |= m_st_Commu.u8RecData[0]&0x1f;
            //m_st_SysControl.u8JudgeBit = 0xfe;
        }
        m_st_Commu.u8GetDataOk = 0;//数据处理完毕
    }
}
对应编译后的少了一些东西,里面判断是否接收正确的句子和里面的语句都没执行。实验了乱改改,比如把
IF语句去掉,可以,或者把IF的判断相等改成判断不相等也可以,能正常运行,看了编译文件,也能正常编译。这是为什么呢,请有经验的同志指点。

                                 In segment CODE, align 2, keep-with-next
      __nearfunc __version_3 void ProcessCommuData()
                        ProcessCommuData:
      00000000   9100....           LDS     R16, (m_st_Commu + 7)
      00000004   3001               CPI     R16, 1
      00000006   F419               BRNE    ??ProcessCommuData_0
      00000008   E000               LDI     R16, 0
      0000000A   9300....           STS     (m_st_Commu + 7), R16
                        ??ProcessCommuData_0:
      0000000E   9508               RET

                                    In segment CODE, align 2, keep-with-next
      __nearfunc __version_3 void a2dSetChannel(unsigned char)
                        a2dSetChannel:

相关帖子

沙发
ATmega32L| | 2008-10-17 23:19 | 只看该作者

根据C语言标准,~运算有整型提升

楼主注意一下,~运算有整型提升,这是C语言标准。

对于8位机AVR:
~0xff 的值不是0x00,而是0xff00


    if(m_st_Commu.u8RecData[1] == (~m_st_Commu.u8RecData[0]))
改成:
  if(m_st_Commu.u8RecData[1] == (unsigned char)(~m_st_Commu.u8RecData[0]))
试试。

使用特权

评论回复
板凳
dudongdao|  楼主 | 2008-10-18 16:28 | 只看该作者

太感谢了~ 果然如此~

   这个是标准C里的规定吗~  我用ICCAVR弄的时候就没这个问题,谭浩强的那本书里讲这个规则了吗,看来还得继续看看C语言了。

使用特权

评论回复
地板
yewuyi| | 2008-10-18 17:26 | 只看该作者

俺最讨厌使用~这个符号。。。

俺都直接写a^0xff或者a^0xffff 。。。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

413

帖子

1

粉丝