シミュレータ用のコードをいくつか作成しました。現在、TIの無料ツールチェーンを使用して、64kbのnvramでターゲットにクロスコンパイルしようとしています。コンパイラは、私のコードがROMを約34 kb超えていると主張しています。
(...) msp430-elf/bin/ld: region `ROM' overflowed by 33716 bytes
別の行では、.text
フィールドを割り当てられたスペースに入れます。私の追加が合計34kbであるとは信じられません。この量でバイナリがオーバーフローすることは言うまでもありません。
-Os -s
フラグ。math.h
関数(実際には浮動小数点演算を行う唯一の部分です)、strtod
を呼び出し、sprintf
を呼び出しますバイナリが非常に大きくなる原因を分解するツールまたは方法はありますか?
.mapファイルを表示するための小さくて簡単なguiであるAMAPもあります。 http://www.sikorskiy.net/prj/amap/
シンボルサイズを視覚的に比較できるkdirstatのようなツールがあれば良かったでしょう。
質問に対する直接的な答えではありませんが、私はVoidwareのCORDIC実装を使用して、<math.h>
: https://github.com/enthdegree/cordic_wrapped
GNU binutilsには、各シンボルまたは各オブジェクトファイルのサイズを決定するのに役立つツールがあります。
たとえばsize
を見てください: https://manpages.debian.org/jessie/binutils/size.1.en.html
nm
も試してみる価値があります。オブジェクトコードの各シンボルのサイズを表示できるためです。 https://manpages.debian.org/jessie/binutils/nm.1.en。 html
size
とnm
の出力を注意深く調べると、何が多くのスペースを占有し、何が占有しないのかがわかります。
printf
、sprintf
、およびより複雑なライブラリ関数の多くは、多くの場合、かなりの数キロバイトの余分なROMを占有することがあります。
ソフトフロートを使用した浮動小数点サポートは、ハードフロートを使用した場合、つまりソフトウェアエミュレーションとハードウェア命令を使用して浮動小数点を処理する場合と比較して、コードを膨張させます。
時にはコンパイラは驚くほどの肥大化を追加します:)
私はかつて、小さなMSP430コントローラーでメモリの問題も抱えていました。負の値が可能な場合、または浮動小数点が使用されている場合、TIツールチェーンは大きなライブラリをバイナリにリンクしています。私の場合、総メモリ使用量の約10%-20%でした。
TIの無料のコードcomposer Studioは非常に強力なメモリ視覚化を提供します(表示->メモリ割り当て)
リンカの設定やその他の最適化オプションで初期化モデルを変更することで大きな助けになりました。現在、MSP430コントローラーを使用していないため、詳細を説明することはできません。