最近写了一个程序,确实感觉volatile关键字太有用了。不容忽视!<br />尤其是中断和主程序公用的变量,必须声明称volatile标识的,否则可能会使得编译器优化不能正确的优化!<br />如连续执行<br />A *= 3; <br />A *= 4;<br />有Volatile标识的代码编译结果为<br /> A *= 2;<br /> 08002A1C 9800 LDR R0, [SP, #0]<br /> 08002A1E 2102 MOVS R1#0x2<br /> 08002A20 4348 MULS R0, R1, R0<br /> 08002A22 9000 STR R0, [SP, #0]<br /> A *= 3;<br /> 08002A24 9800 LDR R0, [SP, #0]<br /> 08002A26 2103 MOVS R1#0x3<br /> 08002A28 4348 MULS R0, R1, R0<br /> 08002A2A 9000 STR R0, [SP, #0]<br />也就是每次都从堆栈取数据,运算后,然后存入堆栈。没有任何的优化,最大限度的遵循了编程者自己的意思。<br /><br />没有Volatile标识的代码编译结果为<br /> A *= 2;<br /> 08002A1A 2002 MOVS R0#0x2<br /> 08002A1C 4344 MULS R4, R0, R4<br /> A *= 3;<br /> 08002A1E 2003 MOVS R0#0x3<br /> 08002A20 4344 MULS R4, R0, R4<br />没有任何的堆栈存取操作,都被优化成寄存器内执行。<br /><br />另外 TRUE_ARM 兄遇到的问题我也遇到了,确实是这样的,在Debug版本下没有死循环,但是在 优化的版本下就有死循环了,编译器认为该循环控制变量没有被修改,而被优化掉,导致死循环。<br />
|