我使用GCC 5.2.0编译EFM32 MCU(基于Cortex-M内核)的代码。当我想要时,我注意到代码的大小急剧增加#include <iostream>
。
例如,让我们为EFM32WG“ Wonder Gecko”芯片编译以下代码:
#include "em_device.h"
#include "em_chip.h"
#include <iostream>
int main(void)
{
CHIP_Init();
while (1) {
}
}
此代码将产生172048字节的代码,而没有#include <iostream>
它则只有1440字节。
我通常只cout
用于调试输出(通过实现_write
newlib的功能并将输出路由到SWO引脚),但是考虑到MCU仅具有256k闪存,并且仅包括此标头,这种方法看起来非常浪费。代码用尽了大部分。
因此,我的问题是:为什么包括iostream标头会使编译后的代码占用如此疯狂的闪存空间?而且,有没有办法解决它?
编辑:
编译器和链接器均为arm-none-eabi-g++
5.2.0版,C库为nano C库(我认为)。
这是我的C ++编译器标志(不包括include路径):
-g -gdwarf-2 -mcpu=cortex-m4 -mthumb '-DEFM32WG940F256=1' -O0 -Wall -c -fmessage-length=0 -mno-sched-prolog -fno-builtin -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
这是我的链接器标志:
-g -gdwarf-2 -mcpu=cortex-m4 -mthumb -T "${BuildArtifactFileBaseName}.ld" --specs=nosys.specs -Xlinker --gc-sections -Xlinker -Map="${BuildArtifactFileBaseName}.map" -mfpu=fpv4-sp-d16 -mfloat-abi=softfp --specs=nano.specs
我尝试了优化和不优化,但是最终的代码大小保持不变(优化后的大小可能小了1k)。
编辑2
-fno-rtti
并且-fno-exceptions
也不帮助提供代码大小。
尽管编译器确实尝试消除了未使用的完整包含或部分包含,但这有时会失败。仅仅包含一些头文件就导致代码运行-这意味着即使您未引用头文件中包含的任何内容,编译器也无法从其中删除代码。
<iostream>
就是这样一个例子,它声明了一些全局对象,这些对象的构造函数在调用main之前运行。它的包含将使STM32的二进制大小大致增加140kB。
您可以在github上检查gcc开发人员的这种行为和推理。
解决方案是避免在微控制器上使用C提供的打印功能,例如printf()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句