微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > PIC XC8 编译时将一些语句丟了,有可能是什么问题?

PIC XC8 编译时将一些语句丟了,有可能是什么问题?

时间:10-02 整理:3721RD 点击:
各位大侠,小弟最近刚刚接触PIC的编程,使用XC8对源代码进行编译运行调试时,不止一次发现,有一些有用的代码被编译器忽略掉了。如下例:
源码:
while(1)
{
    RC4 = 0;
    RC3 = 1;
    NOP(); NOP();
    // 在 SCL 高电平时,SDA 由低拉高,产生Stop 信号
    RC4 = 1;
    NOP(); NOP();
    // End of 发送 Stop 信号
    RC3 = 0;
}
XC8编译后的代码,在Proteus 仿真时单步执行是的显示:
--------    while(1)
--------    {
--------       RC4 = 0;                <----------- 这一句被去掉了
045D          RC3 = 1;
045E           NOP(); NOP();
--------
--------      // 在 SCL 高电平时,SDA 由低拉高,产生Stop 信号
0460          RC4 = 1;
0463          NOP(); NOP();         <---------- 为什么这一步的地址是0463, 而不是0461
--------      // End of 发送 Stop 信号   
--------
0465         RC3 = 0;
--------   }
RC4 = 0; 这一句被去掉了,单步执行时这一句被跳过不执行,导致程序逻辑的错误。
我不知道这是不是 XC8 在做优化的时候出的问题(我用的是经过破解的XC8)。但为什么会出现这样的问题,
请各位指教!

小弟初来乍到,积分不多,多多见谅。多谢多谢。

补充一下乱试的结果。 如果在循环的开始处加入一个 NOP();  XC8会将这一句删掉,后面的就对了,如下所示:
--------    while(1)
--------    {
--------         NOP();               ------> 被去掉了。
0490          RC4 = 0;              
0493          RC3 = 1;
0494           NOP(); NOP();
--------
--------      // 在 SCL 高电平时,SDA 由低拉高,产生Stop 信号
0496          RC4 = 1;
0499          NOP(); NOP();         
--------      // End of 发送 Stop 信号   
--------
049B         RC3 = 0;
--------   }
但并不是每个循环中的第一语句都会被如此处理。 那么XC8内在的处理机制是什么呢?

可能是被IDE优化掉了,其它编译软件也有类似的问题。具体你再查一下吧。希望能帮到你。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top