0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Keil编译器优化方法

strongerHuang 来源: 鱼鹰谈单片机 2024-10-23 16:35 次阅读

转自 |鱼鹰谈单片机

我们都知道,代码是可以通过编译器优化的,有的时候,为了提高运行速度或者减少代码尺寸,会开启优化选项

但是开启了优化,即意味着调试不方便。因为实际汇编代码执行顺序和源代码不一定保持一致。在遇到复杂的问题下,就比较难定位了。

此时掌握多种编译优化设置的方法,就显得尤为重要了,可以让你进行正宗源码级别的调试。

1、全局优化(整个工程所有源文件)

这种优化是大部分人最新了解、也是最新使用的一种方式,相信大家都知道。

297b06ca-9045-11ef-a511-92fbcf53809c.png

level 0(-O0) 代表不进行优化,原汁原味,这种方式编译出来的可执行文件比较大,但是因为每一条代码都和汇编代码顺序一一对应,所以定位问题非常方便,非常建议代码调试阶段使用该等级。

2、组优化

上面的方式,将所有的源文件都进行了优化配置。有一棍子打死的感觉。虽然大部分的时候没有问题,但有些情况可能是个麻烦。

比如你的工程代码,只有开启最高优化级别(level 3(-O3))尺寸才足够放入 FLASH 中,否则编译出来的目标文件太大,放不进去,也就无法定位问题了。

此时,你可以使用该优化方式,将部分文件优化(需要定位问题的代码),而保持其它文件的优化级别不变。

298927dc-9045-11ef-a511-92fbcf53809c.png

这里的 default 意味着和这里的优化级别和全局优化级别保持一致(即全局优化级别是啥,这里也是啥),但是我们可以通过这里差异化定制我们这个组里面的优化选项(这个组里有 app.c app_cfg.c 两个文件,意味着这两个文件的优化级别受这里控制)。

3、单个文件优化

可能你的空间已经到极限了,不允许把组里的文件都进行优化,那么单个文件优化是个不错的选择。

29a537c4-9045-11ef-a511-92fbcf53809c.png

这个界面(Options for File main.c)就是针对 man.c这个文件进行优化的,在这里可以选择你希望优化的级别,调试时设置level 0(-O0)就好。

29d526fa-9045-11ef-a511-92fbcf53809c.png

这么多差异性,我们怎么知道我们对哪些文件做了特殊配置呢,不可能一个个查看吧。

别怕,MDK 贴心的为我们做了区分标志。

29f959da-9045-11ef-a511-92fbcf53809c.png

这里的雪花标志,即代表有特殊配置,但是不是仅仅优化级别改变了就不一定了。

4、单个函数优化

如果单个文件由于某种原因不能修改优化级别(比如改成 O0 直接不能运行,编译不通过等,这些都有可能),那么可以试试单个函数优化这个方法。

不过不同的编译器,可能方法不同(MDK 支持不同的编译器,比如 AC5、AC6、GCC),所以如果真有必要,可以尝试把需要优化的函数提取出来单独作为一个源文件进行设置。

AC5 设置方法(O0 代表 0 优化级别):

#pragma push
#pragma O0
void function(void){
    ...                 // Optimized at O0
}
#pragma pop

这里的 push、pop 主要是为了保留、恢复之前的优化等级,这样操作只对当前函数有效。

AC6设置方法

void function(void) __attribute__((optnone))
{
    ...   // Optimized none
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源码
    +关注

    关注

    8

    文章

    639

    浏览量

    29185
  • keil
    +关注

    关注

    68

    文章

    1212

    浏览量

    166843
  • 代码
    +关注

    关注

    30

    文章

    4780

    浏览量

    68527
  • 编译器
    +关注

    关注

    1

    文章

    1624

    浏览量

    49108

原文标题:总结Keil几种编译优化设置的方法

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Keil修改ARM编译器及配置方法

    Keil MDK自 V5.36 版本之后,默认就不带 Arm Compiler V5版本编译器。如果需要使用 V5 版本编译器,就需要自己下载并安装。
    发表于 09-19 10:41 4617次阅读
    <b class='flag-5'>Keil</b>修改ARM<b class='flag-5'>编译器</b>及配置<b class='flag-5'>方法</b>

    Keil编译器优化问题

    大家好,我在使用单片机程序编译过程中,碰到了一些问题,恳请高手回答。具体描述如下: 当使用keil编译器编译过程中,设置为8级优化,产生的烧
    发表于 12-18 16:39

    Keil C51编译器用户手册 中文版

    Keil C51编译器用户手册 中文版:本手册讲述对8051 的目标环境,如何使用Cx51 优化C 编译器编译C 程序Cx51
    发表于 08-06 08:51 0次下载

    MCS-51程序空间扩展原理及编译器优化

    讨论了MCS-51系列单片机程序空间扩展的原理,包括硬件与编译器两个方面,并提出一种编译器优化方案.该方案在Keil仿真上检验并通过关健词
    发表于 10-23 08:55 100次下载

    Keil C编译器编程规则和代码优化

    本内容介绍了Keil C编译器编程规则和代码优化,要实用好单片机就必须清楚它的内部结构组织结构,无论是在芯片的选择还是代码的编写
    发表于 04-20 17:37 315次下载
    <b class='flag-5'>Keil</b> C<b class='flag-5'>编译器</b>编程规则和代码<b class='flag-5'>优化</b>

    编译器_keil优化选项问题

    keil编译器优化选项针对ARM,对STM32编译的一些优化的问题
    发表于 02-25 14:18 3次下载

    C编译器及其优化

    本章将帮助读者在ARM处理上编写高效的C代码。本章涉及的一些威廉希尔官方网站 不仅适用于ARM处理,也适用于其他RISC处理。本章首先从ARM编译器及其优化
    发表于 10-17 17:22 2次下载

    基于Atmel Studio 6软件的KEIL ARM 编译器使用

    基于Atmel Studio 6软件的KEIL ARM 编译器使用
    的头像 发表于 07-04 09:49 5761次阅读
    基于Atmel Studio 6软件的<b class='flag-5'>KEIL</b> ARM <b class='flag-5'>编译器</b>使用

    关于KEIL ARM编译器的使用介绍

    KEIL ARM编译器的使用
    的头像 发表于 07-10 10:50 6333次阅读

    编译器优化对函数的影响

    编译器如gcc,可以指定不同的优化参数,在某些条件下,有些函数可能会被优化掉。
    的头像 发表于 06-22 14:58 2829次阅读
    <b class='flag-5'>编译器</b><b class='flag-5'>优化</b>对函数的影响

    如何在Keil MDK中使用GCC编译器工具链

    Keil MDK 是否支持编译器?有没有办法选择其他编译器? 可能你使用其他GUN工具链进行编译时,会出现类似如下错误: --- Error: cant execute as--- E
    的头像 发表于 11-20 15:53 4689次阅读

    基于C++编译器的节点融合优化方法

    LLVM是以C十十编写的架构编译器的框架系统,支持多后端和交叉编译,用于优化程序的编译时间、链接时间、运行时间和空闲时间。节点融合是一种简单有效的
    发表于 06-15 14:29 19次下载

    Keil MDK使用GCC编译器方法

    有网友问:Keil 编译速度有点慢,它支持GCC编译吗?
    的头像 发表于 03-24 09:57 3080次阅读
    <b class='flag-5'>Keil</b> MDK使用GCC<b class='flag-5'>编译器</b>的<b class='flag-5'>方法</b>

    新版编译器的设计思路和优化方法

    小程序编译器在小程序开发、预览、发布各个阶段都需要使用,因此编译器性能会直接影响到开发者开发效率,也会影响到开发者工具的使用体验。 由于旧版的编译器(基于 webpack4)在构建大型项目时会很慢,内存占用也高,一直被开发者吐槽
    发表于 10-13 11:21 326次阅读
    新版<b class='flag-5'>编译器</b>的设计思路和<b class='flag-5'>优化</b><b class='flag-5'>方法</b>

    编译器优化选项

    一个程序首先要保证正确性,在保证正确性的基础上,性能也是一个重要的考量。要编写高性能的程序,第一,必须选择合适的算法和数据结构;第二,应该编写编译器能够有效优化以转换成高效可执行代码的源代码,要做到
    的头像 发表于 11-24 15:37 894次阅读
    <b class='flag-5'>编译器</b>的<b class='flag-5'>优化</b>选项