定义打印的方法
定义函数
其中括号内不写入参数,表示无参数的方法,引入该方法后,直接打印 “Test function”
在 MicroPython 中,使用 mp_obj_t
类型来表示 Python 对象,因此 lv_print
函数返回的是一个 mp_obj_t
类型的对象。
// 1. 定义 C 方法
STATIC mp_obj_t lv_print(){
printf("Test function \n");
return mp_const_none; // 表示 Micropython 中不返回
}
转换为micripython的方法对象
MP_DEFINE_CONST_FUN_OBJ_0
是 MicroPython 提供的宏定义,用于定义一个不带参数的 C 函数对象,其语法为:
// 2. 转换成 Micropython 方法对象
MP_DEFINE_CONST_FUN_OBJ_0(lv_print_obj, lv_print);
其中,name
是定义的函数对象的名称,func
是该函数对象对应的 C 函数名。
因此,MP_DEFINE_CONST_FUN_OBJ_0(lv_print_obj, lv_print)
定义了一个名为 lv_print_obj
的函数对象,它对应的 C 函数名为 lv_print
,并且该函数对象不带参数。
将定义的方法加到字典中
// 1. 创建模块字典 MP_QSTR_ __name__
// 方法定义的3. 加入到字典中
STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_print), MP_ROM_PTR(&lv_print_obj) }, // 无参数方法
{
// 2. 将元素数组转换成字典对象
STATIC MP_DEFINE_CONST_DICT(lvgl_globals, lvgl_globals_table); // 转换成字典对象
// 3. 定义模块
const mp_obj_module_t mp_mod_lvgl = {
.base = { &mp_type_module }, // 类型指向(模块的类型恒定为 &mp_type_module)
.globals = (mp_obj_dict_t *)&lvgl_globals, // 指向字典
};
// 4. 注册模块到系统
MP_REGISTER_MODULE(MP_QSTR_lvgl, mp_mod_lvgl);
定义打印内容的方法
STATIC mp_obj_t lv_hello(mp_obj_t name){
const char * _name = mp_obj_str_get_str(name);
printf("hello %s\n", _name);
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_1(lv_hello_obj, lv_hello);
STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_hello), MP_ROM_PTR(&lv_hello_obj) },
}
与上述步骤大同小异,只是在第一部分的方法定义的内容是进行了扩充:
这段代码是定义了一个名为 lv_hello
的函数,它接受一个参数 name
,并将其转换为 C 字符串类型后打印 "hello" 和参数值。最后返回 mp_const_none
对象。
在函数 lv_hello
中,使用了 MicroPython 提供的 mp_obj_str_get_str
函数来将参数 name
转换为 C 字符串类型。该函数返回一个指向参数字符串的指针。
MP_DEFINE_CONST_FUN_OBJ_1
宏定义用于定义一个带有一个参数的 C 函数对象,其语法为:
MP_DEFINE_CONST_FUN_OBJ_1(name, func)
其中,name
是定义的函数对象的名称,func
是该函数对象对应的 C 函数名。
因此,MP_DEFINE_CONST_FUN_OBJ_1(lv_hello_obj, lv_hello)
定义了一个名为 lv_hello_obj
的函数对象,它对应的 C 函数名为 lv_hello
,并且该函数对象带有一个参数。