開發環境
- 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);
執行測試
