私はこれまでAVRとMSP430のみを使用しましたが、これは両方に当てはまります。コンパイルして静的にリンクした後、私の最終的なELFバイナリは約208kBで、IntelHexバイナリは約41kBです。AVRDUDEは、約18kBをアップロードしていると言っています。ここで実際に何が起こっているのですか?
3 に答える
私の最終的なELFバイナリは約208kBです
はい、ELFは生のマシンコードではないためです。これは、再配置情報、動的ロード情報、読み取り専用データのさまざまなセクション、書き込み可能なデータとコードなどを備えたユニバーサル実行可能形式です。OSや動的ロード機能がないため、これらのほとんどはマイクロコントローラーには関係ありません。余分な情報のほとんどは取り除くことができます。
IntelHexバイナリは約41kBです。AVRDUDEは、約18kBをアップロードしていると言っています。
2つの理由。1つは、IntelHEXファイルの各行の終わりにチェックサムが含まれていることです。妥当な平均行長を使用してこれらをカットすると、ファイルが数パーセント、たとえば36kBに縮小することが期待できます。次に、IntelHexファイルが「hex」ファイルと呼ばれる理由があります。生のバイナリデータは含まれていませんが、16進形式の生のバイナリデータが含まれています。つまり、1つの実バイトは2バイトを使用してエンコードされます。したがって、AVRdudeがコードをアップロードすると、コードが生のバイナリに変換され(AVRプロセッサが実行できるもの)、データサイズが再び50%減少します。
オブジェクトコードには、シンボルテーブルやデバッガー情報などの追加のmetatdataが含まれています。そのデータのほとんどは、通常、コンパイラやリンカーオプション、またはGNUツールチェーンを使用している場合はストリップユーティリティによってストリップできます。
16進ファイルは2つの16進数字を使用して1バイトを表し、さらにレコードのオーバーヘッドがあるため、常に2進数の2倍強の長さになります。
他の人が上で述べたように、HEXファイル形式はASCII印刷可能であり、Motorola .s19と非常によく似て、通信リンク(たとえば、7ビットモデム/端末)を介した転送を容易にします。