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)。但为什么会出现这样的问题,
请各位指教!
小弟初来乍到,积分不多,多多见谅。多谢多谢。
源码:
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优化掉了,其它编译软件也有类似的问题。具体你再查一下吧。希望能帮到你。