为CircuitPython编写专用的C功能模块

Table of contents

动机

自己的机械键盘需要一个高效、无阻塞的扫键模块,Makerdiary的既有实现不能满足我的需求。

结构

通过参考 keypaddigitalio 以及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:大概是整体编译选项配置,通过添加内容可以添加所需的选项开关;

那么实现某个模块的流程大致如下:

  1. 确认Python接口,并将初步定义在 shared-bindings 中创建好;
  2. 确认该模块是否与平台强相关:
    1. 若只需CircuitPython标准接口或其它模块暴露的接口,可以将实现放在 shared-module 中;
    2. 若确认实现与平台相关、用到了部分HAL提供的特殊方法,可以将实现放在对应的 ports/*/common-hal 中;
  3. 实现模块具体细节;
  4. 修改 py/circuitpy_defns.mkpy/circuitpy_mpconfig.mk 以添加对应模块的配置信息;
  5. 修改 ports/*/boards 中对应开发板的配置,开启所需模块;
  6. 编译、测试与后续工作;