编译器优化引起的奇怪BUG

/ 0评 / 0

Atollic已经被ST收购了,STM32当然是开放用,以前稍微接触没有深入,现在开始想做点东西,感觉又被编译器聪明坑了.

测试代码:

很明显,这是个SPI发送数据的代码.

使用-O3优化.

分析:

拉高后明明是mDelay(1),而且拉高后都在mDelay函数,怎么还发数据,而且发的数据怎么只有2帧,而且数据还不对.

改成O2优化.

结果没什么差距.

用O1优化.感觉好像发了3帧,又好像 不是,数据也不对.

用不优化,数据就对了.

PS:mDelay(1) 貌似是ST库BUG.

不管是O1 O2 O3,后来还测试了Osize,Ofast,均出错.可见是arm-atollic-eabi-gcc有BUG啊.肯定是打开了不靠谱的优化.

我发现调试过程中,把内核HALT了,依然发SPI,这个难道是优化工具假装HALT了?

HALT时依然有数据.

要不我JLink有问题,要不他有问题.但是我一直在Keil就没问题.而且拔掉仿真器,依然一直发数据,怀疑就是编译出来东西有问题.也有可能是没有充分考虑逻辑,导致慢指令还没执行完,快的指令就来了,马上得执行了.

Keil O3 Compiler 5验证.(Compiler 6依然没错)

发表评论

电子邮件地址不会被公开。 必填项已用*标注