MICROPYTHON添加自定义模块
MicroPython external C modules
在开发用于Micropython的模块时,您可能会遇到Python环境的限制,通常是由于无法访问某些硬件资源或Python速度限制。
如果您的限制无法通过:ref: ’ speed_python '解决,用C语言编写部分或全部模块是一个可行的选择。
如果您的模块设计为访问或使用通常可用的硬件或库请考虑在MicroPython中实现它源代码树与类似的模块一起,并将其作为拉请求提交。然而,如果你的目标是模糊的或专有的系统,它可能使将其放在主Micropython库之外更有意义。
本章描述了如何将这些外部模块编译成MicroPython可执行文件或固件镜像。
另一种方法是使用:ref: ’ natmod ',它允许编写自定义C放在.mpy文件中的代码,可以动态地导入到一个运行中的Micropython系统,不需要重新编译主固件。
外部C模块的结构
MicroPython用户C模块是一个包含以下文件的目录:
“.c “和”.H” 源代码文件。
这些模块的实现通常要包含miccroPython 函数
目前编写这些函数/模块的最佳参考是在MicroPython中查找类似的模块并将它们用作示例。
*“micropython。mk “包含此模块的Makefile片段。
$(USERMOD_DIR)
micropython。可作为通往你的编译模块路径。因为它是为每个c模块重新定义的,所以在你的makfile中他是一个局部变量。例如“EXAMPLE_MOD_DIR:= $(USERMOD_DIR)”
“micropython.mk ‘必须将你的C文件添加到编译目标.例如:编译目标expample.c的需要加入一下参数:SRC_USERMOD += $(EXAMPLE_MOD_DIR)/example.c
如果你有自定义的“CFLAGS”设置或包括文件夹来定义,这些应该添加到’ ’ CFLAGS_USERMOD ’ '。
下面是完整的用法示例。
这个名为example的简单模块提供了一个函数的例子。add_ints(a, b) 将两个整数args相加并返回结果。
Directory::
example/
├── example.c
└── micropython.mk
example.c
#include "py/obj.h"
#include "py/runtime.h"
#include "py/builtin.h"
// 这个函数将会以example.add_ints(a, b) 调用.
STATIC mp_obj_t example_add_ints(mp_obj_t a_obj, mp_obj_t b_obj) {
// 从microPython中 抽取int对象
int a = mp_obj_get_int(a_obj);
int b = mp_obj_get_int(b_obj);
// 计算并返回microPython对象
return mp_obj_new_int(a + b);
}
//为上面的函数定义一个Python引用
STATIC MP_DEFINE_CONST_FUN_OBJ_2(example_add_ints_obj, example_add_ints);
//定义模块的所有属性
//数组定义,函数名参数列表
//所用标识符都定义为MP_QSTR_XXX(一般脚本生成)
//内存对齐一般位四字节
STATIC const mp_rom_map_elem_t example_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_example) },
{ MP_ROM_QSTR(MP_QSTR_add_ints), MP_ROM_PTR(&example_add_ints_obj) },
};
STATIC MP_DEFINE_CONST_DICT(example_module_globals, example_module_globals_table);
// 定义模块调用目标
const mp_obj_module_t example_user_cmodule = {
.base = { &mp_type_module },
.globals = (mp_obj_dict_t*)&example_module_globals,
};
//注册该模块,使其在Python中可用
MP_REGISTER_MODULE(MP_QSTR_example, example_user_cmodule, MODULE_EXAMPLE_ENABLED);
micropython.mk
EXAMPLE_MOD_DIR := $(USERMOD_DIR)
# 添加所有的需要编译的c文件
SRC_USERMOD += $(EXAMPLE_MOD_DIR)/example.c
# 添加模块编译所需目录
# 这个示例并不需要
CFLAGS_USERMOD += -I$(EXAMPLE_MOD_DIR)
编译文件到固件
更根据自己的所用芯片略有不同