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.

Anteckning

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.