C (Embedded): 注释 FreeRTOS 的 RootTask 时代码大小没有缩小

C (Embedded): Code size does not shrink when commenting FreeRTOS' RootTask

我的 FreeRTOS 构造中有一个树形 process/task 架构。 main() 只是创建一个 RootTask(在初始化 HAL 之后),它创建另外两个任务,依此类推。

我目前正在与闪存大小(代码 + 常量,基本上?)作斗争,因此禁用任务(=评论它们)以便向编译器显示大多数翻译单元甚至不需要,以找出哪个模块是最昂贵的。

但是,我 "commented my way up" 到 main() 并删除了除 while(1) 循环之外的所有内容。它仍然不适合 128k 闪存。 尝试删除所有 C++ 翻译单元,甚至使用 gcc 进行链接;但仍然有 ~100k 的“.text”部分(考虑到应用程序不执行任何操作,此时我可以使用 10k)。

我正在使用 arm-none-eabi-gcc/g++ 5.4.1。链接器脚本由 ST-CubeMX 生成。

gcc 标志: -mcpu=cortex-m0 -mthumb -Os -s -Wall -Wa -a -ad -alms=build/$(notdir $(<:.c=.lst))

链接器标志: -mcpu=cortex-m0 -specs=nosys.specs -T$(LDSCRIPT) [some-libraries] -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections,--undefined=uxTopUsedPriority,-flto (也由 CubeMX 生成,-flto 除外)

有人可以解释为什么 Compiler/Linker 不从最终二进制文件中删除未使用的代码吗?是否有进一步调查的工具?

如果需要更多信息,请告诉我。

谢谢!

您需要将标志 -ffunction-sections -fdata-sections 传递给编译器 (gcc/g++),这样链接器中的 --gc-sections 可以工作,而 -flto 可以传递给编译器这样链接器中的 -flto 可以完成它的工作。