1

我正在尝试为 cortex-M4 设备创建一个裸机 c++ 应用程序。我的工具链是 ARM-GCC

我注意到代码大小增加了 300kb,是可用闪存大小的 30%。标准库中有一大堆东西被链接到臃肿的 TEXT、DATA 和 BSS 区域。

这可以减少吗?

该应用程序是古老的blinky程序,具有: - Blinky.c 包含 C 例程,用于在 while 循环中切换端口引脚 - Main.cpp 包含 main() 和带有构造函数的简单类 - 执行程序的设备启动文件加载并将控制权交给 main()

c 文件使用 gcc 编译,而 cpp 使用 g++ 编译。链接器通过 g++ 调用以自动链接到 stdlibc++(假设只有来自 stdlibc++ 的必要对象将被链接)。

我什至有 -fno-rtti 和 -fno-exceptions 作为 g++ 的编译选项,但节省的钱是微不足道的。

顺便说一句,生成的二进制工作文件。

这是 Main.cpp

 #include <iostream>

 using namespace std;

 extern "C" void Toggle_Pin(uint8_t Speed);

 void *__dso_handle = (void *)NULL;
 void __cxa_atexit(void (*Arg)(void *), void *Arg2, void *Arg3){}
 void  __cxa_guard_acquire(void){}
 void  __cxa_guard_release(void){}
 void  __aeabi_atexit(void (*Arg)(void *), void *Arg2, void *Arg3){}

 class Computer
 {
   public:
uint32_t aa;
uint32_t bb;

Computer();
 };

 Computer::Computer()
  {
    aa=0;
    bb=0;
    for(uint8_t i=0;i < 10; i++)
    {
     Toggle_Pin((uint8_t)100);
    }
  }

 Computer a;

 int main(void)
  {
    a.aa = 10;
    Toggle_Pin();
  }

这些是我提供给 g++ 的编译选项。

 -O0 -ffunction-sections -Wall -fno-rtti -fno-exceptions -mfloat-abi=softfp -Wa,-adhlns="$@.lst" -c -fmessage-length=0 -mfpu=fpv4-sp-d16 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d) $@" -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -o "$@" "$<"

提供给 g++ 的链接器选项:

 -T LinkerScript.ld" -nostartfiles -L"Path to libraries" -Wl,-Map,"Project.map" -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -o "Project.elf" "@makefile.rsp" $(USER_OBJS) $(LIBS)
4

1 回答 1

3

删除部分

#include <iostream>
using namespace std;

你不需要它。我猜它添加了额外的全局对象/变量,并且可能会在二进制中留下一些定义。

也使用-Os

-Os

优化大小。-Os 启用通常不会增加代码大小的所有 -O2 优化。它还执行旨在减少代码大小的进一步优化。

于 2012-10-11T08:37:16.637 回答