0编译器详解_S32DSGNUGCC编译优化选项与配置⽅法详解及S32SDK代码编译优化选。。。
内容提要
引⾔
1. GNU GCC编译器的优化选项详解
1.1 何为编译器的优化选项
1.2 编译器优化选项的⼯作原理
1.3 GNU GCC编译器的-O/O1优化等级
1.4 GNU GCC编译器的-O2优化等级
1.5 GNU GCC编译器的-O3优化等级
1.6 GNU GCC编译器的-O0优化等级
1.7 GNU GCC编译器的Os优化等级
1.8 GNU GCC编译器的-Ofast优化等级
1.9 GNU GCC编译器的-Og优化等级
2. S32DS IDE中GNU GCC编译器的优化选项配置⽅法
2.1 设置整个应⽤⼯程/静态库编译⼯程的全局GNU GCC编译器优化
2.2 设置应⽤⼯程/静态库编译⼯程指定⽂件⽬录的GNU GCC编译器优化选项
2.3 设置应⽤⼯程/静态库编译⼯程特定源⽂件的GNU GCC编译器优化选项
2.4 查看编译优化选项设置结果和优化选项设置的优先级
3. 使⽤S32K SDK的S32DS应⽤⼯程的代码优化建议
3.1  S32K SDK代码⽀持编译优化等级
3.2 通过S32DS应⽤⼯程的⽂件⽬录编译优化选项设置配置SDK代码编译优化等级为-O1
3.3 ⽤户代码的优化选项配置建议
总结
引⾔
很多S32DS和S32K SDK的⽤户反馈说,使⽤S32K SDK的S32DS应⽤⼯程编译结果⽐较差--编译结果代码量太⼤,运⾏速度慢。⽐如在S32DS for ARM v2018.R1新建的使⽤S32K SDK RTM3.0.1的S32K144测试⼯程,其添加了默认的PinSettings组件、
Clock_Manager组件和interrupt_manager组件,分别完成引脚功能配置、时钟配置和中断管理,以及osif组件做软件延时功能。在main 函数中,仅调⽤了时钟初始化和引脚初始化,以及OSIF_TimeDelay()和引脚翻转API函数实现⼀个LED的toggle功能:
其编译的结果就需要占⽤14856字节Flash和3456字节SRAM存储器。
Tips:S32DS应⽤⼯程编译结果占⽤MCU存储器资源⼤⼩的计算⽅法如下:
占⽤的Flash⼤⼩(size) = .text(代码段) + .data(有初始化值的全局/静态变量) = 14520 + 336 = 14856字节 = 14.5KB;
占⽤的Flash⼤⼩(size) = .bss(未初始化或者初始值为0的全局变量/静态段) + .data(有初始化值的全局/静态变量) = 3120+ 336 = 3456字节 = 3.375KB;
此时,可以看到新建的S32DS应⽤⼯程,默认的GCC编译器优化等级为-O0,即⽆任何优化:
若开启GCC编译器的优化,将优化等级设置为-O1:
重新编译⼯程,编译结果如下,只⽤Flash 8020字节,SRAM 3456字节:
相较⽽⾔,开启优化()⽐默认不开优化时,编译结果可以节省46%((14856-8020)/14856)的Flash存储器空间。
另外⼀个实际的S32K142电机控制应⽤⼯程,不开优化与开优化之后的结果如下:
优化选项为-O0,关闭优化:
将SDK和Generated_Code两个⽬录的编译优化设置为-O1,开启优化,重新编译后结果如下:
可以看到,打开SDK的优化,编译结果(占⽤Flash⼤⼩=.text + .data)从97292字节减少⾄69664字节,减少了28.4%。
为了搞清楚,这个优化选项配置都使能了哪些具体的代码优化,我们有必要先详细了解⼀下S32DS IDE使⽤的GNU GCC编译器的优化选项。
1. GNU GCC编译器的优化选项详解
1.1 何为编译器的优化选项
GCC编译器提供选项控制代码的优化等级,从⽽对代码编译结果进⾏不同程度的优化。因此,这类控制选项,通常被称作GCC编译器优化选项。
没有任何优化选项的话,编译时的⽬标是降低编译成本,并使调试产⽣预期的结果。语句是独⽴的:如果你使程序停⽌在语句之间设置的断点处,你可以改变任何变量的值或者改变程序计数器的值使程序执⾏任意函数中的语句并得到源代码中期望的结果。
1.2 编译器优化选项的⼯作原理
编译器的优化选项由很多个具体的优化标志控制共同实现设定的优化⽬标。
打开编译器的优化标志可以让编译器尝试以增加编译时间和牺牲调试程序的能⼒为代价来改进性能和/或代码⼤⼩。
编译器根据程序的信息执⾏优化。⼀次编译多个⽂件⽣成单个可执⾏⽂件的模式允许编译器在编译每个⽂件时使⽤从所有⽂件中获取的信息。
并⾮所有优化都由标志直接控制。以下仅列出具有标志的优化。
只有在命令⾏上设置-O或其他等级的优化选项时,才会启⽤⼤多数优化。 否则,即使指定了单独的优化标志,它们也会被禁⽤。
根据⽬标和GCC的配置⽅式,可以在每个-O级别启⽤略有不同的优化集。
1.3 GNU GCC编译器的-O/O1优化等级
-O1:优化编译需要更多时间,并且⼤型函数需要更多内存。使⽤-O1选项,编译器会尝试减⼩代码尺⼨减少执⾏时间,不执⾏任何需要⼤量编译时间的优化。
-O1选项打开了如下优化标志/优化选项:
gnu编译器-fauto-inc-dec
-fbranch-count-reg
-fcombine-stack-adjustments
-fcompare-elim
-fcprop-registers
-fdce -fdefer-pop
-fdelayed-branch
-fdse -fforward-propagate
-fguess-branch-probability
-fif-conversion
-
fif-conversion2
-finline-functions-called-once
-fipa-profile
-fipa-pure-const
-fipa-reference
-fipa-reference-addressable
-fmerge-constants
-fmove-loop-invariants
-fomit-frame-pointer
-freorder-blocks
-fshrink-wrap
-
fshrink-wrap-separate
-fsplit-wide-types
-fssa-backprop
-fssa-phiopt
-ftree-bit-ccp
-ftree-ccp
-ftree-ch
-ftree-coalesce-vars
-ftree-copy-prop
-ftree-dce
-ftree-dominator-opts
-
ftree-dse
-ftree-forwprop
-ftree-fre
-ftree-phiprop
-ftree-pta
-ftree-scev-cprop
-ftree-sink
-ftree-slsr
-ftree-sra
-ftree-ter
-funit-at-a-time
1.4 GNU GCC编译器的-O2优化等级
-O2:相对-O1优化更多。GCC⼏乎执⾏所有⽀持的优化,但不涉及空速权衡。与-O相⽐,此选项增加了编译时间和⽣成代码的性能。-O2除了打开所有-O1指定的优化标志,还打开了如下优化标志:
-falign-functions
-falign-jumps
-falign-labels
-falign-loops
-fcaller-saves
-fcode-hoisting
-fcrossjumping

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。