Introduction
在前文《为micropython添加模块(2)-类模块》中,我按照源代码排列的顺序,大体阅读了micropython添加C扩展模块的编程方式及其源代码。在通读micropython源码之后,我认为使用自顶向下的方式阅读和描述这部分更有助于开发者理解和编程。经年之前,我对micropython中用引脚创建引脚的方式百思不得其解,但对这种用法觉得比较有趣,此次再阅读代码,颇有一些收获,在此也一并做些记录,同时也可作为开发指南参考。
本文以mimxrt的port为参考模板,添加一个Pin模块,并撰写在mm32f3270上的Pin模块。
注意: 本文同前文讲述内容和对象相同,只是换了一个思路,加了一些心得而已,也考虑了micropython版本迭代的一些更新。
在python内核中注册machine模块包含的Pin模块
本节解释Pin作为machine的子模块,建立在代码中用“machine.Pin”的引用关系。
从ports/mimxrt/machine_pin.c文件开始说起。这个文件是为了实现Pin模块。 Pin模块底层的细节等下再看,但我们知道了整个源文件就是为了创建这一个machine_pin_type对象
const mp_obj_type_t machine_pin_type = {
{&mp_type_type},
.name = MP_QSTR_Pin,
.print = machine_pin_obj_print,
.call = machine_pin_obj_call,
.make_new = mp_pin_make_new,
.locals_dict = (mp_obj_dict_t *)&machine_pin_locals_dict,
};
machine_pin_type这个实例被包含在machine模块中,见同目录下的modmachine.c文件中:
STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_umachine) },
{ MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&ma