17

私はArduino Uno R3を持っています。C++ を使用して、各センサーの論理オブジェクトを作成しています。Arduino のオンボード メモリは 32​​KB* と非常に限られており、平均して、コンパイル済みのオブジェクトは約 6KB* で出力されます。

メモリフットプリントを最小限に抑えるために、必要な最小限のデータ型を既に使用しています。バイナリのサイズを最小化するためのコンパイラ フラグはありますか? または、コード ベースを最小化するために、変数名と関数名を短くしたり、関数名を減らしたりする必要がありますか?

また、バイナリ サイズを最小化するためのその他のヒントやアドバイスをいただければ幸いです。

*(目の前に座っていないので)KB単位で測定されない場合がありますが、1つのオブジェクトは私の合計メモリサイズの約1/5であり、懸念を引き起こしています.

4

2 に答える 2

43

us2012コメントに記載されているものに加えて、バイナリサイズを縮小するための多くの手法があり、それらを私自身のいくつかのポイントで要約します。

  • -Osサイズについて gcc/g++ を最適化するために使用します。
  • -ffunction-sections -fdata-sections各関数またはデータを翻訳単位内の個別のセクションに分割するために使用します。これをリンカ オプションと組み合わせて、-Wl,--gc-sections参照されていないセクションを取り除きます。
  • strip少なくとも次のオプションを指定して実行してください: -s -R .comment -R .gnu.version. と組み合わせて--strip-unneeded、再配置処理に不要なすべてのシンボルを削除できます。
于 2013-03-09T19:21:01.500 に答える
17

コードに c++-exception-handling が含まれていない場合は、多くのスペースを節約できます (Tuxdude が言及したすべての最適化手順の後、最大 30k)。したがって、次のフラグを指定する必要があります。 -fno-exceptions

ただし、例外を使用しなく、例外処理を含めることができます。次の手順を確認してください。

  1. no usage of new, delete. 本当に必要な場合は、malloc/free ラッパーに置き換えてください。たとえば、「tinynew.cpp」を検索します。

  2. 純粋な仮想呼び出しの機能を提供します。extern "C" void __cxa_pure_virtual() { while(1); }

  3. __gnu_cxx::__verbose_terminate_handler() を上書きします。未処理の例外を処理し、名前のデマングリングを行いますが、これは非常に大規模です! (例: 9.5k の d_print_comp.part.10 または 1.8k の d_type)

乾杯フロー

于 2014-12-27T14:47:30.680 に答える