SyntaxHighlighter

---SyntaxHighlighter ウィジェット---

2015年12月27日日曜日

FlashAirでLuaスクリプトを組む時のコツ

FlashAirでLuaスクリプトを組む時のコツ

※FlashAir本体をアップデートすること!
 W3.00.01にしないと、さまざまなバグに悩まされます。

・メモリは少ない。
 スクリプト含めて16KBくらいと思っておくこと。
 なので、配列確保できるのは大抵10KBくらい。
 大きなデータを処理するのなら、マイコンのようにちまちま小分けで処理しないといけない。

・メモリのお掃除は頻繁に。
 Luaは本来メモリが潤沢にある環境で使うものだと思うのだが、
 そうでないので仕方がない。
 メモリ不足になると、メモリ確保に時間を食うので、処理速度が落ちる。
 また、メモリ不足のメッセージが出力に混ざりこむ。
 これを避けるには、collectgarbage()をプログラムの随所に入れておくこと。
 そうすると速度が落ちない。
 ただ、collectgarbage()自体が時間を食うので、頻繁に呼びすぎてもいけない。

・ライブラリは小さく。
 ライブラリのコードサイズがおもいっきりメモリを食い潰す。
 ライブラリ読み込み時にcollectgarbage()する必要が出ることもある。

・コメント少なく。
 コメントもコードの一部。コメントが大きすぎるとそれだけでメモリエラーになる。
 リリース時にはコメントを全削除するなり、別ファイルにするなりする方がいい。

・変数名・関数名は短く。別名を使うのが良い。
 変数名も多分食ってる。関数名も。
 なので、組み込み関数には別名を割り振って使うと多分軽くなる。
 ただ、これは自分がそう思っているだけで、実際には違うかもしれない。

・argの制限
 arg[0]で自身のパスが分かる。
 arg[1]で引数がわかる。
 引数はrun.lua?Helloのように与えることができる。
 file=A&name=Bのように与えても、分解されることはなくそのままでてくる。
 引数がなければnil。
 URLエンコードしたものは解かれる。バイナリを渡すとバグる。
 URLは(たしか全長含めて)128文字しか受け付けない。
 超えると414が帰る(3.00.01)。古いバージョン(3.00.00)だとバグる。
 末端にはLFがくっついているので注意。

・mathが無いので
 数学関数mathがない。ので、浮動小数点を切り捨てることすら出来ない。
 ビット演算は適当に丸めやがるので、切り捨てたい時には使えない。
 解決方法: block = tonumber(string.format ("%d",num));
 アホみたいだが、こういうやり方になる。

・RTCあるって知ってた?
 地味にあるんです。


・ファイルの書き込みという悪魔の所業
 ファイルの書き込みは色々と問題があるので、正直やりたいものではない。
 ホスト機器に差し込まれているときは尚更だ。
 外部からuploadやPUTをした時は、FATにロックが掛かることを忘れるな。
 Luaスクリプトから書き換えるときは、FATにロックがかからないことを忘れるな。
 FATにロックを掛けたければ
 fa.request("http://127.0.0.1/upload.cgi?WRITEPROTECT=ON")
 逆に、ファイルシステム破壊を恐れず解除したければ(再マウントすれば問題ない)
 fa.request("http://127.0.0.1/upload.cgi?WRITEPROTECT=OFF")


・共有メモリというスクリプト間共通変数
 一旦終了したスクリプトから、次に起動するスクリプトに情報を渡すには
 ファイルに書き込む方法を思いつくだろうが、それは上記の理由でおすすめしない。
 W3.00.01から、Luaで共有メモリにアクセスできるようになったので、
 こちらを使うことをおすすめする。512バイトまで記録できる。
 ブラウザからアクセスすることもできる。


・fa.requestの罠
 まず、3KBまでしか受信できない。
 タイムアウトがない。
 エラーが起きると最悪応答がなくなる。
 ポート番号も指定できない。
 ただ、TLS(https)はできる。
 せめてタイムアウト指定とか、なければタイマー割り込みとかほしい...


・隠し関数は積極的に
 ファイルの削除とか、ファイル名変更とか、ping飛ばしたりとか、できるんですよ実は。
 将来的に削除される可能性もありますが。 

・処理速度は20kHz?
 fa.pioで色々測ってみた限り、1処理に500usくらい食ってる感がある。
 また、処理中にWi-Fi関係とかの割り込みが掛かっている感がある。
 

・Wi-Fi起動電流に注意
 かなり食います。電流測定用にテスターかませるだけでダメになることも。
 起動時に200mA、定常120mA程度食うようです。
 Wi-fiをオフにすると数mA~数十mAで収まります。
 参考。

・pioとホスト
 fa.pioはホストとの通信を妨害します。
 ホストが初期化する前にpioを呼ぼうものなら、信号が衝突しますし、
 初期化後に拒否られた状態でpio呼んでも不安定になるようです。

 対策:スクリプトの冒頭に下のような行を入れる。
 sleep(15000);
 if(fa.pio(0,0) == 0)then return; end;

・結果を手早く見れるのはLEDと液晶
 ブラウザからLuaスクリプトを起動すると、CGIなので
 スクリプトが終了するまで結果が出てきません。
 なので、途中状態を知りたいのなら、LEDなり液晶なりを繋ぐか、
 fa.requestを受け取るサーバーでも用意するか、な必要があります。


・デバッグ面倒くさいならFTLEがおすすめ(ステマ)
 ブラウザからLuaスクリプトの書き換え・デバッグができるエディターあります。
 デバッグが楽になること間違いなし。


・IOポートの動作確認から始めるといいよ(ステマ)
 IOポートでなにかするのなら、まずはIOポートの出力が対象に伝わっているか
 からチェックするのがいいと思います。便利なツールが有ります。

・ライブラリを使いましょう
 悩む時間のほうがもったいないので。
 Airioを使うならこれ。
 AirioRPをつかうならこれ
 秋月FlashAir DIP IOボードを使うならこれ。

・ブリッジモードオススメ
 APモードでデバッグというのはやりづらいです。(ネットから切断されるので)
 なので、ネットが使えるSTAモードやブリッジモードを使うことをおすすめします。

 STAモードだとIPアドレス変わるからデバッグしにくいじゃないか、という方は
 こちらのIPアドレス固定方法を御覧ください。
 APモードやブリッジモードのFlashAir側のIPアドレスも同様に固定できます。

・古いファームウェアでスクリプトが動かない問題は、以下の様なコードでバージョンチェック
 してしまうことをおすすめします。
 特に新しい関数を使っている場合は読み込み時に落ちるので、
 その場合はブートストラップと本体にスクリプトを分けましょう。

if(fa.md5 ~= nil) then
print("FlashAir firmware version is too old!");
error("error() has been called.");
end;

0 件のコメント:

コメントを投稿