欢迎来到某某官网,某某是一家生产阳光板耐力板厂家,品质保障,欢迎咨询!

返回列表页

关于ARM Keil5 Optimization level 优化等级的一些分析

官网文档:
https://www.keil.com/support/man/docs/uv4/uv4_dg_adscc.htm

Optimization
Control compiler code optimization for the generated code. Sets the compiler command-line option -Onum:
Default: Use the compiler default or the setting of a higher Target or Group level.
Level 0 (-O0): Turn off all optimization, except some simple source transformations.
Level 1 (-O1): Turn off optimizations that seriously degrade the debug view.
Level 2 (-O2): High optimization (default level). The debug view might be less satisfactory because the mapping of object code to source code is not always clear.
Level 3 (-O3): Maximum optimization. Note that Level 3 in combination with Optimize for Time may generate more code that Level 2 since it may unroll loops.

翻译如下:
在这里插入图片描述

-O0禁用所有优化。使用-O0可以加快编译和构建时间,但是生成的代码比其他优化级别要满。与其他优化级别相比,-O0的代码大小和堆栈使用率明显要高。生成的代码与源代码密切相关,但生成的代码要多得多,包括死代码。

-O1支持编译器中的核心优化。因为这个级别比-O0提供了更好的代码质量,因此它能提供了很好的调试体验。堆栈的使用也在-O0的基础上有所提高。为了获得良好的调试体验,Arm推荐使用此选项。
-O1与-O0的区别是:
1.使能了优化,这可能会降低调试信息的保真度。
2.内联和尾调是启用的,意味着回溯可能不会提供运行函数的堆栈,而这个堆栈可能是在读源代码过程中是被需要的。
3.如果不需要结果,则可能不会在预期的位置调用没有副作用的函数,或者可能会省略该函数。
4.变量的值在不再使用之后可能在其范围内不可用。例如,它们的堆栈位置可能已经被重用。

与-O1相比,-O2具有更高的性能优化。与-O1相比,它增加了很少的新优化,并更改了优化的启发式。这是编译器可能生成向量指令的第一个优化级别。它还会降低调试体验,并可能导致比-O1更大的代码大小。
高度优化,调试信息不友好,有可能会修改代码和函数调用执行流程,自动对函数进行内联等。
-O2与-O1的区别是:
1.编译器认为对于内联调用站点有利的阈值将可能会增加;
2.执行的循环展开量可能会增加;
3.可以为简单的循环和独立标量操作的相关序列生成向量指令;

最大程度优化,产生极少量的调试信息。会进行更多代码优化,例如循环展开,更激进的函数内联等。
另外,可以通过单独设置 --loop_optimization_level=option 来控制循环展开的优化等级。

  • 优化等级越高,生成的执行文件越小,但是编译速度会越慢。目前单片机性能来说,不需要刻意压缩执行文件容量。
  • 优化等级越高,越容易影响仿真调试信息的保真度,同时,可能会影响到代码逻辑(例如if和else逻辑),以及函数内部需要再次声明的结构体而不再声明(加static可以解决)。
  • 目前测试,建议使用level 0优化等级。

关于我们

北京某某塑料板材有限公司

启航娱乐环保设计研发站成立于1970年,公司专业提供环保设备研发设计,环保设备销售等启航注册,登录,...

在线咨询在线咨询
咨询热线 020-88888888


返回顶部

平台注册入口