我的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除外)
有人可以解释为什么编译器/链接器没有从最终二进制文件中删除未使用的代码吗?是否有进一步调查的工具?
请让我知道是否需要更多信息。
谢谢!
最佳答案
您需要将标志-ffunction-sections -fdata-sections
传递给编译器(gcc / g ++),以使链接器中的--gc-sections
起作用,并且将-flto
传递给编译器,以使链接器中的-flto
起作用。
关于c++ - C(嵌入):在评论FreeRTOS的RootTask时,代码大小不会缩小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58949366/