モジュールの実装方法¶
この章では、MicroPython でコアモジュールを実装する方法について説明します。MicroPython のモジュールは、以下のいずれかになります:
組込みモジュール: MicroPython リポジトリの一部である汎用モジュールです
ユーザーモジュール: 特定のプロジェクトに役立つモジュールで、自分のリポジトリまたはプライベートコードベースで管理します。
ダイナミックモジュール: 実行時にデバイスにデプロイしてインポートできるモジュールです。
MicroPython のモジュールは次のいずれかの場所に実装できます:
py/: CPythonのコア機能を反映したコアライブラリです。
extmod/: 複数のポートで共有される CPython または MicroPython 固有のモジュールです。
ports/<port>/: ポートに固有のモジュールです。
注釈
この章では py/
またはコアモジュールで実装されたモジュールについて説明します。外部モジュールの実装については C言語による MicroPython の拡張 を参照してください。ポート専用モジュールの詳細については MicroPythonの移植 を参照してください。
コアモジュールの実装方法¶
CPython と同様に、MicroPython にもコアとなる組込みモジュールがあり、import 文でアクセスできます。例として、 メモリー管理 で取り上げた gc
モジュールの場合について示します。
>>> import gc
>>> gc.enable()
>>>
MicroPython には、他にも io
や array
などの標準/コアモジュールがいくつか組み込まれています。新しいコアモジュールの追加にはいくつかの修正が必要です。
まず、 py/
ディレクトリに C ファイルを作成します。この例では odsubsystem.c
というファイルに、仮想的な新しいモジュール subsystem
を追加しています:
#include "py/builtin.h"
#include "py/runtime.h"
#if MICROPY_PY_SUBSYSTEM
// info()
static mp_obj_t py_subsystem_info(void) {
return MP_OBJ_NEW_SMALL_INT(42);
}
MP_DEFINE_CONST_FUN_OBJ_0(subsystem_info_obj, py_subsystem_info);
static const mp_rom_map_elem_t mp_module_subsystem_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_subsystem) },
{ MP_ROM_QSTR(MP_QSTR_info), MP_ROM_PTR(&subsystem_info_obj) },
};
static MP_DEFINE_CONST_DICT(mp_module_subsystem_globals, mp_module_subsystem_globals_table);
const mp_obj_module_t mp_module_subsystem = {
.base = { &mp_type_module },
.globals = (mp_obj_dict_t *)&mp_module_subsystem_globals,
};
MP_REGISTER_MODULE(MP_QSTR_subsystem, mp_module_subsystem);
#endif
実装は、モジュールに関連するすべての関数の定義を含み、関数を mp_module_subsystem_globals_table
のモジュールのグローバルテーブルに追加します。また、 mp_module_subsystem
でモジュールオブジェクトを作成します。そして、 MP_REGISTER_MODULE
マクロにより、モジュールはより広いシステムに登録されます。
修正した MicroPython をビルドして実行すると、モジュールをインポートできるようになります:
>>> import subsystem
>>> subsystem.info()
42
>>>
info()
関数は現在のところ1つの数値を返すだけですが、他にも何かできるように拡張できます。同様にして、より多くの関数をこの新しいモジュールに追加できます。