cortex-M4デバイス用のベアメタルc++アプリケーションを作成しようとしています。私のツールチェーンはARM-GCCです
コードサイズが300kb増加していることに気づきました。これは、使用可能なフラッシュサイズの30%です。肥大化したTEXT、DATA、BSSの領域にリンクされている、標準ライブラリからのトラックの負荷があります。
これを減らすことはできますか?
アプリケーションは、:-whileループでポートピンを切り替えるCルーチンを含むBlinky.c-main()を含むMain.cppとコンストラクターを含む単純なクラス-プログラムを実行するデバイス起動ファイルを備えた由緒あるまばゆいばかりのプログラムです。 main()にロードして制御を譲ります
cファイルはgccを使用してコンパイルされ、cppはg++を使用してコンパイルされます。リンカはg++を介して呼び出され、stdlibc ++に自動的にリンクします(stdlibc ++から必要なオブジェクトのみがリンクされることを前提としています)。
g ++へのコンパイルオプションとして-fno-rttiと-fno-exceptionsもありますが、節約はちょっとしたことです。
ちなみに、生成されたバイナリ作品ファイル。
これは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)