This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于msp430循环程序的汇编优化



遇到这样一个问题,不知道MSP430是如何对循环进行优化的。开发环境ccs5.4,launchpadG2553.

代码1:官方例程去掉volatile循环结果i为0;变量I以及循环全部被优化掉了,灯不闪烁。

for (;;)
{
unsigned int i=50000;

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


do (i--);
while (i!=0);
}

代码2:只要循环最后i不为0,就不会被被优化,灯正常闪烁。

for (;;)
{
unsigned int i=50000;

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

do (i--);
while (i!=1);
_nop();
}

这是为什么呢?

  • 你好,

    因为程序中你定义的局部变量虽然有对其进行操作,但是编译器有看到你没有在其他地方判断使用该变量,所以就给优化掉了。

    建议你把i定义为全局变量,这样的话,编译器就不会优化了。

    但是你问为什么,我还要思考下,你注意看看反汇编。

  • 谢谢,实际情况时,我也知道要用volatile,只是偶然遇到这个问题,所以想弄清楚。

    反汇编,我看过。结果如下。

    代码1:循环完全被优化掉。

    P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
    $C$DW$L$main$2$B, $C$L1:
    XOR.B #1,&Port_1_2_P1OUT
    18 _nop();
     NOP
    19 }
    c08c: 3FFC JMP ($C$L1)

    代码2:循环未被优化。

    unsigned int i=50000;
    $C$DW$L$main$2$B, $C$L1:
     MOV.W #0xc350,R15
     P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
    XOR.B #1,&Port_1_2_P1OUT
     do (i--);
    $C$DW$L$main$2$E, $C$DW$L$main$3$B, $C$L2:
     DEC.W R15
     CMP.W #1,R15
    JNE ($C$DW$L$main$2$E)
     _nop();

    搞不清,为什么就是判断不同,最后i是否为0,就决定了循环是否被优化?

  • 你好,

    这就是编译器的问题了,真的就很伤脑筋,你在百度上搜索一下编译器原理吧,这个问题就有点没解了。

    但是如果你后面用ifxxx调用了i这个变量,那么就不会被优化了。

    编译器太聪明,已经人工智能了