KEIL里的优化选项解读
一、优化等级
优化大家都知道,-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文件发现这个地方有差异,改回来就好了。
作用就是 把程序中未调用的函数给优化掉,不参与编译
CSDN-Ada助手: 推荐 CS入门 技能树:https://edu.csdn.net/skill/gml?utm_source=AI_act_gml
luckybobuu: 谢谢,终于懂了
RARrrrrrr: 谢谢指点,我明白了
要成为c的男人: 刚写的比较菜
要成为c的男人: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { /* * *** ***** ******* */ //金字塔 //每行层的空格=总层数-当前层数; int lay = 10; printf("制造金字塔\n"); printf("请输入金字塔的层数(请摁两次enter键)(最大输入61最小输入3):"); scanf("%d", &lay); if (lay > 61 || lay < 3) { printf("输入错误"); } else { printf("制作完毕\n\n\n"); for (int i = 1; i < lay; i++) {//代表层数 for (int j = 1; j < (lay - i); j++) {//每层空格数 printf(" "); } for (int c = 1; c <= (i * 2 - 1); c++) {//控制每行*的数量 printf("*"); } printf("\n"); } } system("pause"); return 0; }