优化问题 以下代码在 ARM Compiler 5 中,正常执行,但在 ARM Compiler 6 中,只要不是-O0级别,整个函数因为空循环问题,都被优化掉。也就是延时没有起作用。 void delay_us (uint32_t ul_time)
{
ul_time *= 30;
while(--ul_time != 0);
}
所以当升级到 ARM Compiler 6 出现使用软延时的外设不工作,比如软件IIC出错、软件SPI出错、LCD黑屏等问题,可以检查是否有类似的代码。 需要改成: void delay_us (uint32_t ul_time)
{
ul_time *= 30;
while(--ul_time != 0)
__nop();
}
Keil编译器保证__nop()必定会插入一个NOP指令,在这里可以阻止编译器优化。当然,延时的初始值也要做相应的调整。
编译时间和大小 -O0:Program Size: Code=200360 RO-data=20576 RW-data=96 ZI-data=76316 Build Time Elapsed: 00:00:25 -O1:Program Size: Code=119328 RO-data=16824 RW-data=96 ZI-data=76300 Build Time Elapsed: 00:00:25 -O2:Program Size: Code=153340 RO-data=17100 RW-data=96 ZI-data=76300 Build Time Elapsed: 00:00:26 -O3:Program Size: Code=162292 RO-data=17040 RW-data=96 ZI-data=76308 Build Time Elapsed: 00:00:27 -Ofast:Program Size: Code=161896 RO-data=17040 RW-data=96 ZI-data=76308 Build Time Elapsed: 00:00:26 -Os balanced:Program Size: Code=115628 RO-data=17048 RW-data=96 ZI-data=76300 Build Time Elapsed: 00:00:28 -Oz image size:Program Size: Code=103784 RO-data=17020 RW-data=96 ZI-data=76308 Build Time Elapsed: 00:00:25 -Oz image size LTO:Program Size: Code=85888 RO-data=17064 RW-data=40 ZI-data=75960 Build Time Elapsed: 00:00:32 与Compiler 5 对比(我的程序-可能不具有一般性): -O2:Program Size: Code=94232 RO-data=16736 RW-data=540 ZI-data=75640 Build Time Elapsed: 00:00:16
参考文档 《Arm® Compiler Migration and Compatibility Guide》(内容详细) 《Migrate ARM Compiler 5 to ARM Compiler 6》 (AN298)
|