MicroPython跟Python是什么关系
MicroPython是Python的一个子集,在语言、语法等方面实现了Python3.4的大部分标准特性以及后续版本的部分特性,但是没有包含一些高级特性,如装饰器、生成器等。同时,MicroPython 对 Python 的标准库进行了精简,只保留了一些常用的模块,如 os、sys、time、ujson 等,这也使得MicroPython核心的体积非常小,可以在资源受限的设备上运行。另外,MicroPython 标准库支持底层硬件操作,可以直接操作硬件寄存器、GPIO、UART、I2C、SPI 等外设。这使得 MicroPython 非常适合用于物联网、嵌入式系统等领域的开发。
MicroPython与Arduino相比有什么优势
MicroPython与Arduino在架构上非常类似,只是MicroPython脱胎于Python,Arduino脱胎于C和C++。在语言层面,MicroPython继承了Python的语言语法,所以对于会使用Python的开发人员来说非常友好,只需要稍微了解一些开发板和一些相关的库就能很快上手单片机的开发,进一步降低了单片机开发的门槛。
但同时,由于MicroPython的生态还在不断发展,虽然在语言学习曲线、开发效率上相较Arduino存在一定的优势,但是在学习资料的丰富程度、社群规模、硬件种类、开发工具、代码执行效率等诸多方面还很大的成长空间。
近些年,随着Python语言的广泛流行,越来越多的软件开发者开始进入跨界的领域,借助于MicroPython提供的支持快速
MicroPython的基本名词术语
要学习MicroPython的开发,有一些基本的名词术语还是需要了解一下的,特别是之前没有接触过单片机开发的同学,可以先了解一些基本的概念,方便进一步的交流和学习。这里列出了一些,后续还会根据情况不断地调整和更新。
裸机(baremetal)
是指没有(或不完整)操作系统的系统,如基于MCU的系统。当在裸机系统上运行时,MicroPython 的功能就像一个小型操作系统,运行用户程序并提供命令解释器 ( REPL )。
缓存协议(buffer protocol)
任何可以自动转换为字节的Python对象,例如bytes、bytearray、memoryview和str对象,它们都实现了“缓存协议”。
开发板(board)
通常,这是指包含了微控制器(MCU)和支持组件的印刷电路板 (PCB)。MicroPython 通常为不同的开发板提供不同的固件,因为固件既包含 MCU 特定的功能,也包含板级功能,例如驱动程序或引脚名称。
字节码(bytecode)
Python 源代码编译后生成的一种可被Python固件执行的字节码。相当于虚拟机(VM)实际执行的代码。字节码通常在运行时自动生成,并且对用户不可见。注意,虽然CPython和 MicroPython 都使用字节码,但格式不同。可以使用交叉编译器离线预编译源代码。
调用者拥有的元组(callee-owned tuple)
这是 MicroPython特有的一个结构,出于效率原因,某些内置函数或方法可能会重用相同的底层元组对象来返回数据。这避免了必须为每个调用分配新的元组,并减少堆碎片。所以,在编程时应该注意不要留对此类元组的引用,需要持有时可以从中提取数据(或制作副本)。
CPython
CPython 是 Python 编程语言的参考实现,也是最著名的一种。然而,它只是众多实现(包括 Jython、IronPython、PyPy 和 MicroPython)之一。虽然 MicroPython 的实现与 CPython 有很大不同,但它的目标是保持尽可能多的兼容性。
交叉编译器(cross-compiler)
也称为mpy-cross。该工具在 PC 上运行,并将 包含 MicroPython 代码的.py 文件转换为MicroPython字节码.mpy文件。这意味着它加载速度更快(主板运行时不必重新编译代码),并且在闪存上使用更少的空间(字节码更节省空间)。
驱动(driver)
一个 MicroPython 库,实现对特定组件(例如传感器或显示器)的支持。
外部函数接口(FFI:Foreign Function Interface)
FFI是Foreign Function Interface的缩写,意为外部函数接口。它是计算机科学中用于将不同编程语言编写的程序连接在一起的技术。FFI可以让不同编程语言之间的程序相互调用,从而扩展其功能。为了实现FFI,需要建立一种通用的数据类型,用于在不同编程语言之间传递数据。例如,在C语言中,一个整数通常是使用4个字节来表示的,而在Python中,一个整数可以使用任意数量的字节来表示,因此在FFI中需要一个通用的整数类型,以便可以在这两种编程语言之间传递整数。这也是MicroPython Unix 端口用于访问操作系统功能的机制 。在裸机端口上不可用。
文件系统(filesystem)
大多数 MicroPython 端口和开发板都提供存储在闪存中的文件系统,用户代码可以通过标准 Python 文件 API(例如open(). 有些开发板还可以让主机通过 USB 大容量存储访问此内部文件系统。
冻结模块(frozen module)
已交叉编译并捆绑到固件映像中的 Python 模块。由于代码直接从闪存执行,因此减少了 RAM 需求。
垃圾收集器(Garbage Collector)
在 Python(和 MicroPython)中运行的后台进程,用于回收堆中未使用的内存。
通用输入输出接口(GPIO:General-purpose input/output)
通用输入/输出。控制MCU引脚信号的最简单方法。GPIO 通常允许引脚作为输入或输出,并设置或获取其数字值(逻辑“0”或“1”)。machine.PinMicroPython 使用和类抽象 GPIO 访问machine.Signal 。
GPIO端口
一组GPIO引脚,通常基于这些引脚的硬件属性(例如可由同一寄存器控制)。
堆(heap)
MicroPython 存储动态数据的 RAM 区域。它由垃圾收集器自动管理。不同的 MCU 和主板可用于堆的 RAM 量差异很大,因此它会影响程序的复杂程度。
驻留字符串(interned string)
MicroPython 用于提高处理字符串的效率的优化。驻留字符串是通过其(唯一)标识而不是其地址来引用的,因此可以仅通过其标识符进行快速比较。这也意味着可以在内存中删除相同的字符串。字符串驻留对于用户来说几乎总是不可见的。
单片机(MCU)
微控制器。微控制器通常比台式机、笔记本电脑或手机拥有更少的资源,但更小、更便宜并且需要更少的电量。MicroPython 设计得很小并且经过充分优化,可以在普通的现代微控制器上运行。
micropython-lib
MicroPython(通常)作为单个可执行/二进制文件分发,只有几个内置模块。没有可与CPython相媲美的广泛标准库。相反,有一个相关但独立的项目micropython-lib,它提供了 CPython 标准库中许多模块的实现。
一些模块是用纯Python实现的,并且能够在所有端口上使用。然而,这些模块中的大多数使用 FFI来访问操作系统功能,因此只能在MicroPython Unix 端口上使用(对 Windows 的支持有限)。
与CPython stdlib 不同,micropython-lib 模块旨在单独安装 - 使用手动复制或使用mip。
MicroPython 端口
MicroPython 支持不同的主板、RTOS 和操作系统,并且可以相对轻松地适应新系统。支持特定系统的 MicroPython 称为该系统的“端口”。不同的端口可能具有截然不同的功能。本文档旨在作为跨不同端口(“MicroPython 核心”)可用的通用 API 的参考。请注意,某些端口可能仍会省略此处描述的某些 API(例如,由于资源限制)。任何此类差异以及超出 MicroPython 核心功能的特定于端口的扩展都将在单独的特定于端口的文档中进行描述。
MicroPython Unix 端口
unix 移植是主要的MicroPython 移植之一。它旨在运行在 POSIX 兼容的操作系统上,如 Linux、MacOS、FreeBSD、Solaris 等。它也作为 Windows 移植的基础。Unix 端口对于快速开发和测试 MicroPython 语言以及与机器无关的功能非常有用。它还可以以与CPython的可执行文件类似的方式运行 python。
mip
类似Python的pip,MicroPython 的包安装程序叫mip(mip - “mip 要安装的包”)。它从micropython-lib、 GitHub 或任意 URL 安装 MicroPython 包。mip 可以在具有网络功能的板上在设备上使用,也可以通过mpremote等工具在内部使用。有关使用的更多信息,请参阅包管理mip。
mpremote
与 MicroPython 设备交互的工具。
.mpy 文件
交叉编译器的输出。.py 文件的编译形式 ,包含 MicroPython字节码而不是 Python 源代码。
原生(Native)
通常指“本机代码”,即目标微控制器(例如 ARM Thumb、Xtensa、x86/x64)的机器代码。装饰@native 器可以应用于 MicroPython 函数来生成本机代码,而不是该函数的字节码,这可能会更快,但会使用更多 RAM。
端口(port)
通常是MicroPython 端口的缩写,但也可以指 GPIO 端口。
.py 文件
包含 Python 源代码的文件。
REPL
“Read、Eval、Print、Loop”的缩写。是一种命令交互工具,对于调试或测试简短的代码片段很有用。大多数 MicroPython 板都通过 UART 提供 REPL,并且通常可以通过 USB 在主机 PC 上访问。
流(stream)
也称为“类文件对象”。一个 Python 对象,提供对底层数据的顺序读写访问。read()流对象实现了相应的接口,该接口由、write()、readinto()、seek()、flush()、 等方法组成。 close()流是 MicroPython 中的一个重要概念;许多 I/O 对象都实现了流接口,因此可以在不同的上下文中一致且可互换地使用。有关 MicroPython 中流的更多信息,请参阅io模块。
串口(UART)
“通用异步接收器/发送器”的缩写(Universal Synchronous Asynchronous Receiver and Transmitter通用同步异步收发器)。这是通过一对引脚(TX 和 RX)发送数据的外设。许多开发板都包含一种方法,可以使至少一个 UART 作为 USB 串行端口供主机 PC 使用。