CS2与四氯化碳谁易挥发? 二硫化碳和四氯化碳哪个易挥发
2023-08-08
很多朋友对深入浅出编译优化选项,上不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。
在之前的文章《如何为嵌入式软件开发选择编译器》中,我们谈到了编译器对于嵌入式软件开发的重要性,以及如何选择一款优秀的编译器。本文还对比了现有主流编译器的编译优化性能,IAR Embedded Workbench编译器在输出代码量和性能方面处于业界领先地位。
本文将以IAR Embedded Workbench编译器为例,说明如何配置编译优化选项,以达到嵌入式软件代码的性能和体积的最佳平衡。由于篇幅所限,本话题将分为两部分。编译器代码构建过程在介绍如何配置编译器优化选项之前,我们先来了解一下编译器的构建过程。以IAR嵌入式工作台编译器为例,其代码构造过程如下。构建过程分为前端和后端两部分。
前端主要是通过解析器从C代码中产生中间代码,在这个过程中会介入高级优化器,其优化策略包括函数在内衬、死代码消除、循环展开等。
后端会通过目标代码生成器从中间代码生成目标汇编代码,在这个过程中还会介入底层优化器,其优化策略包括调度、窥视孔、函数交叉调用优化等。然后汇编程序将汇编代码转换成目标代码。
最后,所有的目标机器码通过链接器链接成elf格式的可执行二进制代码文件。在链接阶段,也有相应的优化器(链接器时间优化)进行优化。
IAR Embedded Workbench编译优化选项介绍在IAR Embedded Workbench(基于EWARM v9.32.2)中,通过菜单栏(Project-Options)打开项目选项界面,选择“C/C编译器”栏,在右侧标签页选择“优化”即可配置编译优化选项,如下图所示。1.编译和优化级别配置
如下图所示,IAR Embedded Workbench分为四个优化级别(无、低、中、高),级别“高”又分为三个子优化级别(平衡、大小、速度)。下表概述了对应于每个优化级别的优化策略。如果选择“无”,编译器只会进行剔除无用代码等基本优化,但编译速度很快,最适合C/C源代码调试。
除了高(平衡),还可以选择高(大小)作为最高优化级别来优化代码量。或者选择高(速度)并检查无大小限制以优化代码性能。我们将在《深入浅出编译优化选项(下)》中详细介绍编译优化启用转换的配置方法,敬请关注。2.多文件编译
通常,编译器逐个编译C/C源文件。编译器对单次编译的查看仅限于当前C/C源文件,无法知道其他源文件的情况,包括全局变量、函数调用、指针别名等关系。因此,编译器会采用更加保守和安全的优化假设。
IAR嵌入式工作台为用户提供了* *“多文件编译”的功能,如下图所示。编译器允许在工程全局级别或文件组级别一次编译多个文件,这增加了编译视野,使编译优化策略能够更深入地实现,通常可以获得更好的编译优化结果。3.灵活配置编译优化选项的范围
IAR Embedded Workbench提供了不同范围的编译优化选项设置,使得用户可以更加灵活地配置不同编译优化需求的代码。全局设置:如前所述,编译优化选项设置方法都是全局设置,影响整个项目范围。
每个文件/组的设置:当一个文件/组中的所有函数必须有与项目不同的编译优化设置时,打开文件/组编译选项界面(在项目管理器中选择文件/组,鼠标右键选择选项),选择“覆盖继承的设置”,如下图所示。然后进行编译优化设置。单一函数:当某些函数必须有不同的编译优化设置时,可以在源代码中使用#pragma关键字单独配置,如下例所示。
4.IAR Embedded Workbench在链接阶段也提供了相应的代码优化选项,如下图所示。默认情况下,链接阶段会删除未使用的变量和函数。内联小例程:用函数的本体替换一些对小函数的调用。
合并重复节:链接器可以检测具有相同内容的只读节,并且只保留每个这样的节的一个副本,从而将对任何重复节的所有引用重定向到保留节。
• C++虚拟函数消除(Perform C++ virtual function elimination):虚函数是C++ 中的一种特殊函数,它的实际调用取决于对象的实际类型。 虚函数的调用需要运行时动态解析,因此会导致一定的运行时开销。 “C++虚拟函数消除” 可删除不需要的虚拟函数和动态运行时类型信息,以减少程序运行时的开销,提高程序的性能。
嵌入式软件编译优化选项配置整体思路
嵌入式系统中通常硬件资源有限,特别是存储器容量,直接与MCU硬件成本挂钩,影响整个系统的硬件物料成本; 另一方面,嵌入式软件又需要对外部信号进行实时响应,对外部设备进行实时控制,比如马达控制组件; 除此之外,电池供电的嵌入式设备需要具备低功耗特性,要求CPU尽可能处于深度睡眠状态,以尽可能延长设备的单次电池工作时间。
结合上述情况,对于嵌入式软件进行编译优化选项配置需要进行差异化考量,具体如下:
• 对于整个嵌入式软件项目作用域,可以考虑极致代码体积优化。 较少的代码体积可以适配较小flash容量的MCU,从而节省硬件物料成本。
• 对于运行频度很高的代码段,可以考虑极致代码性能优化。 这样可以使得关键代码在相同CPU速度的情况下,达到更高的实时响应速度。
• 另外,在电池供电的低功耗应用中,CPU一般处在深度睡眠状态。 通常是间隔一段时间或者外部事件到来,唤醒CPU执行一个任务,然后CPU重新回到深度睡眠状态。 设备功耗等于CPU深度睡眠的静态功耗和任务运行的动态功耗之和。 根据MCU硬件电气特性,其单位时间动态功耗(mA级别)要远大于单位时间静态功耗(uA级别)。
对于经常需要唤醒执行的软件任务,可以考虑极致代码性能优化。 这样会减少动态功耗的时间,以达到整体功耗的下降,从而增加设备的电池使用寿命。
注意事项:
• #pragma optimize 只能降低对应函数的优化等级,或者选择另外一种优化策略。 如果pragma optimize的优化等级比编译器选项的优化等级高,那么pragma optimize命令会被忽略。
• 高优化等级会让编译时间变长,同时让调试变得困难一些(因为高优化等级会让生成的代码和源代码的对应关系没有那么直接)。 如果在调试过程中发现类似的问题,建议降低优化等级进行调试。
总结
IAR Embedded Workbench是一款业界领先的编译工具链,除了提供卓越的性能之外,还提供了丰富灵活的编译优化选项配置,以帮助用户在不同的嵌入式应用需求下,都能找到最佳的嵌入式软件代码性能和体积的平衡点。
在下一篇《深入浅出编译优化选项(下)》 中,我们将介绍编译过程中的优化策略以及如何在IAR Embedded Workbench配置编译优化微调项(Enabled transformations),让用户可以根据代码需求配置出更加精准的编译优化策略组合。
审核汤梓红
以上知识分享希望能够帮助到大家!
版权声明:本站所有作品图文均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系我们
推荐阅读
2023-08-08
2023-08-08
2023-08-08
2023-08-08
2023-08-08
2023-08-08
2023-08-08
2023-08-08
2023-08-08
2023-08-08
2023-08-08
2023-08-08
2023-08-08
2023-08-08
栏目热点
CS2与四氯化碳谁易挥发? 二硫化碳和四氯化碳哪个易挥发
LilyGoT手表键盘C3迷你电脑套件
索泰ZBOXEdgeCI342迷你电脑正式上市
谷歌在最新的视频预告片中展示了PixelWatch的独特设计
三星与设计师Juun.J合作推出限量版可折叠产品和配件
从2023年起Fitbit设备将需要Google帐户
TOKKCAMC2+智能WiFi独立日 夜视摄像头
三星正在与全球时尚品牌JUUN.J合作
OnePlusNordWatch的颜色选项通过泄露的渲染揭示
就在第一款Nothing手机发布之前一种新的TWS芽设计浮出水面