这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » Keil环境下编译器的多种优化

共11条 1/2 1 2 跳转至

Keil环境下编译器的多种优化

院士
2026-02-03 14:13:41     打赏

Keil IDE开发环境现在已经成为我的主要开发工具,而Keil的AC6编译工具链也是最常用的编译器了。今天就分享一下Keil开发环境下的代码优化的多种方式。

一、全局优化

全局优化,非常好理解,即Keil的AC6编译器对所以有的文件进行优化处理。它比较适合项目的代码相对简单,业务逻辑清晰的应用场景。当然,其也是最省事的一种方法。

keil优化01.jpg

这里面的优化等级详细参考说明如下:

  • - 无优化  Level 0 (-O0):是编译器的默认级别。关闭大多数优化,除了一些简单的源代码转换。使用-O0可以加快编译和构建时间,但生成的代码比其他优化级别更慢。代码大小和栈使用也显著增加。

  • - 优化等级 Level 1 (-O1):受限制的优化。这个优化级别提供了比-O0更好的代码质量和良好的调试体验。栈的使用也比-O0有所改进。为了获得良好的调试体验,Arm官方推荐使用这个选项。

  • - 优化等级Level  2 (-O2):高优化方式。对debug将产生一定的影响。

  • - 优化等级Level  (-O3):最大的优化。这个选项通常非常不利于debug。

  • - 优化等级(-Ofast):启用所有来自-O3的优化,以及其他可能违反严格遵守语言标准的激进优化,包括- fast-math。

  • - 优化等级 (-Os):平衡代码执行效率与体积。

  • - 优化等级 (-Oz):优化代码大小。

二、Group优化

Keil编译环境还允许我们按group来进行优化。这里面group的概念来自在构建工程时的设置。

keil优化02.jpg

我们在设置的时候只需要在左侧工程栏里面的文件夹上点击右键,在弹出的菜单上面选择options for Group选项即可。

keil优化03.jpg


在弹出的对话框里面选择需要的优化等级即可。

三、函数级优化

最后,我们说说颗粒度最低的函数级优化。顾名思义,其优化的范围仅限此函数。其实现方式是以嵌入代码的方式实现。

__attribute__((optimize("O0"))) static void delay_ms(uint32_t ms)
{
  // ...
}

Keil环境下的三种常用的优化方式,您平时如何使用呢?






关键词: 编译器     优化     keil    

工程师
2026-02-03 17:18:01   被打赏 30 分(兑奖)     打赏
2楼

有时搞不懂这个优化,遇到过写的for循环做的延时,被优化没了的。


助工
2026-02-03 17:18:09   被打赏 30 分(兑奖)     打赏
3楼

一般选择项目整体配置优化等级。


助工
2026-02-03 17:18:53     打赏
4楼

有的优化选项冲突,不同代码情况还不同,得慢慢试,费劲得很


助工
2026-02-03 17:21:40   被打赏 30 分(兑奖)     打赏
5楼

O3慎用,的了解清楚具体的优化项,不然可能莫名其妙


高工
2026-02-03 17:28:32   被打赏 30 分(兑奖)     打赏
6楼

我的习惯是一般只开O1,遇到性能问题是考虑切换到针对运行速度的优化的等级,遇到存储空间不够的情况就切换到优先优化编译后程序占用固件大小的等级。不过开启优化后,会发现断点调试时,有些地方跑不到,但是影响不大,可以通过查看上一级的输入输出是否符合要求来确认编译器优化的有没有毛病


助工
2026-02-03 17:28:58   被打赏 30 分(兑奖)     打赏
7楼

用的最多的是。内存不够改-O3编译,确实能腾出来好多存储空间


助工
2026-02-03 17:36:16   被打赏 30 分(兑奖)     打赏
8楼

很少用优化选项的路过


高工
2026-02-03 18:06:34   被打赏 30 分(兑奖)     打赏
9楼

我使用的时候,能编译过去的 就不开优化,编译不过去再开优化,


助工
2026-02-03 19:34:22   被打赏 30 分(兑奖)     打赏
10楼

link time optimization(lto)以及 profile guid optimization(pgo) 在嵌入式项目上一般有使用吗?


共11条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]