概述
本文主要描述如何基于TASKING进行代码优化,满足对于生成的代码尺寸的优化,或者对于代码运行速度的优化。
目标读者:软件工程师。
术语:section,表示函数或者变量。
对应编译链接后的结果是:.text、.bss或者.data。
代码优化设置
接下来我们分为4个部分,逐一介绍代码的优化设置,分别是:
在C/C++ Compiler、Assembler、Linker的option中都提供了配置选项,在编译、汇编和链接三个阶段可以进行代码的优化。
C++代码的相关选项
在TASKING VX-toolset中,C++代码首先要转换成.ic文件(C语言),然后同.c文件一起进行编译。C语言的的优化设置,同样会影响到C++,所以代码优化“Optimization”一栏中并没有专门针对C++代码的选项。但是,在“Language”选项大类中,C++语言的部分选项也会影响到生成的代码尺寸或者运行速度,也可以认为是C++代码的优化选项。
对代码尺寸影响巨大的Exception选项
C++语言选项当中的“Support for C++ exception handling ”选项,如果选择C++ 03 这个版本,该选项默认是禁止的;而选择C++ 11之后的版本,选项默认是使能的。这个选项会严重影响到生成代码的尺寸。禁止该选项,C++代码编译后的输出代码尺寸会缩减到原来的四分之一左右。所以,如果对于存储器的空间受限,可以禁止该选项。
使能和禁止该选项, 不能通过勾选来实现配置,需要在“Miscellameous Additional options”中添加指令:
添加“--no-exceptions”,禁止C++ exception选项。
添加“--exceptions”,使能C++ exception 选项。
这里需要注意,“--no-exceptions”与“--suppress-vtbl”选项相互冲突,如果同时使能之后会出现诸如“bad function call”的报错。
注:选项“--suppress-vtb”,使能“Suppress definition of virtual function tables”选项,抑制虚函数表格定义。
内联函数的使用
内联函数inline的使用可以加快代码的执行速度,不使用的话,会缩减生成的代码尺寸。默认情况下,C++代码中使用inline函数 。在这里是 “Minimal inlining of function calls (C++)”选项,通过“Miscellameous Additional options”中添加指令“--no-inlining”来实现。
经测试可以把生成的代码尺寸缩减到原来的70%左右。同时,这个选项会大幅增加软件的编译时间。
C代码优化选项
上文提到,“C/C++ Compiler”中的“Optimization”都是针对C代码。优化选项见下图 2。这里分为2个部分:
代码优化选项当中,“Optimizition level”,优化等级设置;分为0~3,共4个等级可选。0表示无优化,3表示优化程度最高。也可以选择Custom,然后自定义各优化选项。
Trade-off between speed and size:0~4一共5个优化级别可选。其中2表示兼顾代码的尺寸和运行速度,1和0偏向代码运行速度,3和4表示侧重生成的代码尺寸。
当 “Optimizition level” 选择Custom时,各优化选项处于可配置的状态,工程师可以根据实际的需要进行选择(见图 3)。
编译速度的优化见下图 4,可以通过缓存生成的代码的方式提高编译速度,设置缓存的路径,文件在缓存中保存的时间,以及工程执行“clean”指令时是否清缓存。如果对于编译速度有要求,可以通过设置这些选项提高编译速度。
汇编器(Assembler)优化选项
汇编器的优化只有2个选项(见图5)。
| 选项名称 | 长指令 | 短指令 |
|---|---|---|
| Allow generic instructions | +/-generics | g/G |
| Optimize instruction size | +/-instr-size | s/S |
使用短指令/Allow generic instructions
使用这个选项可以在汇编代码中使用“generic instructions”,汇编器会尝试使用更快、更小的指令。默认情况下这个选项是使能的,应为更短的指令可能影响循环的次数,如果使用手写的时间代码,可能需要禁止这个选项,这样汇编器会按照原本的样式去解码指令。
优化指令尺寸
Optimize instruction size
当这个选项使能时,汇编器会为了所有的指令尝试寻找最短的操作数解码方式,默认情况下这个选项也是使能的。
链接器(Linker)优化选项
链接器选项的优化,在“LinkerOptimization”中,共5个选项(见图 6)。
命令行语法如下所示。
长指令:--optimize=flag,...
短指令:-Oflags
| 序号 | 长指令 | 短指令 | 描述 |
|---|---|---|---|
| 1 | +/-delete-unreferenced-sections | c/C | Delete unreferenced sections from the output file |
| 2 | +/-first-fit-decreasing | l/L | Use a 'first-fit decreasing' algorithm to locate unrestricted sections in memory |
| 3 | +/-copytable-compression | t/T | Emit smart restrictions to reduce copy table size |
| 4 | +/-delete-duplicate-code | x/X | Delete duplicate code sections from the output file |
| 5 | +/-delete-duplicate-data | y/Y | Delete duplicate constant data from the output file |
在链接器的优化选项设置时可以看到--optimize=2或 -O2等设置,其涵义如下所示。
无忧化选项,为0级。所有的优化选项都禁止。(大写字母为禁能,小写字母为使能)
对应的短指令设置: -OCLTXY
--optimize=0 或-O0
默认的选项设置,为1级。
对应的短指令设置:-OcLtxy
--optimize=1或 -O1
使能全部的优化选项,为2级。
对应的短指令设置: -Ocltxy
--optimize=2或 -O2
下面针对各项展开详细的论述。
删除代码中未用到的Section
这项优化从生成的对象文件中删除未被引用的Section,包括函数和变量,用于减小生成的代码尺寸。
如果满足两个条件中的任何一个,该优化选项就认为这是被引用了section(函数或变量),而不会被删除。
2. 这个section通过重定位被另一个section所引用,section被认为是被引用的。
第一拟合递减算法——优化代码定位
当物理内存被分割或地址空间被嵌套时,可能会出现以下情况,尽管可用的物理内存大于代码和数据的尺寸,但是特定程序无法定位。当这种情况发生时,需要启用“First fit decreasing”的优化,并重新链接你的应用程序。
链接器的默认行为是按照LSL文件中指定的顺序来放置各section(即从低内存地址到高内存地址或反之亦然)。这也适用于不受限制的组内的section。如果一个内存区域被部分地填满,剩余部分不足以定位一段特定的section,那么这段section和后续就会定位在临近的区域,这样做的结果就是存在内存的缝隙。
当启用“First-fit-decreasing”优化时,链接器将首先把最大的section放在可以容纳该section的最小内存区域内,小的section最后定位,并有可能被放在剩余内存的空隙当中。
压缩“ Copy table”
启动代码初始化应用程序的数据区域,应当清零的内存地址和需要从ROM复制到RAM中的内存区间的信息存储在copy table中。
当启动了“copy table-compression ”优化选项之后,链接器会以尽可能小的方式定位各个section,从而减少应用程序的ROM映像。
请注意,这个优化选项仅影响需要从copy table中进行初始化操作的非限制section,受影响的sections会得到一个簇状的限制。非限制section是指没有限制其绝对位置或与其他section相对位置的section。
删除重复的代码和数据
优化选项“delete-duplicate-code”,是用来移除目标文件中重复定义的代码(函数)。
优化选项“delete-duplicate-data”,是用来移除目标文件中重复定义的常量数据。
这里需要注意,当使用这两个优化选项,不同的数据对象或函数可能具有相同的地址。如果程序中需要使用相同定义的函数或者数据对象(数组、结构体)时,比如相同数据结构,不同内容的标定数据定义,可以根据实际需求禁止这两个选项中的一个或者全部。
本文主要参考《TASKING VX-toolset for TriCore User Guide》,更多内容请阅读原文。
联系我们
如有技术问题,请联系TASKING在国内的技术支持。
试用申请:https://www.tasking.com/trial
请关注官方订阅号,及时获取最新的TASKING信息资讯和技术文档。
http://weixin.qq.com/r/JhxCWnDEgy38rTQ590k0 (二维码自动识别)
武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks ,Hyperworks, Protel,CAXA,OpenWorks LandMark,MATLAB,Enovia,Winchill,TeamCenter,MathCAD,Ansys, Abaqus,ls-dyna, Fluent, MSC,Bentley,License,UG,ug,catia,Dassault Systèmes,AutoDesk,Altair,autocad,PTC,SolidWorks,Ansys,Siemens PLM Software,Paradigm,Mathworks,Borland,AVEVA,ESRI,hP,Solibri,Progman,Leica,Cadence,IBM,SIMULIA,Citrix,Sybase,Schlumberger,MSC Products...