本文详细介绍如何在MicroPython中实现一个核心模块,MicroPython模块可以是下面的其中之一:
- 内置模块:作为 MicroPython 资源库一部分的通用模块。
- 用户模块:对您的特定项目有用的模块,由您在自己的资源库或私人代码库中维护。
- 动态模块:可在设备运行时部署和导入的模块。
MicroPython 中的模块可在以下位置实现:
- py/:反映 CPython 核心功能的核心库。
- extmod/:跨多个移植共享的 CPython 或 MicroPython 专用模块。
- ports//:特定于移植的模块。
实现核心模块
与CPython类似,MicroPython 也有核心内置模块,可以通过import
语句访问。内存管理中讨论的gc
模块就是一个例子。
>>> import gc
>>> gc.enable()
>>>
MicroPython 还有其他一些内置的标准/核心模块,如 io、数组等。添加新的核心模块需要进行一些修改。
首先,在py/
目录下创建C
文件。本例会在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()函数只返回一个数字,但可以扩展到任何功能。同样,这个新模块还可以添加更多的函数。