ESP32+micropythonでのメモリ節約コーディング
ESP32でプログラムをしていると
いつも、メモリーが足りなくなってしまい・・・・
メモリー確保エラーとの戦いになるので。
自分なりに整理してみたい
今回試してみたこと。
何か指標がないと効果があったのか
なかったのかわからないので。以下を指標値にする。
gc.mem_alloc() → 使用中
gc.mem_free() → 空き
単位はバイト。
として、実際に動かしてみながら試してみております。
とりあえず、動作しないとどうしようもないので不要なコード削除から始めてみた。
■不要なコードを削除
使用中:63328
空き :54896
-----
■毎回GCを入れる
→ループの先頭にgc.collect()を入れた
使用中:60544
空き :57680
-----
■余計な表示文字列の削除
→http送信用バッファーのスペースを削除してみる
使用中:58528
空き :59696
-----
■同一処理のサブルーチン化
→HTTP/1.1 200 OKの3行の応答をひとつにまとめてみる
使用中:54928
空き :63168
やろうと思えば、もっと多くの部分をサブルーチン化できるんですけど、
今回は目立つ部分だけに止めた。
結局基本に立ち戻ってサブルーチン化が一番効果があるかも、という結論だけど、
あんまりやり過ぎるとプログラムの見通しが悪くなったりして・・・
いろんな意見があると思うのでこのぐらいで止めておくが
メモリ削減を優先する場合はまだ改善の余地ありってことです。
で、空きが63168ぐらいあれば良いみたいですね。
単位はバイト。
空きと、使用中を足しても120㌔バイトしかない。
秋月のページで
ESP32-DevKitC ESP-WROOM-32開発ボード
を見るとSRAM512㌔ってなっていて。なんか少ないねーと思ったりしますが。
Micropython入れた状態だと
ユーザーは120㌔バイトしか使えないっぽい。です。
ちなみに、Micropython入れて、main.pyを空にして起動した直後は
--------------------------
MicroPython v1.11-288-gfb73bdae6 on 2019-09-06; ESP32 module with ESP32
Type "help()" for more information.
>>> gc.mem_alloc()
4880
>>> gc.mem_free()
113344
>>>
ってなっておりまして、113㌔バイト使える状態なので、
自分が作成したプログラムがだいたい50㌔バイトを占めていることになるようです。
ちなみに、プログラムはコメント込みで1500Lineぐらいですので
そんなに大したことはしていない感じですが、機能としては
WIFIでAPを開いて設定用のWEB画面を表示して
設定内容を消えないメモリ(micropythonのディスク?)へ格納
設定内容に接続先のWIFIのSSIDとか、パスワードとか
他パラメーター11種類が書いてあるのでそれを読みだし
自宅WIFIへ接続
制御用にWEBサーバーをネット上で開いて
ログイン等、全部で11画面
画面からの制御でGPIOを制御して外部装置を制御
後から何かエラーがわかるようにlog出力&ログローテーション
ログに時間を記録しないと何が何だかわからないのでntpと時刻同期
セキュリティー認証機能 暗号化はない
LEDによる状態通知
アクセスのないときに時々再起動
といった所です。
結構機能満載でしょう。