STM32F407写程序过程中发现了一个KEIL5 ARM编译器导致的BUG,记录如下。
源代码比较简单,分别打印两个标志量的值,采用了volatile 声明,避免被优化。
代码功能不用多说,看一下输出结果:
两个标志量都被编译器修改了,其值分别变为254,231。
经过反复调试,关闭优化(-O0选项),其值仍然是254和231。该代码用vscode + gcc编译,结果正确。因此,考虑可能是编译器的问题,然后更换编译器:
原来的编译器是默认的 compiler version 5, 更换V6.12过后编译,则输出正常。
分析:
debug看汇编代码对if(Flag != 1)的处理。
(1)默认的 compiler version 5:
(2)V6.12