我的FreeRTOS构造中有一个树形的流程/任务架构。main()只需创建一个RootTask(在初始化HAL之后),即可创建另外两个任务,依此类推。
我目前正在与Flash大小(基本上是代码+常量?)战斗,因此禁用任务(=对它们进行注释),以便向编译器显示甚至不需要大多数翻译单元,从而找出哪些模块最昂贵。
但是,我已经对main()提出了自己的看法,并取出了while(1)循环以外的所有内容。它仍然不适合128k Flash。尝试删除所有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除外)
有人可以解释为什么编译器/链接器没有从最终二进制文件中删除未使用的代码吗?是否有进一步调查的工具?
请让我知道是否需要更多信息。
谢谢!
You need to pass the flags -ffunction-sections -fdata-sections
to the compiler (gcc/g++) such that --gc-sections
in the linker works, and -flto
to the compiler such that -flto
in the linker can do its work.