我不确定这个问题是否是特定于编译器的,但我还是会问。我正在使用CCS(Code Composer Studio),这是一个来自德州仪器的IDE,用于对MSP430微控制器进行编程。
像往常一样,我正在制作使LED闪烁的初学者程序,它位于P1OUT寄存器的最后一位。这是不起作用的代码(我省略了其他一些无关的声明):
while(1){
int i;
P1OUT ^= 0x01;
i = 10000;
while(i != 0){
i--;
}
}
现在,这是可行的循环:
while(1){
int i;
P1OUT ^= 0x01;
i = 0;
while(i < 10000){
i++;
}
}
这两个陈述应该是等价的,但在第一个例子中,LED保持开启且不闪烁,而在第二个例子中,它按计划工作。
我认为它与编译器完成的某些优化有关,但我不知道具体可能是什么错误。
答案 0 :(得分:3)
代码可能正在作为死代码进行优化。你不想这样旋转,它在CPU周期上非常浪费。您只想致电usleep
,例如:
#include <unistd.h>
int microseconds = // number of 1000ths of milliseconds to wait
while(1){
P1OUT ^= 0x01;
usleep(microseconds);
}
答案 1 :(得分:0)
CCS可以以您从未预料到的方式优化代码(还可以检查项目属性中的优化级别)。最简单的方法是使用volatile关键字声明变量,然后就完成了。