Moduulin toteuttaminen

Tämä luku kertoo yksityiskohtaisesti, miten MicroPythoniin toteutetaan ydinmoduuli. MicroPython-moduulit voivat olla yksi seuraavista:

  • Sisäänrakennettu moduuli: Yleinen moduuli, joka on osa MicroPython-repositoriota.

  • Käyttäjämoduuli: Moduuli, joka on hyödyllinen tiettyä projektiasi varten ja jota ylläpidät omassa repositoriossasi tai yksityisessä koodikannassasi.

  • Dynaaminen moduuli: Moduuli, joka voidaan ottaa käyttöön ja tuoda ajonaikaisesti laitteeseesi.

MicroPython-moduuli voidaan toteuttaa yhdessä seuraavista sijainneista:

  • py/: Ydinkirjasto, joka peilaa CPythonin ydintoiminnallisuutta.

  • extmod/: CPython- tai MicroPython-kohtainen moduuli, joka on jaettu useiden porttien kesken.

  • ports/<port>/: Porttikohtainen moduuli.

Muista

Tämä luku kuvaa py/-hakemistossa toteutetut moduulit eli ydinmoduulit. Katso MicroPythonin laajentaminen C-kielellä ulkoisen moduulin toteuttamisen yksityiskohtia varten. Porttikohtaisten moduulien yksityiskohtia varten katso MicroPythonin porttaaminen.

Ydinmoduulin toteuttaminen

CPythonin tapaan MicroPythonissa on sisäänrakennettuja ydinmoduuleja, joihin pääsee käsiksi import-lauseiden kautta. Esimerkki on gc-moduuli, jota käsitellään kohdassa Muistinhallinta.

>>> import gc
>>> gc.enable()
>>>

MicroPythonissa on useita muita sisäänrakennettuja standardi-/ydinmoduuleja kuten io, array jne. Uuden ydinmoduulin lisääminen edellyttää useita muutoksia.

Luo ensin C-tiedosto py/-hakemistoon. Tässä esimerkissä lisäämme hypoteettisen uuden moduulin subsystem tiedostoon modsubsystem.c:

#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

Toteutus sisältää määrittelyn kaikille moduuliin liittyville funktioille ja lisää funktiot moduulin globaaliin tauluun mp_module_subsystem_globals_table. Se myös luo moduuliobjektin mp_module_subsystem-määrittelyllä. Moduuli rekisteröidään sitten laajempaan järjestelmään MP_REGISTER_MODULE-makron kautta.

Muokatun MicroPythonin rakentamisen ja suorittamisen jälkeen moduulin pitäisi nyt olla tuotavissa:

>>> import subsystem
>>> subsystem.info()
42
>>>

info()-funktiomme palauttaa tällä hetkellä vain yhden luvun, mutta sitä voidaan laajentaa tekemään mitä tahansa. Vastaavasti tähän uuteen moduuliin voidaan lisätä lisää funktioita.