为CircuitPython编写专用的C功能模块
动机¶
自己的机械键盘需要一个高效、无阻塞的扫键模块,Makerdiary的既有实现不能满足我的需求。
结构¶
通过参考 keypad
、digitalio
以及Makerdiary的 matrix
模块,我发现对于CircuitPython 7.x 有如下的代码结构安排:
shared-bindings
:存放模块Python接口的定义,和为Python开发C模块很像;shared-module
:实现与平台无关的模块存放其具体实现的地方;ports/*/common-hal
:实现与平台无关的模块存放其具体实现的地方;ports/*/boards
:某类平台的板极定义,可以用来调整特定板子的编译配置;py/circuitpy_defns.mk
:大概是整体编译配置,通过添加内容让编译工具识别到添加的代码;py/circuitpy_mpconfig.mk
:大概是整体编译选项配置,通过添加内容可以添加所需的选项开关;
那么实现某个模块的流程大致如下:
- 确认Python接口,并将初步定义在
shared-bindings
中创建好; - 确认该模块是否与平台强相关:
- 若只需CircuitPython标准接口或其它模块暴露的接口,可以将实现放在
shared-module
中; - 若确认实现与平台相关、用到了部分HAL提供的特殊方法,可以将实现放在对应的
ports/*/common-hal
中;
- 若只需CircuitPython标准接口或其它模块暴露的接口,可以将实现放在
- 实现模块具体细节;
- 修改
py/circuitpy_defns.mk
和py/circuitpy_mpconfig.mk
以添加对应模块的配置信息; - 修改
ports/*/boards
中对应开发板的配置,开启所需模块; - 编译、测试与后续工作;