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による状態通知

 アクセスのないときに時々再起動

といった所です。

結構機能満載でしょう。