MicroPython向module添加type的方法,以及向type添加function的方法都是按照定义好的固定框架进行添加。
module添加type的代码格式如下:
#include "stdint.h"
#include "stdio.h"
#include "py/obj.h"
#include "py/runtime.h"
#include "driver/gpio.h"
#include "key.h"
//#pragma pack (1)
typedef struct _key_obj_t
{
mp_obj_base_t base;
}key_obj_t;
STATIC key_obj_t My_key_obj;
STATIC mp_obj_t key_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args)
{
mp_arg_check_num(n_args, n_kw, 0, 0, true); //检查参数个数
key_obj_t *self = (key_obj_t*)&My_key_obj;
if (self->base.type == NULL)
{
self->base.type = &key_type;
}
return MP_OBJ_FROM_PTR(self);
}
mp_obj_t mp_get_key_state(mp_obj_t self_in)
{
//key_obj_t *self = self_in;
uint8_t key=0;
key=Get_Key_State();
return mp_obj_new_int(key);
}
mp_obj_t mp_set_key_state(mp_obj_t self_in,mp_obj_t state)
{
//key_obj_t *self = self_in;
uint8_t State = mp_obj_get_int(state);
Set_Key_State(State);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(get_key_state_obj, mp_get_key_state);
STATIC MP_DEFINE_CONST_FUN_OBJ_2(set_key_state_obj, mp_set_key_state);
STATIC const mp_rom_map_elem_t key_dict_table[] =
{
{ MP_ROM_QSTR(MP_QSTR_Get_key), MP_ROM_PTR(&get_key_state_obj) },
{ MP_ROM_QSTR(MP_QSTR_Set_key), MP_ROM_PTR(&set_key_state_obj) },
};
STATIC MP_DEFINE_CONST_DICT(key_locals_dict,key_dict_table);
const mp_obj_type_t key_type = {
.base={ &mp_type_type },
.name = MP_QSTR_key,
.make_new=key_make_new,
.locals_dict = (mp_obj_dict_t*)&key_locals_dict,
};
type类型在python中是类, 对应到c语言中要有一个已经配空间的结构体,就是用来表示对象的结构体。表示对象的结构体要包含一个mp_obj_base_t类型的元素,来表明它是一个对象。
关于MicroPython对象的相关解析可以参考C语言开发MicroPython模块(向module添加function)
在第8行进行了结构体的声明。
第12行进行该结构体的定义,从而经配空间,创建对象。
第14行创建make_new函数,type对象在创建时和module不一样就是,它必须把定义make_new。
第16行检查make_new的参数个数。
第17行就是将make_new要创建的对象通过指针来指向,我们之前创建的对象。注意:在此处也可以重新创建对象,而不用必须用指针指向之前的对象。但是在此处先行创建对象,然后用指针指向的好处是:在Python层,如果多出定义,多出引用的话,不会出现错误,而且不同的地方操作都是指向这个对象。从而减小上层应用的难度。
第22行,make_new返回创建的对象。
第25行和33行创建type的 function。
第41行和第42行,创建function对象
第44行构建function对象数组。
第45行创建包含function对象数组的字典对象
第51行,创建type对象。
type对象创建完成之后,就可以像module添加function的方法一样,将type添加到module里面。