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