本篇文章基于micropython1.18版本分析,1.19版本及之后可能略有差异。

关于c模组的写法官方文档有介绍https://docs.micropython.org/en/latest/develop/cmodules.html,也可以参考micropython工程源码中其他的例子,这里不多介绍。

注册c模组

按照c模组构造方法写完c程序后,还需要再头文件中声明模组注册,注册模组有两种方式一种手动添加到头文件,另一个就是采用自动注册方式,以unix端口为例编译为例子说明:

1.手动注册

找到ports/unix/mpconfigport.h文件,很多外部c模组就在这里面声明注册的。以machine模组为例,需要添加以下语句注册声明

//声明模组对象结构体
extern const struct _mp_obj_module_t mp_module_machine;//将模组名-模组指针 加入MICROPY_PORT_BUILTIN_MODULES 宏中,该宏最终会加入全局模组表中。
#define MICROPY_PORT_BUILTIN_MODULES \
...{ MP_ROM_QSTR(MP_QSTR_umachine), MP_ROM_PTR(&mp_module_machine) }, \
...

通过追踪该宏MICROPY_PORT_BUILTIN_MODULES 可以发现,他被加入到了文件py/objmodule.cmp_builtin_module_table[]里,代码如下:

// Global module table and related functionsSTATIC const mp_rom_map_elem_t mp_builtin_module_table[] = {{ MP_ROM_QSTR(MP_QSTR___main__), MP_ROM_PTR(&mp_module___main__) },{ MP_ROM_QSTR(MP_QSTR_builtins), MP_ROM_PTR(&mp_module_builtins) },{ MP_ROM_QSTR(MP_QSTR_micropython), MP_ROM_PTR(&mp_module_micropython) },...省略部分代码#if MICROPY_PY_BUILTINS_FLOAT#if MICROPY_PY_MATH{ MP_ROM_QSTR(MP_QSTR_math), MP_ROM_PTR(&mp_module_math) },#endif#if MICROPY_PY_BUILTINS_COMPLEX && MICROPY_PY_CMATH{ MP_ROM_QSTR(MP_QSTR_cmath), MP_ROM_PTR(&mp_module_cmath) },#endif#endif#if MICROPY_PY_SYS{ MP_ROM_QSTR(MP_QSTR_usys), MP_ROM_PTR(&mp_module_sys) },#endif#if MICROPY_PY_GC && MICROPY_ENABLE_GC{ MP_ROM_QSTR(MP_QSTR_gc), MP_ROM_PTR(&mp_module_gc) },#endif#if MICROPY_PY_THREAD{ MP_ROM_QSTR(MP_QSTR__thread), MP_ROM_PTR(&mp_module_thread) },#endif// extmod modules#if MICROPY_PY_UASYNCIO{ MP_ROM_QSTR(MP_QSTR__uasyncio), MP_ROM_PTR(&mp_module_uasyncio) },#endif...省略部分代码// extra builtin modules as defined by a portMICROPY_PORT_BUILTIN_MODULES#ifdef MICROPY_REGISTERED_MODULES// builtin modules declared with MP_REGISTER_MODULE()MICROPY_REGISTERED_MODULES#endif
};

mp_builtin_module_table[]里就是micropython中注册的所有模组了,按宏选择打开。还发现末尾有一个MICROPY_REGISTERED_MODULES宏,这个就关系到下面要说的自动注册模组方式了。

注:该方式属于历史遗留,在1.19版本之后该部分代码已被移除,mp_builtin_module_table[] 中仅保留MICROPY_REGISTERED_MODULES宏,也就是后续不管内置模组还是外部模组添加都要采用下面的自动注册方式

2.自动注册模组

假如我们写好了一个与具体硬件无关的c模组想要发布分享,或者并不想更改micropython中源代码部分作为独立的工程,那么就可以使用这种方式。源码中也给出了一个例子–uarray模组,找到文件py/modarray.c

#include "py/builtin.h"#if MICROPY_PY_ARRAYSTATIC const mp_rom_map_elem_t mp_module_array_globals_table[] = {{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_uarray) },{ MP_ROM_QSTR(MP_QSTR_array), MP_ROM_PTR(&mp_type_array) },
};STATIC MP_DEFINE_CONST_DICT(mp_module_array_globals, mp_module_array_globals_table);const mp_obj_module_t mp_module_uarray = {.base = { &mp_type_module },.globals = (mp_obj_dict_t *)&mp_module_array_globals,
};MP_REGISTER_MODULE(MP_QSTR_uarray, mp_module_uarray, MICROPY_PY_ARRAY);#endif

末尾加了一句MP_REGISTER_MODULE(MP_QSTR_uarray, mp_module_uarray, MICROPY_PY_ARRAY);这个就是用来声明自动注册的宏,该宏用法如下:

// Declare a module as a builtin, processed by makemoduledefs.py
// param module_name: MP_QSTR_<module name>
// param obj_module: mp_obj_module_t instance
// prarm enabled_define: used as `#if (enabled_define) around entry`#define MP_REGISTER_MODULE(module_name, obj_module, enabled_define)

3个参数为模组名的qstr,模组对象指针,是否使能,最后加了这句且enabled_define为1那么编译micropython的时候就会自动帮你注册上。

自动注册过程依赖一个脚本工具py/makemoduledefs.py,通过这个脚本会检索你的c源码中含有MP_REGISTER_MODULE的语句提取出信息,然后生成一个头文件ports/unix/build-standard/genhdr/moduledefs.h在编译路径下。

// Automatically generated by makemoduledefs.py.#if (MICROPY_PY_ARRAY)extern const struct _mp_obj_module_t mp_module_uarray;#define MODULE_DEF_MP_QSTR_UARRAY { MP_ROM_QSTR(MP_QSTR_uarray), MP_ROM_PTR(&mp_module_uarray) },
#else#define MODULE_DEF_MP_QSTR_UARRAY
#endif#define MICROPY_REGISTERED_MODULES \MODULE_DEF_MP_QSTR_UARRAY \
// MICROPY_REGISTERED_MODULES

像ulab(micropython的类numpy数组操作库)这种三方模组就是采用自动注册方式。

我们自己开发的时候也尽量采取这种方式,便于模组独立维护管理。

micropython源码分析之c模组注册相关推荐

  1. 源码分析Dubbo前置篇-寻找注册中心、服务提供者、服务消费者功能入口

    本节主要阐述如下两个问题:  1.Dubbo自定义标签实现.  2.dubbo通过Spring加载配置文件后,是如何触发注册中心.服务提供者.服务消费者按照Dubbo的设计执行相关的功能.  所谓的执 ...

  2. micropython源码分析之qstr

    前言 最近在研究micropython的源码编译过程,简单记录下关于qstr部分内容,本篇文章基于micropython1.18版本源码,1.19版本及之后可能会略有差异. 标识符与相应对象的联系 M ...

  3. Kubernetes1.5源码分析(二) apiServer之资源注册

    源码版本 Kubernetes v1.5.0 简介 k8s里面有各种资源,如Pod.Service.RC.namespaces等资源,用户操作的其实也就是这一大堆资源.但这些资源并不是杂乱无章的,使用 ...

  4. Boardcast Receiver 源码分析:广播的动态注册、发送和接收过程

    文章目录 动态注册过程 ContextWrapper#registerReceiver(以下代码基于API26) ContextImpl#registerReceiver ContextImpl#re ...

  5. 《源码分析转载收藏向—数据库内核月报》

    月报原地址: 数据库内核月报 现在记录一下,我可能需要参考的几篇文章吧,不然以后还得找: MySQL · 代码阅读 · MYSQL开源软件源码阅读小技巧 MySQL · 源码分析 · 聚合函数(Agg ...

  6. [Abp vNext 源码分析] - 3. 依赖注入与拦截器

    一.简要说明 ABP vNext 框架在使用依赖注入服务的时候,是直接使用的微软提供的 Microsoft.Extensions.DependencyInjection 包.这里与原来的 ABP 框架 ...

  7. EventBus源码分析

    简介 前面我学习了如何使用EventBus,还有了解了EventBus的特性,那么接下来我们一起来学习EventBus的源码,查看EventBus的源码,看看EventBus给我们带来什么惊喜以及编程 ...

  8. 源码分析Dubbo系列文章

       本系列文章主要针对Dubbo2.6.2(dubbox2.8.4)版本,从源码的角度分析Dubbo内部的实现细节,加深对Dubbo的各配置参数底层实现原理的理解,更好的指导Dubbo实践,其目录如 ...

  9. 【SpringCloud微服务】第3章 服务治理SpringCloudEureka(五)——Eureka源码分析

    2.8 Eureka 源码分析   首先,对于服务注册中心.服务提供者.服务消费者这三个主要元素来说,后两者(也就是Eureka客户端)在整个运行机制中是大部分通信行为的主动发起者,而注册中心主要是处 ...

  10. 《Ceph源码分析》——第1章,第5节RADOS

    本节书摘来自华章出版社<Ceph源码分析>一书中的第1章,第1.5节RADOS,作者常涛,更多章节内容可以访问云栖社区"华章计算机"公众号查看 1.5 RADOS RA ...

最新文章

  1. linux下如何解压缩zip,tar,tar.gz,tar.bz2文件
  2. Sword STL迭代器prev,next相关函数
  3. Git和Github的区别与操作简介
  4. Sublime text 入门学习资源篇及其基本使用方法
  5. Linux系统编程:获取指定目录下指定文件类型的数量
  6. SEO之Google--PageRank优化剖析(二)
  7. Ubuntu ufw防火墙常见命令
  8. mysql数据库用doc命令,myMySQL数据库怎么使用dos命令安装? MySQL数据库使用教程
  9. C# 反射应用实例-获取当前Color类的所有颜色
  10. 计算机excel必备知识,excel常用函数大全
  11. 解决百度文库不能复制最简单方法
  12. VS2015/VS2017C++报错C++LNK1104 无法打开文件“ucrtd.lib”或无法打开包括文件“corecrt.h“
  13. 基于云上 Arm 架构赋能数值天气预报
  14. 知识图谱论文梳理【 HyTE:基于超平面的时序知识图谱】
  15. 基于Python实现的远程控制主机设计
  16. 奇兔recovery卡刷教程_如何使用recovery进行双清教程
  17. 云计算时代的域名解析
  18. 三色球问题python_零基础入门学习Python习题3【输密码+水仙花数+摸三色球】
  19. 模仿微信九宫格图片展示控件
  20. 常用计量统计方法(偏医学科研)

热门文章

  1. 实用网站推荐——office模板(PPT)
  2. 科密t1消费管理系统_科密t1消费管理系统
  3. 最美的教育最简单-净化育儿观念
  4. Package fontspec Error: The font “SimHei“ cannot be found. windows 上海交大学位论文模板
  5. Allwinner Tina Linux 如何打开ssh远程登录支持
  6. nbu备份本机oracle,nbu 7.1 备份恢复ORACLE实践手册
  7. 携程酒店自动化360度质量保障体系
  8. 个税抵扣全指南精华版!
  9. maven下手动导入ojdbc6.jar
  10. LTE学习笔记:频带、信道带宽和频点号EARFCN