Ein Modul implementieren¶
Dieses Kapitel beschreibt im Detail, wie man ein Kernmodul in MicroPython implementiert. MicroPython-Module können eines der folgenden sein:
Integriertes Modul: Ein allgemeines Modul, das Teil des MicroPython-Repositorys ist.
Benutzermodul: Ein Modul, das für Ihr spezifisches Projekt nützlich ist und das Sie in Ihrem eigenen Repository oder Ihrer privaten Codebasis pflegen.
Dynamisches Modul: Ein Modul, das zur Laufzeit auf Ihrem Gerät bereitgestellt und importiert werden kann.
Ein Modul in MicroPython kann an einem der folgenden Orte implementiert werden:
py/: Eine Kernbibliothek, die die Kernfunktionalität von CPython widerspiegelt.
extmod/: Ein CPython- oder MicroPython-spezifisches Modul, das portübergreifend gemeinsam genutzt wird.
ports/<port>/: Ein portspezifisches Modul.
Bemerkung
Dieses Kapitel beschreibt Module, die in py/ implementiert sind, also Kernmodule. Details zur Implementierung eines externen Moduls finden Sie unter MicroPython in C erweitern. Details zu portspezifischen Modulen finden Sie unter Portierung von MicroPython.
Ein Kernmodul implementieren¶
Wie CPython verfügt MicroPython über integrierte Kernmodule, auf die über import-Anweisungen zugegriffen werden kann. Ein Beispiel ist das in Speicherverwaltung behandelte Modul gc.
>>> import gc
>>> gc.enable()
>>>
MicroPython verfügt über mehrere weitere integrierte Standard-/Kernmodule wie io, array usw. Das Hinzufügen eines neuen Kernmoduls erfordert mehrere Änderungen.
Erstellen Sie zunächst die C-Datei im py/-Verzeichnis. In diesem Beispiel fügen wir ein hypothetisches neues Modul subsystem in der Datei modsubsystem.c hinzu:
#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
Die Implementierung enthält eine Definition aller mit dem Modul verbundenen Funktionen und fügt die Funktionen der globalen Tabelle des Moduls in mp_module_subsystem_globals_table hinzu. Außerdem wird das Modulobjekt mit mp_module_subsystem erstellt. Das Modul wird dann über das Makro MP_REGISTER_MODULE beim Gesamtsystem registriert.
Nach dem Erstellen und Ausführen des modifizierten MicroPython sollte das Modul nun importierbar sein:
>>> import subsystem
>>> subsystem.info()
42
>>>
Unsere Funktion info() gibt derzeit nur eine einzelne Zahl zurück, kann aber erweitert werden, um beliebige Aufgaben zu erledigen. Ebenso können diesem neuen Modul weitere Funktionen hinzugefügt werden.