micropython用c添加接口——添加module
定义一个module相对来说比较简单,下面分几个步骤详细说明一下:
第一步:在ports/esp32文件夹下新建一个文件modtest.c (如果你是在其他平台而非esp32 请在对应文件夹下新建文件)
下面打开该文件我们输入以下内容,来实现一个最简单的module
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include "stdint.h" #include "stdio.h" #include "py/obj.h" #include "py/runtime.h" //定义的modtest全局字典,之后我们添加type和function就要添加在这里 STATIC const mp_rom_map_elem_t modtest_globals_table[] = { {MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_modtest)}, //这个对应python层面的__name__ 属性 }; //这个可以认为是把modtest_globals_table注册到 mp_module_modtest.globals里面去 STATIC MP_DEFINE_CONST_DICT(mp_module_modtest_globals, modtest_globals_table); //这个是定义一个module类型 const mp_obj_module_t mp_module_modtest = { .base = {&mp_type_module}, .globals = (mp_obj_dict_t *)&mp_module_modtest_globals, }; |
可以看到modtest.c主要有三个部分,这三个部分是添加一个module必须要有的,可以打开官方的其他module文件,都是遵循这样的一个模型
- mp_rom_map_elem_t modtest_globals_table[]
- MP_DEFINE_CONST_DICT(mp_module_modtest_globals, modtest_globals_table)
- mp_obj_module_t mp_module_modtest
这样一个简单的module已经定义好了。但是我们现在也仅仅是一个单独的c文件,还没有添加到编译文件里面,外部现在也没办法调用他
第二步:毫无意外,要把module.c添加到Makefile文件中去
打开Makefile找到如下脚本的地方,按照格式添加modtest.c就可以了:
1 2 3 4 5 6 |
SRC_C = \ main.c \ uart.c \ ………… modtest.c\ $(SRC_MOD) |
第三步:我们要把我们定义的module注册到micropython中去,这个是在mpconfigport.h文件中修改
找到MICROPY_PORT_BUILTIN_MODULES 定义的地方按照格式添加我们定义的module
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
extern const struct _mp_obj_module_t mp_module_machine; extern const struct _mp_obj_module_t mp_module_network; extern const struct _mp_obj_module_t mp_module_onewire; extern const struct _mp_obj_module_t mp_module_modtest; //这个是我们添加的,需要声明一下应用外部的struct #define MICROPY_PORT_BUILTIN_MODULES \ { MP_OBJ_NEW_QSTR(MP_QSTR_esp), (mp_obj_t)&esp_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_esp32), (mp_obj_t)&esp32_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_utime), (mp_obj_t)&utime_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_uos), (mp_obj_t)&uos_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_usocket), (mp_obj_t)&mp_module_usocket }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_machine), (mp_obj_t)&mp_module_machine }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_network), (mp_obj_t)&mp_module_network }, \ { MP_OBJ_NEW_QSTR(MP_QSTR__onewire), (mp_obj_t)&mp_module_onewire }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_uhashlib), (mp_obj_t)&mp_module_uhashlib }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_modtest), (mp_obj_t)&mp_module_modtest }, \ //这个是我们添加的modtest |
这里实际上需要我们添加的代码也就两行,第一行不用解释了吧,应用外部定义的结构体。第二个需要解释一下下,MP_QSTR_modtest这个名字要改成自定义的,MP_QSTR_这个一定要保留,后面的modtest就是在python中显示的module名字。
make编译一下,再使用make deploy烧录进esp32。执行一下代码,如下图所示可以看到我们添加的modtest 模块已经成功了,只是现在这个module内部没有添加任何type和function,只能看看而已。下一篇我会讲下如何在module中添加function