Реалізація модуля

Цей розділ детально описує, як реалізувати основний модуль у MicroPython. Модулі MicroPython можуть бути одного з наступних видів:

  • Вбудований модуль: загальний модуль, що є частиною репозиторію MicroPython.

  • Модуль користувача: модуль, корисний для вашого конкретного проєкту, який ви підтримуєте у власному репозиторії або приватній кодовій базі.

  • Динамічний модуль: модуль, що може бути розгорнутий та імпортований під час виконання на ваш пристрій.

Модуль у MicroPython може бути реалізований в одному з наступних місць:

  • py/: основна бібліотека, що відображає основні функції CPython.

  • extmod/: специфічний для CPython або MicroPython модуль, що є спільним для кількох портів.

  • ports/<port>/: специфічний для порту модуль.

Примітка

Цей розділ описує модулі, реалізовані у py/, або основні модулі. Дивіться Розширення MicroPython на C для отримання деталей щодо реалізації зовнішнього модуля. Для деталей про специфічні для порту модулі дивіться Портування MicroPython.

Реалізація основного модуля

Як і CPython, MicroPython має основні вбудовані модулі, до яких можна отримати доступ через інструкції import. Прикладом є модуль gc, описаний у Керування пам’яттю.

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

MicroPython має кілька інших вбудованих стандартних/основних модулів, таких як io, array тощо. Додавання нового основного модуля передбачає кілька змін.

Спочатку створіть файл C у директорії py/. У цьому прикладі ми додаємо гіпотетичний новий модуль subsystem у файлі 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

Реалізація включає визначення всіх функцій, пов’язаних з модулем, і додає функції до глобальної таблиці модуля в mp_module_subsystem_globals_table. Вона також створює об’єкт модуля за допомогою mp_module_subsystem. Потім модуль реєструється в більш широкій системі через макрос MP_REGISTER_MODULE.

Після збирання та запуску модифікованого MicroPython модуль має стати доступним для імпорту:

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

Наша функція info() наразі повертає лише одне число, але може бути розширена для виконання будь-яких дій. Аналогічно, до цього нового модуля можна додати більше функцій.