markdown/circuitpython.md
2025-03-11 14:56:06 +08:00

3.6 KiB

circuitpython如何添加c模块(version9.0.x)

circuitpython是基于micropython写的所以,而micropython又是基于python的,所以要俩姐一下关于import < module >大体的结构 ##circuitpython结构 首先在circuitpython/port里面选着芯片,然后在使用make BOARD=< 芯片名称 >.
以esp为例,里面会有个common-hal文件,这里面是c语言实现的特定芯片功能的函数,在circuitpython/shred-bindings里面会写有这些特定功能的接口,而每一个芯片都会调用这里面的c模块,从而实现在python里面面调用这些模块,里面的命名也是有规则的.
以anlogio为例,在shared-binding里面都有统一调用函数

static mp_obj_t analogio_analogin_obj_get_value(mp_obj_t self_in) {
analogio_analogin_obj_t *self = MP_OBJ_TO_PTR(self_in);
check_for_deinit(self);
return MP_OBJ_NEW_SMALL_INT(common_hal_analogio_analogin_get_value(self));
}

common_hal_analogio_analogin_get_value就是对于每一种芯片来调用的common_hal文件的命名

uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) 

我们会发现函数的命名和shared-binding中嵌套的函数是一样的
board->shared-bindings->common_hal->function 这是circuitpython里面规范,对于自己的模块我们可以写的宽松一点 ##1.先创建一个文件 mkdir <你的文件名>
创建 *.c和 *.h文件 ##2.在 *.c文件里面注册模块 ###函数模块 对于内部函数(即不对外使用的函数)就直接基于语言编写代码(特别注意对于esp-idf的头文件只需要直接包含需要头文件即可,路径已经设置好了)

对于需要在外调用的函数就需要一下操作了(头文件#include "py/obj.h" "py/runtime.h") #####1.先创建模块(module) STATIC const mp_rom_map_elem_t mytest_globals_table[] = { {MP_OBJ_NEW_QSTR(MP_QSTR__name__),MP_ROM_QSTR(MP_QSTR_mytest)}, };

/*对于module来说,在python中调用的是mytest(模块名称)
MP_QSTR__name__(不可以改)对应MP_QSTR_mytest(小写区域可以改)
对于每一个module,type,function都要有个MP_QSTRT_<名称>
而下面的命名没做要求,但也最好按照这种方式写
*/

STATIC MP_DEFINE_CONST_DICT(mp_module_mytest_globals, mytest_globals_table);

// Define module object.
const mp_obj_module_t mp_module_mytest = {
	.base = { &mp_type_module },
	.globals = (mp_obj_dict_t *)&mp_module_mytest_globals,
};

//注册模块
MP_REGISTER_MODULE(MP_QSTR_mytest, mp_module_mytest);

这几个步骤缺一不可(注意只要是以MP_QSTR开头的都要注意一下命名) #####2.创建type(如果只想使用function可以不弄这一步) STATIC const mp_rom_map_elem_t test_locals_dict_table[] = { };//这个是装函数的地方

//定义字典的宏定义
STATIC MP_DEFINE_CONST_DICT(test_locals_dict,test_locals_dict_table);

MP_DEFINE_CONST_OBJ_TYPE(
mytest_test_type,
MP_QSTR_test,
MP_TYPE_FLAG_NONE,
locals_dict, &test_locals_dict
);

如何构建

Windows Subsystem for Linux (WSL) Setup | Building CircuitPython | Adafruit Learning System

使用wsl进行设置

Build CircuitPython | Building CircuitPython | Adafruit Learning System

如何构建espidf

乐鑫构建 |构建 CircuitPython |Adafruit 学习系统

构建circuitpython

Introduction | Building CircuitPython | Adafruit Learning System