内部for循环被忽略

时间:2016-07-05 17:43:52

标签: c msp430

我正在试用MSP-EXP430G2的教程,使用Code Composer Studio使LED闪烁。最初,它有一个无限循环闪烁:

   for(;;)
    // This empty for-loop will cause the lines of code within to loop infinitely

        {

            P1OUT ^= 0x01;
    // Toggle P1.0 using exclusive-OR operation (^=)

    // P1OUT is another register which holds the status of the LED.
    // '1' specifies that it's ON or HIGH, while '0' specifies that it's OFF or LOW
    // Since our LED is tied to P1.0, we will toggle the 0 bit of the P1OUT register

            for(i=0; i< 20000; i++);

    // Delay between LED toggles. This for-loop will run until the condition is met.
    //In this case, it will loop until the variable i increments to 20000.
        }
    }

这是从教程中复制和粘贴的,它按预期工作。然后我想看看是否可以将它变为有限循环,所以我将for循环更改为:

for (j = 0; j<10; j++)

在代码中先前声明了j。但是,LED不再闪烁,当我使用调试器逐步执行程序时,它现在完全跳过for(i=0; i< 20000; i++);行。这仅在我设置j&lt; 10条件时发生,但如果我将其设置为j> -1,则不会发生。当我从10到0进行递减循环时会发生同样的问题,这使我认为只有在循环变为有限时才会发生。

我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:5)

允许编译器优化远离代码而没有副作用。计数器递增但之后未使用的内部for循环是此类代码的示例。

要避免此行为,请在循环中引入副作用。一种方法是将i声明为volatile。然后编译器将在每次更改后强制将i的值写回内存,并且循环将运行确切的时间,直到条件变为false。

或者,嵌入式平台或编译器通常提供delay()和/或sleep()函数。使用它们而不是繁忙的循环是一种更好的编码实践 - 首先,无论硬件和MCU速度如何,您都将获得更多确定性的执行时间。

答案 1 :(得分:0)

考虑使用delay()或sleep()而不是内部循环。