1

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)
4

1 に答える 1

3

でパーツを外す

#include <iostream>
using namespace std;

あなたはそれを必要としません。余分なグローバルオブジェクト/変数が追加され、一部の定義がバイナリに残る可能性があると思います。

-Osも使用

-オス

サイズを最適化します。-Os は、通常はコード サイズを増加させないすべての -O2 最適化を有効にします。また、コード サイズを削減するために設計されたさらなる最適化も実行します。

于 2012-10-11T08:37:16.637 に答える