2016年10月04日

スケッチファイルのフォルダの中にフォルダを作ってはいけないらしい

Arduino IDEは今まで1.6.9を使っていたのですが、1.6.12が出たのでそちらをインストールしてみました。
ところが、1.6.12で今開発中のabshellをコンパイルするとコンパイルが通りません。

調べてみると、スケッチの中にフォルダを作って入れてあったNT-Shellがコンパイルされておらず、リンクエラーになっていました。
1.6.9ではコンパイルできていたので、仕様が変わったようです。
テンポラリフォルダを調べると、ソースコード自体はディレクトリごとコピーされていましたが、コンパイルはされていませんでした。

ネットで情報を漁ってみても、どうやら「スケッチを入れるフォルダの中にサブディレクトリは作れない」というほうが常識のようです。(文句を言っている人も多いのですが)

もしかすると1.6.12のバグで、今後修正されるのかもしれませんが、待ってもいられないのでフォルダを無くしてファイルをすべてトップ階層に移動しました。
また、ついでにこれまでフラッシュに格納していなかった定数配列を3つほど、フラッシュ側へ移動しました。
これでRAM使用率は68%まで下がったので、安定動作が期待できそうです。
posted by boochow at 00:00| Comment(0) | Arduino | このブログの読者になる | 更新情報をチェックする

2016年10月02日

Arduboy用シェルにビットマップ転送コマンドを追加



先週作成したArduboy用コマンドシェルですが、ビットマップ画像を表示させる命令についてはペンディングにしていました。
あれこれ考えた末、

・表示位置とデータは別命令とする
・データは16進数の文字列で送る

ということに決めました。

ビットマップはデータがとても重いので、1行の命令で記述しようとするとあまり大きな画像は表現できません。
1行は100文字程度、と考えると最大でも100バイトしか、一度には送れません。
すると、何回かに分割して送ることになります。
それなら、1度しか必要ない表示位置の指定と、何度も行うデータの転送は分けるのが理にかなっています。

表示位置は矩形(座標、幅、高さ)で指定し、それ以降に送られるデータはその矩形の中へ詰めていくことにします。
データはバイナリなので、テキストに変換する必要がありますが、今回は16進数にしました。
16進数だと1文字で4ビットしか送れないので、効率は悪いですが、覚えやすいのがメリットです。
ソースコードに書く値との互換性もあります。
uuencodeやbase64などを使えば、文字数の3/4程度のバイナリデータを送れますが、そこまで速度に拘る必要性は低いと判断しました。

とはいえ将来的に拡張も考えられるように、16進数のデータ転送命令は「.x」としました。
「x」が16進数を表しているつもりです。

書式は単純な16進数の連続で、たとえば
「.x aa55aa55」

「{ 0xaa, 0x55, 0xaa, 0x55 }」
というデータを表します。

実際の使い方はこんな感じです。
bitmap 52 20 24 24
.x 8080808888888888888c8c8880ffff81
.x 8082849c98c0c080000000f8f80800fe
.x fe222030200f7ff08000000000000000
.x 20e0607f7f30301f1f08080404000001
.x 070e1c7870e0fe60


これは、左上が(52, 20)で幅と高さが24ピクセルのビットマップを描画します。
続く.x命令が実際のビットマップのデータを現しています。

このデータは、たとえば以下で公開されているツールなどで生成したデータを、"0x"や","、余計なスペースなどを削除し、行の頭に".x "を付加すれば簡単に作ることができます。

Web-based bitmap editor - Arduboy / Development - Community

とはいえ、以前にも書いたように変換ツールも作る予定です。
とりあえずカラー画像をディザリングして白黒画像に変換するところまではできました。

abImage.png
ラベル:Arduboy
posted by boochow at 23:35| Comment(0) | Arduino | このブログの読者になる | 更新情報をチェックする

2016年10月01日

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

です。
posted by boochow at 16:55| Comment(0) | Arduino | このブログの読者になる | 更新情報をチェックする
人気記事