本文已参与「新人创作礼」活动,一起开启掘金创作之路。
为micropython添加全局模块(2)
进一步调试
通过各种比较代码, 比较同mimxrt的移植和多年前的参考代码, 最终通过如下操作实现了预期的功能.
在mpconfigport.h文件中注册新模块
在mpconfigport.h文件中添加代码如下:
extern const struct _mp_obj_module_t led_module;
#define MICROPY_PORT_BUILTIN_MODULES \
{ MP_ROM_QSTR(MP_QSTR_led), MP_ROM_PTR(&led_module) }, \
通过编译之后, 下载firmware到电路板上, 复位后通过终端命令行交互, 能够成功识别led模块, 并且在板子上确实看到led灯受控亮灭了.
这句话顾名思义是向系统中注册可以识别的模块的. 同官方文档中的最后一步封装注册的操作MP_REGISTER_MODULE相似, 但貌似没其作用.
进一步追一下代码, 看到了MP_REGISTER_MODULE操作的定义, 忍不住爆了句粗口"娘...希...匹".
在源文件"py/obj.h"中, MP_REGISTER_MODULE仅仅操作了个寂寞.
这句话确实没用.
总结
官方开发文档的内容同实际代码有一定偏差, 完全照搬不能实现预期功能, 但已经指明了一个正确的和规范化的方向, 仍然有很重要的参考价值. 本例中, 我通过进一步的调试, 通过附加最后一步注册的操作, 最终实现了官方文档中预期的功能.
另一方面, 官方文档中讲述的方法仅仅适用于增加全局模块, 例如实现电路板复位或者系统延时之类的功能, 仍然木有介绍类似于新创建一个类实例的那种模块, 例如我期望类似于下面的这种用法:
led1 = led(1)
led1.on()
led1.off()
在这种用法中, 首先从led类中实例化一个对象led1, 后续的操作都是针对对象led1进行展开.
所以, 到目前为止, micropython官方提供的参考开发文档仍未满足我的需求. 实际上, 我早年在ke18f上的移植中已将摸索出了这种开发模式, 但我仍希望看到官方开放相关的文档, 以描述一种规范的开发方式.
幸运的是, 我看到mimxrt的移植中呈现了我想要的这种实现的代码, 虽然没有专门的文档描述, 但mimxrt的移植相当简单, 几乎只有一个led类的实现, 那么, 通过对这份代码进行解析, 也可以间接地学习官方实现类模块的开发规范.
(完结)