Implementera en modul#

Detta kapitel beskriver hur man implementerar en kärnmodul i MicroPython. MicroPython-moduler kan vara någon av följande:

  • Inbyggd modul: En allmän modul som är en del av MicroPython-förrådet.

  • Användarmodul: En modul som är användbar för ditt specifika projekt och som du underhåller i ditt eget förråd eller din privata kodbas.

  • Dynamisk modul: En modul som kan distribueras och importeras vid körning till din enhet.

En modul i MicroPython kan implementeras på någon av följande platser:

  • py/: Ett kärnbibliotek som speglar CPythons kärnfunktionalitet.

  • extmod/: En CPython- eller MicroPython-specifik modul som delas över flera portar.

  • ports/<port>/: En portspecifik modul.

Observera

Detta kapitel beskriver moduler som implementeras i py/ eller kärnmoduler. Se Utöka MicroPython i C för information om att implementera en extern modul. För information om portspecifika moduler, se Portera MicroPython.

Implementera en kärnmodul#

Precis som CPython har MicroPython inbyggda kärnmoduler som kan nås via import-satser. Ett exempel är modulen gc som diskuteras i Minneshantering.

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

MicroPython har flera andra inbyggda standard-/kärnmoduler som io, array med flera. Att lägga till en ny kärnmodul kräver flera ändringar.

Skapa först C-filen i katalogen py/. I det här exemplet lägger vi till en hypotetisk ny modul subsystem i filen 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

Implementationen innehåller en definition av alla funktioner som hör till modulen och lägger till funktionerna i modulens globala tabell i mp_module_subsystem_globals_table. Den skapar även modulobjektet med mp_module_subsystem. Modulen registreras sedan med det större systemet via makrot MP_REGISTER_MODULE.

Efter att den modifierade MicroPython har byggts och körts bör modulen nu gå att importera:

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

Vår info()-funktion returnerar för närvarande bara ett enda tal men kan utökas till att göra vad som helst. På liknande sätt kan fler funktioner läggas till i denna nya modul.