一、优化等级

优化大家都知道,-O0,-O1,-O2,-O3,等级越高优化程度越高,代码的执行效率也就越高。但是开启优化存在几个问题:

1、低优化等级代码能跑,开启高优化等级后代码就跑不起来了
2、高优化等级代码能跑,开启低优化等级后代码就跑不起来了
3、Optimize for time的3种状态是什么意思?

问题1和2的解决思路看看硬汉大神的帖子
我这里也贴一下截图

除了硬汉说的,我再补充点。

按照硬汉的思路我从-O0 ->-O3对GD32F450的工程进行实验,发现ADC在-O0的时候可以正常运行,一但超过-O1,就进不了DMA中断了。所以可以排除硬件配置有问题。

然后就是无头苍蝇似的找问题,最后想起来对比下他们的寄存器

通过对比发现TIMER的寄存器都一样,ADC忘了看了,DMA1CH0的寄存器两个有几处不同

其中最大的不同就是CH0M0ADDR,也就是存放ADC转换的数组ADC_ConvertedValue的地址不同了

而0x10000000是TCMSRAM的区域。正好前段时间因为LCD优化请教过别人,TCMSRAM是无法配置DMA的。从下图可以看出来,TCMSRAM只有DBUS总线,并没有DMA的总线连接。

把用到DMA搬运的文件都手动定义到普通SRAM里,问题迎刃而解,即使开启-O3程序也能跑了(o)/!

第3个问题还是在群里问大神才知道。

二、One ELF Section per Function

这个选项默认情况下应该是打开的。我在进行优化等级测试的时候,不知道什么时候把这个选项关掉了,导致代码死活跑不起来了。
然后对比.uvprojx文件发现这个地方有差异,改回来就好了。
作用就是 把程序中未调用的函数给优化掉,不参与编译

物联沃分享整理
物联沃-IOTWORD物联网 » 解读KEIL中的优化选项

发表评论