micropython 模块_MicroPython添加Module(一)
前面已经将MicroPython移植到了LPC1788,其中的一些功能已经可以使用。但是片上外设、板载外设还不能访问,需要我们去实现,然后才能在MicroPython中访问。官方文档MicroPython external C modules中对这部分有说明,比较简单。下面通过实战来进一步理解这部分文档。
添加源文件
第一步肯定是创建源文件了,给它命名为machine.c。
并添加到MakeFile里边,不然是不会被编译的。
SRC_C = \
main.c \
uart_core.c \
...
./modules/machine.c
...
创建一个Module
源文件已经建好,接下来就是编码了。在MicroPython中,modules是有确定的结构的。可以把这个结构理解为模板,跟着模板走,总没有错的。先来看看这个模板:
#include "py/obj.h"
#include "py/runtime.h"
#include "py/builtin.h"
STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
{MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_machine)},
};
STATIC MP_DEFINE_CONST_DICT(machine_module_globals, machine_module_globals_table);
const mp_obj_module_t machine_module = {
.base = {&mp_type_module},
.globals = (mp_obj_dict_t *)&machine_module_globals,
};
上面这部分代码使用mp_obj_module_t类型定义了一个module,并初始化了相关的部分,如基本类型、模块的字典。在字典中,定义了__name__,为machine,这个就是我们这个module的名字。
为了让这个模块能在MicroPython中被import,需要将模块添加到mpconfigport.h的MICROPY_PORT_BUILTIN_MODULES中。注意:不是MICROPY_PORT_BUILTINS!!!
// extra built in modules to add to the list of known ones
extern const struct _mp_obj_module_t machine_module; // 注意_mp_obj_module_t是带下划线前缀的
#define MICROPY_PORT_BUILTIN_MODULES \
{MP_ROM_QSTR(MP_QSTR_machine), MP_ROM_PTR(&machine_module)},
编译并烧录,在MicroPython中使用import machine测试是否成功,不报错就是成功了。
添加一个Function
现在,我们可以添加一个函数到这个模块里面。首先定义一个函数,这里以reset函数来具体说明。
STATIC mp_obj_t machine_reset(void)
{
NVIC_SystemReset();
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_reset_obj, machine_reset);
这段代码创建了一个名为machine_reset_obj的函数对象,该函数没有参数,被调用时会执行C函数machine_reset。此外,所有的Python函数都必须返回一个mp_obj_t结构对象,但是我们这没有什么可返回的,因此返回None。接下来将这个函数添加到前面创建好的module中。
STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
{MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_machine)},
{MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&machine_reset_obj)},
};
好了,编译看看。报错了,提示下面的信息
In file included from modules/machine.c:1:0:
modules/machine.c:17:18: error: 'MP_QSTR_sys_reset' undeclared here (not in a function)
{MP_ROM_QSTR(MP_QSTR_sys_reset), MP_ROM_PTR(&machine_reset_obj)},
^
../../py/obj.h:92:56: note: in definition of macro 'MP_OBJ_NEW_QSTR'
#define MP_OBJ_NEW_QSTR(qst) ((mp_obj_t)((((mp_uint_t)(qst)) << 2) | 2))
^
modules/machine.c:17:6: note: in expansion of macro 'MP_ROM_QSTR'
{MP_ROM_QSTR(MP_QSTR_sys_reset), MP_ROM_PTR(&machine_reset_obj)},
^
make: *** [build/./modules/machine.o] Error 1
其实上面的操作还缺少一个步骤,就是在qstrdefsport.h.中定义一个Q(reset),再编译就OK了。
Function的参数
前面添加一个函数时使用了MP_DEFINE_CONST_FUN_OBJ_0宏来定义一个不带参数的函数。同样也可以定义一个或多个参数的函数。下面列举出所有支持的类型,具体的使用方法不细说,可以查看各个移植的例子。
宏
说明
MP_DEFINE_CONST_FUN_OBJ_0
不带参数的函数
MP_DEFINE_CONST_FUN_OBJ_1
只有1个参数的函数
MP_DEFINE_CONST_FUN_OBJ_2
有2个参数的函数
MP_DEFINE_CONST_FUN_OBJ_3
有3个参数的函数
MP_DEFINE_CONST_FUN_OBJ_VAR
带可变参数的函数
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN
跟上面类似,但是参数个数有范围
MP_DEFINE_CONST_FUN_OBJ_KW
带关键字参数的函数
在MicroPython中使用Module
import machine # 添加的module的名字叫‘machine’,要使用这个模块首先得导入它
machine.reset() # 调用这个模块的函数
micropython 模块_MicroPython添加Module(一)相关推荐
- C语言开发MicroPython模块(添加module)
MicroPython添加模块框架模式相对简单,只需要按照定义好的固定框架就可以添加模块(module). 一.向固件里面添加module 1.1.编写mymodule.c文件 在ports/ ...
- micropython 常量_MicroPython添加Module(二)
上一篇已经创建了一个machine的模块并实现了函数,按照这个方式可以将引脚.串口.定时器等所有外设的功能都添加到这个模块里面.但是,这么多的外设,每个外设还有不少的操作函数,全部一起加到模块里,使用 ...
- HarmonyOS之在工程中导入Sample工程和添加Module
一.导入 Sample 工程 ① Sample 说明 DevEco Studio 支持 HarmonyOS Sample 工程的导入功能,通过对接 Gitee 开源社区中的 Sample 资源,可一键 ...
- Webpack高级应用篇(四):模块解析(Module Resolution)
目录 webpack 中的解析规则 绝对路径 相对路径 模块路径 解析(Resolve) resolve.alias resolve.extensions 外部扩展(Externals) extern ...
- Android中添加Module依赖注意问题
在开发中经常会以添加Module依赖的方式拓展其他的模块,这样的方式给我们的开发提供了很大的方便,但是也增加了编译的时间成本.但是直接在build.gradle中添加Module依赖往往会遇到Mani ...
- python 找不到socket_swift 和 python解决Python找不到ssl模块问题 No module named _ssl
python安装完毕后,提示找不到ssl模块:[www@pythontab.com ~]$ python Python 2.7.15 (default, Oct 23 2018, 18:08:43) ...
- 安装LPC55S69 MicroPython模块是遇到的CDC Interface驱动问题
简 介: 在安装LPC55XX测试模块的过程中遇到了USB-CDC驱动问题.现在还没有能够得到解决. 关键词: CDC,LPC55XXX #mermaid-svg-LA5ps6AwBaLNuMes . ...
- 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(7.2) 模块管理,模块的添加、修改、删除...
索引 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目 目录索引 简述 今天我们来做模块管理的 添加.修改.删除 项目准备 我们用的工具是:VS 2013 + SqlSer ...
- boost::format模块演示添加到 printf 语法的功能
boost::format模块演示添加到 printf 语法的功能 实现功能 C++实现代码 实现功能 boost::format模块演示添加到 printf 语法的功能 C++实现代码 #inclu ...
最新文章
- 1-4月份我国软件业务收入15753亿元 同比增长13.1%
- 关于MM的几个经典问题及回答
- 廖雪峰Java1-3流程控制-9break、continue
- Sightseeing Cows(POJ-3621)
- 硬盘损坏如何恢oracle,硬盘物理损坏,如何恢复数据库?
- 万用表判断场效应管的好坏
- jni 结构体转对象_JVM系列(一)JVM启动流程和基本结构
- MySQL 删除数据库中所有表、所有存储过程命令
- [CF1105D]Kilani and the Game
- 667.优美的数列II(力扣leetcode) 博主可答疑该问题
- RTMP协议封装H264格式详解
- 关机重启注销慢? 头疼? 提高速度的好办法!
- 物联网-智能家居相关知识了解
- Python读取redis数据含有‘b‘
- 关于手机天气应用中的城市搜索的联想查找方式优化
- 制作PE系统--20220202
- Java:Hutool工具箱之Hutool-crypto加密解密
- 2021年6月上市公司新闻舆论事件分析报告合集
- 2019年了时间过得好快啊!我的小感慨
- 11月18日——离noip还有1天[游戏王YGO]