Arduino(AVR)でのグローバル変数の扱い

先日Arduinoへ移植したNT-Shellですが、どうも動作が不安定で画面にゴミが出ることがあります。
RAMが逼迫しているという警告が出るので、グローバル変数の状況を調べてみました。
調べ方ですが、avr-objdump.exeというコマンドを使います。
このコマンドはArduinoのフォルダ内の「hardware\tools\avr」に入っています。
使用状況を調べるには、ソースコードをコンパイルして作成される.elfファイルが必要です。
(通常はテンポラリフォルダの中に保存されています。)

avr-objdumpの使い方は以下の通りです。

avr-objdump -S -j .bss project.elf

avr-objdump -S -j .data project.elf

初期化されない変数は.bss、初期化される変数は.dataで調べます。

これで調べてみたら、コマンド名の配列(入力されたコマンドを調べるために使っていた)が意外と領域を食っていたので、ちょっと手間ですがフラッシュのほうへ格納し直しました。
これで現時点ではRAM使用率が72%まで下がり、警告も出なくなりました。

また、avr-nmというコマンドを使うとシンボルテーブルの出力ができます。
こちらは使い方は

.\avr-nm.exe -C project.elf

です。

コメント