2018年05月06日

フローズンモジュールを使う(RPiベアメタルMicroPython)

frozenmodule.png

RAMディスクが使えるようになったので、このPythonスクリプトをMicroPythonの起動時に自動実行させてみます。

フラッシュやSDカードを外部ストレージとして使える場合は、そのストレージに「boot.py」「main.py」というファイル名でスクリプトを保存しておけば、起動時に「boot.py」→「main.py」の順で実行されます。

ですが、作成中のRPiベアメタル版MicroPythonは、起動時に使えるストレージはありません。むしろそれが無いために、代用でRAMディスクを用意したのでした。

外部ストレージを持たないシステムでも、Pythonスクリプトを実行するための仕組みとして、MicroPythonには「フローズン・モジュール」という仕組みがあります。
この仕組みを使うと、PythonスクリプトをMicroPythonのファームウェア内に追加することができます。

スクリプトは、ソースコード形式およびコンパイル済みのバイトコード形式が使えます。

MicroPythonの実装でフローズン・モジュール関連の処理を有効にするには、ソースコードに

共通:
・マクロ「MICROPY_READER_VFS (MICROPY_VFS)」を定義(mpconfigport.hの中で)

ソースコード形式:
・マクロ「FROZEN_DIR」にソースコード形式のスクリプトのディレクトリを設定
・マクロ「MICROPY_MODULE_FROZEN_STR」を定義(一般的には、mpconfigport.hの中で)

バイトコード形式:
・マクロ「FROZEN_MPY_DIR」にバイトコード形式のスクリプトのディレクトリを設定
・マクロ「MICROPY_MODULE_FROZEN_MPY」「MICROPY_QSTR_EXTRA_POOL=mp_qstr_frozen_const_pool」を定義(一般的には、mpconfigport.hの中で)

を追加します。

フローズンモジュールの実行は
pyexec_frozen_module("ファイル名");
です。
モジュールがソースコード形式でもバイトコード形式でも区別はありません。

今回は、以下のようなコードを起動時に実行するようにしました。
1MBのRAMディスクを作成してルートにマウントし、そこへ'RAM disk.txt'というファイルを作成しています。

このスクリプトをMicroPythonの移植ソースがあるディレクトリ直下の「modules」へ配置し、バイトコード化して、main()の中から呼び出しています。

フローズンモジュールを有効にするために必要な、MICROPY_MODULE_FROZEN_STRやMICROPY_MODULE_FROZEN_MPYの定義は、STM32の実装を参考に、mpconfigport.hではなくMakefileの中で行いました。
この方法のメリットは、フローズンモジュールの利用の有無をMakefileの書き換えだけで設定できることです。

このフローズンモジュールの仕組みですが、概ね以下のようになっているようです。

・フローズンモジュールのバイトコードの生成はクロスコンパイラ(mpy-cross)で行う
・フローズンモジュール(ソースコード形式およびバイトコード形式)をMicroPythonに埋め込むためのCコードは、自動生成されてbuild/へ配置(frozen.c、frozen_mpy.c)
・このCコードには、外部から関数を検索・参照するための定数が含まれる(ソースコードフローズンモジュールはmp_frozen_str_names[]/mp_frozen_str_sizes[]/mp_frozen_str_content[]、バイトコードフローズンモジュールはmp_frozen_mpy_names[]/mp_frozen_mpy_content[])
・実行時にコードを参照するためにvfsの関数が使われている(らしい)

ゴールデンウイークも今日で終わりなので、次に集中して作業できるのは夏休みでしょうか。
あと、予定としては

・I2C
・SPI
・PWM
・I2S
・SDカード
・Pin AFクラス
・UARTクラス
・USBホストクラス
・USBデバイスクラス
・スクリーンコンソール
・グラフィックスライブラリの整備
・チュートリアルの整備
・サーボモータドライバ
・NeoPixelドライバ
・WizNetドライバ
・test suiteへの対応
・RPi2や3への対応
・Raspbianへの移植

といったことをやりたいなと思っているのですが、依存関係を考えるとまずはPin AFクラスの実装が必要な気がします。


ラベル:MicroPython
posted by boochow at 19:00| Comment(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
人気記事