前面已经将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(一)相关推荐

  1. C语言开发MicroPython模块(添加module)

      MicroPython添加模块框架模式相对简单,只需要按照定义好的固定框架就可以添加模块(module). 一.向固件里面添加module 1.1.编写mymodule.c文件   在ports/ ...

  2. micropython 常量_MicroPython添加Module(二)

    上一篇已经创建了一个machine的模块并实现了函数,按照这个方式可以将引脚.串口.定时器等所有外设的功能都添加到这个模块里面.但是,这么多的外设,每个外设还有不少的操作函数,全部一起加到模块里,使用 ...

  3. HarmonyOS之在工程中导入Sample工程和添加Module

    一.导入 Sample 工程 ① Sample 说明 DevEco Studio 支持 HarmonyOS Sample 工程的导入功能,通过对接 Gitee 开源社区中的 Sample 资源,可一键 ...

  4. Webpack高级应用篇(四):模块解析(Module Resolution)

    目录 webpack 中的解析规则 绝对路径 相对路径 模块路径 解析(Resolve) resolve.alias resolve.extensions 外部扩展(Externals) extern ...

  5. Android中添加Module依赖注意问题

    在开发中经常会以添加Module依赖的方式拓展其他的模块,这样的方式给我们的开发提供了很大的方便,但是也增加了编译的时间成本.但是直接在build.gradle中添加Module依赖往往会遇到Mani ...

  6. 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) ...

  7. 安装LPC55S69 MicroPython模块是遇到的CDC Interface驱动问题

    简 介: 在安装LPC55XX测试模块的过程中遇到了USB-CDC驱动问题.现在还没有能够得到解决. 关键词: CDC,LPC55XXX #mermaid-svg-LA5ps6AwBaLNuMes . ...

  8. 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(7.2) 模块管理,模块的添加、修改、删除...

    索引 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目 目录索引 简述 今天我们来做模块管理的 添加.修改.删除 项目准备 我们用的工具是:VS 2013 + SqlSer ...

  9. boost::format模块演示添加到 printf 语法的功能

    boost::format模块演示添加到 printf 语法的功能 实现功能 C++实现代码 实现功能 boost::format模块演示添加到 printf 语法的功能 C++实现代码 #inclu ...

最新文章

  1. 1-4月份我国软件业务收入15753亿元 同比增长13.1%
  2. 关于MM的几个经典问题及回答
  3. 廖雪峰Java1-3流程控制-9break、continue
  4. Sightseeing Cows(POJ-3621)
  5. 硬盘损坏如何恢oracle,硬盘物理损坏,如何恢复数据库?
  6. 万用表判断场效应管的好坏
  7. jni 结构体转对象_JVM系列(一)JVM启动流程和基本结构
  8. MySQL 删除数据库中所有表、所有存储过程命令
  9. [CF1105D]Kilani and the Game
  10. 667.优美的数列II(力扣leetcode) 博主可答疑该问题
  11. RTMP协议封装H264格式详解
  12. 关机重启注销慢? 头疼? 提高速度的好办法!
  13. 物联网-智能家居相关知识了解
  14. Python读取redis数据含有‘b‘
  15. 关于手机天气应用中的城市搜索的联想查找方式优化
  16. 制作PE系统--20220202
  17. Java:Hutool工具箱之Hutool-crypto加密解密
  18. 2021年6月上市公司新闻舆论事件分析报告合集
  19. 2019年了时间过得好快啊!我的小感慨
  20. 11月18日——离noip还有1天[游戏王YGO]

热门文章

  1. 《需求工程-软件建模与分析之读书笔记之三》
  2. Linux的MySQL不能远程访问
  3. oracle 游标中抛出异常的处理方式
  4. 前缀列表(prefix-list)讲解
  5. [Dynamic Language] Python 静态方法、类方法、属性
  6. expect无密码登陆
  7. 参考基因组中的特殊序列
  8. Protobuf3语言指南
  9. NCL 小图对其问题
  10. 面向对象之内置方法(简单)、组合。以及接口归一化设计与抽象类