コードをコンパイルすると、Arduino IDEはバイナリスケッチサイズをバイト単位で返します。
フラッシュ内のどのくらいのメモリをどの関数またはどの部分が占めるかを(おおよそ)調べるための良い方法はありますか?それにより、どの機能が貴重なフラッシュメモリの大部分を占めているか、またはフラッシュを無駄にしている可能性があり、どこをフラッシュする必要があるかを感じることができます最適化を開始しますか?
コードをコンパイルすると、Arduino IDEはバイナリスケッチサイズをバイト単位で返します。
フラッシュ内のどのくらいのメモリをどの関数またはどの部分が占めるかを(おおよそ)調べるための良い方法はありますか?それにより、どの機能が貴重なフラッシュメモリの大部分を占めているか、またはフラッシュを無駄にしている可能性があり、どこをフラッシュする必要があるかを感じることができます最適化を開始しますか?
回答:
1つの方法は、プログラムのアセンブリリストを確認することです。
([確認]または[ダウンロード]ボタンを使用して)プログラムをコンパイルした後、プログラムの.cpp、.hex、および.elfファイルが格納されているディレクトリを見つけます。(それらが見つからない場合は、Arduino IDEで詳細なコンパイルオプションを簡単にオンにして、出力のディレクトリ名を確認してください。)
そのディレクトリで、avr-objdump -S
fn.cpp.elfを 実行します。fn.cpp.elfは、最後> listing.txt
に削除.ino
して.cpp.elf
追加したスケッチの名前です。たとえば、スケッチではserialecho.ino
:
avr-objdump -S serialecho.cpp.elf> listing.txt
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のスレッド。