易失性关键字 - MSP430

ste*_*fin 2 c msp430

我正在尝试使 TI MSP430 Launchpad 板上的 LED 闪烁。我有两段代码。一个有效,而另一个则无效。唯一的区别是工作版本中包含 volatile 关键字。为什么程序执行需要这个关键字?

这段代码有效...

void main(void) {
    WDTCTL = WDTPW | WDTHOLD;           // Stop watchdog timer

    // Configure Port Directions
    P1DIR |= 0x01;                      // 0000 0001

    volatile unsigned int i;

    for(;;)
    {
        P1OUT ^= 0x01;                  // Set P1.0 LED on
        for (i = 20000; i > 0; i--);    // Delay
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这段代码不...

void main(void) {
    WDTCTL = WDTPW | WDTHOLD;           // Stop watchdog timer

    // Configure Port Directions
    P1DIR |= 0x01;                      // 0000 0001

    unsigned int i;

    for(;;)
    {
        P1OUT ^= 0x01;                  // Set P1.0 LED on
        for (i = 20000; i > 0; i--);    // Delay
    }
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*con 5

如果没有volatile,编译器可以更自由地优化它确定不执行任何操作的代码,以及重新排序内存访问。当不使用 时,您的延迟循环正在被优化volatile