我正在尝试为 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)