Micropython 扩展C模块<HelloWorld>

发布于:2024-12-18 ⋅ 阅读:(41) ⋅ 点赞:(0)

开发环境

  • MCU:Pico1(无wifi版)
  • 使用固件:自编译版本
  • 开发环境:MacBook Pro Sonoma 14.5
  • 开发工具:Thonny 4.1.6
  • 开发语言:MicroPython 1.24

执行示例

  1. 在github上获取micropython,我使用的1.24版本(开发版生成固件暂时有问题)
  2. 可以在找到“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
  • micropython.mk文件初探
# 设置目录
CHELLO_MOD_DIR := $(USERMOD_DIR)

# 将咱们的C模块加入到 SRC_USERMOD中.
SRC_USERMOD += $(CHELLO_MOD_DIR)/hello.c
  • micropython.cmake文件初探
# 创建我们的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)
  • hello.c文件初探
// 需要用到的包
#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);

执行测试

  • 重新打包编译烧录并执行代码,执行如下


网站公告

今日签到

点亮在社区的每一天
去签到