从 machine 到 rp2:MicroPython 相关模块一文速览
我们可以把 MicroPython 的系统结构比作智能手机的运行体系:手机硬件对应微控制器硬件,手机的操作系统(如 Android/iOS)对应 MicroPython 固件,而我们安装的 APP 对应用户编写的 MicroPython 程序。固件是整个系统的核心,负责衔接硬件和用户程序,就像手机系统衔接硬件和 APP 一样。在了解系统结构前,先搞懂几个关键的基础知识点:
- 固件:是烧录到微控制器闪存中的预编译程序包,包含 MicroPython 解释器、核心库和硬件驱动,相当于嵌入式设备的 “操作系统内核 + 运行环境”。
- REPL(交互式解释器):全称是 “读取 - 求值 - 打印 - 循环”,简单说就是 MicroPython 的 “实时命令行”—— 输入一行代码,立刻执行并返回结果,方便调试和快速测试代码。
- 引导加载程序(Bootloader):微控制器通电后第一个运行的小程序,负责把闪存中的固件加载到内存(RAM)中运行,相当于硬件的 “开机启动器”。
- 垃圾回收器(GC):MicroPython 自带的内存管理工具,会自动清理不再使用的变量、对象等内存占用,避免嵌入式设备因内存不足卡死,是针对微控制器小内存的优化设计。
1.MicroPython 的系统结构
一个 MicroPython 系统的典型结构如下:
图 2.5 MicroPython 系统典型结构图
它包括用户程序、MicroPython 固件和微控制器硬件构成,固件和硬件是最基础、固定的部分,我们只能对用户程序进行编写和修改。MicroPython 固件就类似于一个嵌入式的操作系统,主要用于运行用户程序并提供 REPL 命令解释器。
- 专用的 MicroPython 开发板,如 pyboard、树莓派 pico 等可以直接烧录官方提供的固件运行源代码;
- MicroPython 支持的其他类型开发板,需要自己编译源代码,产生固件;
- 如果是兼容 MicroPython 的开发板,需要自己移植 MicroPython 系统。
在使用 MicroPython 进行 MCU 的编程之前,我们需要首先烧录特定 MCU 芯片对应的 MicroPython 固件,烧录完成后,我们将编写好的 MicroPython 程序上传到单片机中,然后重启 MCU:
- 设备通电后,引导加载程序负责将 MicroPython 的固件从闪存中加载到 RAM 中,固件包含解释器和基本的运行时环境;
- 在 MicroPython 开始执行 Python 代码之前,它会初始化必要的硬件和外设,包括设置时钟、初始化 GPIO、配置外设等;
- MicroPython 会查找并执行预定义的启动脚本(如 main.py),这个脚本可以包含用户自定义的初始化代码或程序逻辑,MicroPython 的解释器首先将 Python 代码编译成字节码,这一过程在设备上动态完成,避免了需要预编译的复杂过程;
- 编译后的字节码由 MicroPython 解释器执行。解释器将字节码转换成具体的操作,并在硬件上运行这些操作;
- MicroPython 在微控制器中管理堆栈和内存,其自带的垃圾回收器(GC)也会定期清理不再使用的对象,以释放内存空间;
- 一旦启动脚本执行完毕,MicroPython 进入 REPL 模式,等待用户输入命令或代码。
2.machine 模块 —与硬件相关的功能
machine 模块包含与特定板上硬件相关的特定功能。该模块中的大多数功能允许实现对系统硬件块(如 CPU、定时器、总线等)的直接和不受限制的访问和控制。使用不当,这可能会导致电路板故障、锁定、崩溃,在极端情况下还会导致硬件损坏。
图 2.6 machine 模块功能架构图
3.rp2 模块——特定于 RP2040 的功能
该 rp2 模块包含特定于 RP2040 的函数和类,如在 Raspberry Pi Pico 中使用的。
图 2.7 rp2 模块功能架构图
4.MicroPython 标准微库
以下标准 Python 库已被“微化”以符合 MicroPython 的理念。它们提供该模块的核心功能,旨在替代标准 Python 库。
图 2.8 MicroPython machine 模块功能架构图
5.MicroPython 特定库
图 2.9 MicroPython 特定库功能架构图
