MDK 5.1优化开到最大和最小,程序可能跑的结果不同?。。。

2019-12-18 18:46发布

最近在用STM32F030,用了MDK 5.1的版本

写了一个串口+DMA+中断的小程序,一开始程序确实有点问题,死活不对。。。

后来发现MDK 在选择Level0时,出来的结果和我想的一样。选择Level2(default)以及Level3时,就不对了。

比如在调试中发现,使用level3的优化,明明还没有到DMA Enable的函数,DMA的寄存器就看到已经被enable了。。。。

怀疑是MDK对程序进行检测,发现多次操作这个寄存器(库函数的特点。。。),索性第一次赋值直接把它写成最终的结果?。。。

有人碰到类似的情况吗?这样如何避免呢?



PS:Level3比Level0确实会小一些(不过也就小了不到1KByte的空间),不知道后面程序写大了,可能优化效果更好,但是这样不敢用啊。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
charlesg
1楼-- · 2019-12-19 19:18
Bastagne 发表于 2014-8-2 23:59
前段时间遇到了 如此问题。
原来ISR程序中 有个if()判断,为了减小代码量, 就开了最高等级优化3,结果测 ...

开了最高优化,调试时,程序不是顺序走的,也不是每行都会走。。。
charlesg
2楼-- · 2019-12-20 00:30
Earthman 发表于 2014-8-3 00:48
一般不是开O2么,GCC倒是敢开O3

O2,Default就是O2吧,在我这边也是不行啊。。。O1没试过,O0可以的
charlesg
3楼-- · 2019-12-20 04:13
boat030 发表于 2014-8-3 06:38
开启优化后,会给你调试程序带来一些困扰,程序运行的顺序会被调整,但结果应该是正确的 ...

结果也不对喽
起码Enable的时间不对,它在第一次Init DMA结构体时,就Enable上了,但是实际上,那时我的程序还没去Enable。。。
gwnpeter
4楼-- · 2019-12-20 04:56
 精彩回答 2  元偷偷看……
charlesg
5楼-- · 2019-12-20 08:51
gwnpeter 发表于 2014-8-3 09:22
不排除优化器的bug,但是很多情况下,还是和 volatile 关键字有关......有时候可能是很遥远的一个函数里面 ...

额。。。我还没用volatile 。。。。
搞不太懂了。。
kebaojun305
6楼-- · 2019-12-20 09:51
一般来说 还是程序写的不严谨。

一周热门 更多>