コンパイルされたコードサイズの概要


9

コードをコンパイルすると、Arduino IDEはバイナリスケッチサイズをバイト単位で返します。

フラッシュ内のどのくらいのメモリをどの関数またはどの部分が占めるかを(おおよそ)調べるための良い方法はありますか?それにより、どの機能が貴重なフラッシュメモリの大部分を占めているか、またはフラッシュを無駄にしている可能性があり、どこをフラッシュする必要があるかを感じることができます最適化を開始しますか?

回答:


6

1つの方法は、プログラムのアセンブリリストを確認することです。

  1. ([確認]または[ダウンロード]ボタンを使用して)プログラムをコンパイルした後、プログラムの.cpp、.hex、および.elfファイルが格納されているディレクトリを見つけます。(それらが見つからない場合は、Arduino IDEで詳細なコンパイルオプションを簡単にオンにして、出力のディレクトリ名を確認してください。)

  2. そのディレクトリで、avr-objdump -S fn.cpp.elfを 実行します。fn.cpp.elfは、最後> listing.txt削除.inoして.cpp.elf追加したスケッチの名前です。たとえば、スケッチではserialecho.ino

    avr-objdump -S serialecho.cpp.elf> listing.txt

  3. listing.txtファイルを表示し、16進数演算を使用して、各関数の開始アドレスを終了アドレスから減算します。たとえば、setupコード

    void setup(){Serial.begin(9600); }

リストに表示されます

00000144 <setup>:
...(6 lines snipped)...
 144:   26 e0           ldi     r18, 0x06       ; 6
 146:   40 e8           ldi     r20, 0x80       ; 128
 148:   55 e2           ldi     r21, 0x25       ; 37
 14a:   60 e0           ldi     r22, 0x00       ; 0
 14c:   70 e0           ldi     r23, 0x00       ; 0
 14e:   80 e1           ldi     r24, 0x10       ; 16
 150:   92 e0           ldi     r25, 0x02       ; 2
 152:   db c1           rjmp    .+950           ; 0x50a <_ZN14HardwareSerial5beginEmh>

00000154 <loop>:

計算0x154–0x144 = 0x10は、この部分のsetup長さが16バイトであることを示しています。

これらの例は、Linuxシステムで生成されました。MSWindowsシステムでもアプローチは同じだと思いますが、のavr-objdump.exe代わりに言うavr-objdump必要があり、パスを指定する必要がある場合もあります。たとえば、Assemlerの結果を参照してくださいforum.arduino.ccのスレッド。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.