开发环境
- MCU:Pico1(无wifi版)
- 使用固件:自编译版本
- 开发环境:MacBook Pro Sonoma 14.5
- 开发工具:Thonny 4.1.6
- 开发语言:MicroPython 1.24
执行示例
- 在github上获取micropython,我使用的1.24版本(开发版生成固件暂时有问题)
- 可以在找到“micropython/examples/usercmodule/cexample”文件夹,这是官方给的一个示例,包括三个文件“examplemodule.c”、“micropython.cmake”、“micropython.mk”,可以直接执行如下指令,即可将该模块加入到固件中,就可以直接使用了。
# 在micropython目录下执行
make -j -C ports/rp2 BOARD=PICO USER_C_MODULES=../../examples/usercmodule/cexample/micropython.cmake
改造学习
- 在micropython同级目录创建了一个myModules文件夹,再创建了一个myHello文件夹,目录结构如下:
-micropython
-MyModules
--myhello
---hello.c
---micropython.cmake
---micropython.mk
# 设置目录
CHELLO_MOD_DIR := $(USERMOD_DIR)# 将咱们的C模块加入到 SRC_USERMOD中.
SRC_USERMOD += $(CHELLO_MOD_DIR)/hello.c
# 创建我们的C模块库
add_library(usermod_hello INTERFACE)# 把我们的模块加入到库中
target_sources(usermod_hello INTERFACE${CMAKE_CURRENT_LIST_DIR}/hello.c
)# 把我们的模块加入到目录中
target_include_directories(usermod_hello INTERFACE${CMAKE_CURRENT_LIST_DIR}
)# 把我们的模块链接到库中
target_link_libraries(usermod INTERFACE usermod_hello)
// 需要用到的包
#include "py/runtime.h"
#include <string.h>// 这是原来例子里带的一个加法函数
static mp_obj_t add_ints(mp_obj_t a_obj, mp_obj_t b_obj) {int a = mp_obj_get_int(a_obj);int b = mp_obj_get_int(b_obj);return mp_obj_new_int(a + b);
}
// 和上边这个函数是配套的,需要输入两个参数所以函数名带了个“2”
static MP_DEFINE_CONST_FUN_OBJ_2(add_ints_obj, add_ints);// 这是我新增的一个函数,实现返回一个字符串的操作
static mp_obj_t hello() {char str[] = "Hello, World!";return mp_obj_new_str(str, strlen(str));
}
// 和上边这个函数是配套的,不需要输入参数所以函数名带了个“0”
static MP_DEFINE_CONST_FUN_OBJ_0(hello_obj, hello);// 配置模块属性,这里需要注意xxhello,将会是我们在python中调用函数时需要import的名字
static const mp_rom_map_elem_t example_module_globals_table[] = {{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_xxhello) },{ MP_ROM_QSTR(MP_QSTR_add_ints), MP_ROM_PTR(&add_ints_obj) },{ MP_ROM_QSTR(MP_QSTR_hello), MP_ROM_PTR(&hello_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,
};// 注意里边的元素都是环环相扣的引用
MP_REGISTER_MODULE(MP_QSTR_xxhello, example_user_cmodule);
执行测试