SDカード上のmain.pyを実行する(RPiベアメタルMicroPython)

ベアメタルRaspberry PiのMicroPythonでSDカードの書き込みができるようになったので、起動時にSDカードをルートディレクトリにマウントするように変更しました。

他のマイコン(STM32、ESP8266、ESP32等)のMicroPythonでは、内蔵フラッシュの一部をファイル保存領域として使用し、起動時にその領域をマウントするようになっています。

Raspberry Piは内蔵フラッシュではなくSDカードにファイルを保存しますので、起動時にSDカードをマウントするのが理に適っています。

これまではSDカードが読み込みしかできなかったので、SDカードをルートにマウントすると全体が書き込み不可になってしまうのを防ぐため、ルートはRAMディスクを作成し、SDカードは/sdにマウントしていました。
さらに、RAMディスク自体をMicroPythonで実装していたため、そのコードを読み込むためにフローズンモジュールを使うというややこしいことをしていました。

今回はこれを本来の形に戻し、フローズンモジュールで行っていたことをSDカード上のスクリプトで実行するようにしました。

MicroPythonは、起動時にストレージからboot.pyを読んで実行し、次にmain.pyを実行します。
この流れはMicroPython本体ではなく、各プラットフォームへのportで実装されていますので、他のプラットフォームのmain.cの内容を見ながら実装しました。

実装中に一つ引っかかったのは、スクリプトのサーチパスの設定です。
サーチパスはsysモジュールの変数pathにディレクトリのリストとして記述されていますが、その初期値は他のプラットフォームの実装では

mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_lib));

のような形で与えられています。
これはsys.path.append('/lib')と同等の処理になっているはずですが、コピペしてもMP_QSTR__slash_lib'/lib'に変換されないのでしばらく悩みました。

結局、他のプラットフォームでの実装をよくよく見ると、qstrdefsport.h というファイルでQ(/lib)というマクロを実行しており、これが無いと上記の変換が行われないのでした。
Cのシンボルに使用できない文字を含む文字列は、qstrdefsport.hの中で宣言しなければならないようです。

今回の実装を使って、main.pyでRaspberry PiのフレームバッファにREPLを表示させるコードを実行させてみました。
ファイル構成は

/sd/main.py
/sd/lib/fbconsole.py
/sd/lib/rpi.py

としました。

main.pyの中身は

となっています。
fbconsole.pyは前回の記事で紹介したものです。

rpi.pyはRaspberry Piのフレームバッファをframebufクラスのオブジェクトとして扱えるようにするもので、以下の内容が入っています。

以前の記事「Raspberry Piの画面をMicroPythonのコンソールにしてみた」のコードをほぼそのまま流用しています。

コメント