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条回答
mowin
1楼-- · 2019-12-20 11:42
只敢开O1优化的轻轻飘过,O2及其它都不正常,我知道我程序写得不好,但是不知道那里不好
myxiaonia
2楼-- · 2019-12-20 13:19
从头就是o3的飘过,volatile的寄存器一般不会被优化吧
kind777
3楼-- · 2019-12-20 14:32
 精彩回答 2  元偷偷看……
清新怡人
4楼-- · 2019-12-20 14:59
开优化后,局部变量用寄存器代替就出错了,不知道原因。局部变量明显不是volatile问题,代码哪里不好,怎样查?
onepower
5楼-- · 2019-12-20 16:39
所有的优化器都会有这个问题, 关键地方 用 volatile; 部分局部变量也会出现这种情况的!!
清新怡人
6楼-- · 2019-12-20 22:19
问题揭晓:1.全局变量要加volatile;2.结构体必须初始化。

一周热门 更多>