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
可以完成它的工作。
我的 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
可以完成它的工作。