micropython用c添加接口——添加module

定义一个module相对来说比较简单,下面分几个步骤详细说明一下:

第一步:在ports/esp32文件夹下新建一个文件modtest.c (如果你是在其他平台而非esp32 请在对应文件夹下新建文件)

下面打开该文件我们输入以下内容,来实现一个最简单的module

#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文件,都是遵循这样的一个模型

  1. mp_rom_map_elem_t modtest_globals_table[]
  2. MP_DEFINE_CONST_DICT(mp_module_modtest_globals, modtest_globals_table)
  3. mp_obj_module_t mp_module_modtest

这样一个简单的module已经定义好了。但是我们现在也仅仅是一个单独的c文件,还没有添加到编译文件里面,外部现在也没办法调用他

第二步:毫无意外,要把module.c添加到Makefile文件中去

打开Makefile找到如下脚本的地方,按照格式添加modtest.c就可以了:

SRC_C = \
	main.c \
	uart.c \
        …………
	modtest.c\
	$(SRC_MOD)

 

第三步:我们要把我们定义的module注册到micropython中去,这个是在mpconfigport.h文件中修改

找到MICROPY_PORT_BUILTIN_MODULES 定义的地方按照格式添加我们定义的module

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

micropython用c添加接口——添加module

 


转载请注明转自电子创客营:micropython用c添加接口——添加module! 了解我们点击这里
喜欢 (0)or分享 (0)
电子创客营
关于作者:
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址