实现一个模块

本章详细介绍了如何在 MicroPython 中实现一个核心模块。MicroPython 模块可以是以下之一:

  • 内置模块:属于 MicroPython 存储库一部分的通用模块。

  • 用户模块:对您在自己的存储库或私有代码库中维护的特定项目有用的模块。

  • 动态模块:可以在运行时部署和导入设备的模块。

MicroPython 中的模块可以在以下位置之一实现:

  • py/: 一个反映核心 CPython 功能的核心库。

  • extmod/: 跨多个端口共享的 CPython 或 MicroPython 特定模块。

  • 端口/<端口>/:特定于端口的模块。

笔记

本章介绍在 py/或核心模块中实现的模块。有关实现外部模块的详细信息,请参阅用 C 扩展 MicroPython 。有关特定于端口的模块的详细信息,请参阅 移植 MicroPython

实现核心模块

与 CPython 一样,MicroPython 具有可以通过 import 语句访问的核心内置模块。一个例子是gc内存管理中讨论的模块。

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

MicroPython有几个其他内置标准/核心模块喜欢 io, uarray等添加一个新的核心模块包括几个修饰。

首先, Cpy/目录中创建文件。在这个例子中,我们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, MICROPY_PY_SUBSYSTEM);

#endif

该实现包括与模块相关的所有函数的定义,并将函数添加到模块的全局表中 mp_module_subsystem_globals_table。它还使用mp_module_subsystem. 然后通过 MP_REGISTER_MODULE宏将模块注册到更广泛的系统。

构建并运行修改后的 MicroPython 后,该模块现在应该是可导入的:

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

我们的info() 函数目前只返回一个数字,但可以扩展为做任何事情。同样,可以向这个新模块添加更多功能。