This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TM4C123GH6PM:一些未使用的函数即使使用--unused_section_elimination=on 选项也不会被删除

Guru**** 2049300 points
Other Parts Discussed in Thread: TM4C123GH6PM
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/840880/compiler-tm4c123gh6pm-some-unused-functions-not-removed-even-with-the---unused_section_elimination-on-option

器件型号:TM4C123GH6PM

工具/软件:TI C/C++编译器

我刚刚从源代码中删除了从未调用过的函数、但很惊讶地发现使用的闪存数量减少 了(根据*。map 文件);我假设链接器会丢弃此类未使用的函数、以便结果完全相同。  CCS 针对 TM4C123GH6PM 进行配置。  编译器版本为"TI v18.12.3.LTS "、输出格式为 eabi (ELF)。   

我没有使用--unused_section_elimination 选项(1),因为它默认为 on。  如果我显式打开它、结果是相同的。  如果我将其关闭、代码大小将按预期进行缩放。  如果我修改源代码以删除函数、则闪存用量会下降、并且该函数会从*。map 文件中消失。  我想自动将其以及输出文件中的任何其他未使用的函数丢弃、以释放闪存。

我是否可以做些什么来使链接器丢弃此类未使用的函数?  显然、它会删除某些内容(根据选项关闭时的大小膨胀)、但在这种情况下、除非我从源代码中删除、否则该函数似乎会保留。  如果相关、该功能如下所示(2)。  我之前看到另一个函数发生了这种情况(当时没有对它有太多想法)、因此我不认为这是一个孤立的情况。

Steve

(1)我 正在使用 Project Properties > CCS Build > ARM Linker > Advanced Options > Miscellaneous > elimination sections not need 选项从 CCS 中控制--unused_section_elimination 选项(使用 Project Properties > CCS Build > ARM Linker > Advanced Options > Miscellaneous > elimination > elimination unused_section_elimination)、然后检查构建控制台以确保更改对传递给链接器的选项具有所需的效果。  关闭该选项后、链接器命令(某些*。obj 文件名已剪切)如下所示(打开该选项或将其保留为默认值、则该选项是命令中唯一发生更改的内容):

"c:/ti/ccs901/ccs/tools/compiler/ti-cgt-arm_18.12.3.LTS/bin/armcl "-mv7M4 --code_state=16 --float_support=FPv4SPD16 -me -O2 --define=CCS"--define=part_TM4C123GH6PM -g --relaxed_ansi --gcc --gcc ---gabi_warning=225 --13.2_wrap=13.2--11.81,20.4、19.8 /ti/ccs901/ccs/tools/compiler/ti-cgt-arm_18.12.3.LTS/lib、19.8、19.8、19.8、19.8、19.8、14.8、12.5b、19.4、19.8、19.8、19.8、19.8、12.5b、19.8、19.8、16.8、19.8、19.8、19.8、19.8、19.8、12.8、12.8、12.8、12.8、-14.8、16.8、16.8、16.8、16.8、16.8、16.8、16.8、16.8、16.8、16.8、16.8、12.8、12.8、-14.8、12.8、12.8、-14.8、-14.8、12.8、12.8、-14.8、12.8、12.8、-14.8、12.8         /ti/TivaWare_C_Series-2.1.4.178/driverlib/ccs/Debug/driverlib.lib /ti/TivaWare_C_Series-2.1.4.178/grlib/ccs/Debug/grlib.lib /grlib/string.obj /ti/ccs901/ccs/tools/compiler/ti-cgt-arm_18.12.3.LTS/include   

(2)该函数位于 ds1372.c 文件中  将"#IF"从0更改为1并返回将闪存使用量改变168个字节。

#if 0//当前未使用。
void printDS1372Time( DS1372Time_t timeReadAtStartup )
{
UARTprintf("\n"DS1372:溢出%d,重置计数%d,自上次 RTC 重置%d 起的分钟数",
timeAtStartup.printResetOverflow,timeReadAtStartup.clockResetCount,timeReadAtStartup.minutesSincStartup.minutesS4.0%d)(
#timeStartup.trad)64
天(#timeStartup.tradu.int)("<u.tradu.tradu.tradu.tradu.tradu.tradu.tradu.tradu.tradu.tradu.tr

用于构建 ds1372.c 的命令为:

"c:/ti/ccs901/ccs/tools/compiler/ti-cgt-arm_18.12.3.LTS/bin/armcl "-mv7M4 --code_state=16 --float_support=FPv4SPD16 -me -O2 --include_path="C:/ti/ccs901/ccs/tools/compiler/ti-cgt-arm_18.12.3.LTS/include --include_path="C:/ti/TivaWare_C_Series-2.1.4.178 --include_path="C:--include_path="C:/ti/TivaWare_C_Series-2.1.4.178 --define=ccs="pms"--11.8=part_reature=19.8、19.8、19.8、19.8、14.8、14.8、19.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、14.8、16.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请添加编译器选项 -gen_func_subsections。  这就告诉编译器将每个函数放在其自己的段中、这样链接器就可以更轻松地删除它们。  请在 ARM 编译器手册中搜索此选项

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在 Project Properties > CCS Build > ARM Compiler > Advanced Options > Runtime Model Options 中找到了--gen_func_subsections 选项、并将其打开、然后执行干净的编译。  它为我节省了5.5k 的闪存和88字节的 SRAM、这是相当不错的、因为我在超出限制范围。  谢谢!  从 源代码中删除我询问的 printDS1372Time()函数不再更改所使用的闪存容量,因此现在的工作方式与默认情况下我最初预期的一样。   

    很有意思的一点是、知道它是否节省了平均项目的内存或成本(由于对齐了每个函数)。  如果它通常保存存储器、也许应该在默认情况下启用它。  更好的是、如果链接器可以避免额外对齐的开销、则始终使用它不会有任何缺点(我知道这一点)、并且可以消除关闭它的选项。

    Steve