虽然循环表现出乎意料

时间:2014-04-21 19:42:21

标签: c++ c msp430

我不确定这个问题是否是特定于编译器的,但我还是会问。我正在使用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保持开启且不闪烁,而在第二个例子中,它按计划工作。

我认为它与编译器完成的某些优化有关,但我不知道具体可能是什么错误。

2 个答案:

答案 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关键字声明变量,然后就完成了。