MicroPython v1.25.0 发布

经过三年多的开发,"ROMFS" 功能终于定稿,其文件系统格式已指定,VFS 驱动程序和支持代码包含在此版本的 MicroPython 中。此功能构建在字节码版本 6(已存在多年)之上,该版本支持就地执行字节码,也就是说,无需将其复制到 RAM。ROMFS 定义了一个只读的、内存可映射的、可扩展的文件系统,可以包含任意资源,包括预编译的 .mpy 文件,并允许直接从文件系统执行字节码。这使得导入速度显着加快,并减少了内存使用。此外,诸如字体之类的数据资源可以在 ROMFS 上就地使用,而无需加载到 RAM 中。

ROMFS 目前仅在选定的开发板上启用:PYBD-SFx、所有 alif-port 开发板、一个名为 FLASH_2M_ROMFS 的新 ESP8266_GENERIC 变体以及所有 stm32 Arduino 开发板。其他开发板将在未来启用 ROMFS,或者可以在用户定义的开发板上手动启用它。

为了构建和部署 ROMFS,mpremote 有一个新的 mpremote romfs 命令,带有 "query"、"build" 和 "deploy" 子命令,可以将目录结构构建和部署到目标设备上的 ROMFS 分区。这些初始 ROMFS 功能将在未来扩展,但目前它们提供了一种尝试这项期待已久的功能的方式。

此版本还引入了一个全新的 "alif" port,支持 Alif Ensemble MCU。这些 MCU 提供多个 ARM 核心,包括 Ethos-U55 机器学习处理器和一套全面的外围设备。MicroPython alif port 的当前功能包括通过 TinyUSB 提供的 USB 支持、使用 OpenAMP 的双核支持、带有 XIP 的八进制 SPI 闪存、machine 类 Pin、UART、SPI 和 I2C 以及 cyw43 WiFi 和 BLE 支持。目前有两个 alif 开发板定义可用:ALIF_ENSEMBLE 用于官方 Alif Ensemble E7 DevKit,OPENMV_AE3 用于 OpenMV 即将推出的基于 AE3 的摄像头开发板。

MicroPython 的 inline assembler 现在通过新实现的 @micropython.asm_rv32 装饰器支持 32 位 RISC-V 汇编代码。这允许编写可以从 Python 代码直接调用的小段 RISC-V 机器代码。当 RP2350 在 RISC-V 模式下运行时,它会在 rp2 port 上启用。

Datagram TLS (DTLS) 现在由 tls 模块支持,并在 alif、mimxrt、renesas-ra、rp2、stm32 和 unix ports 上启用。可以使用 tls.PROTOCOL_DTLS_CLIENTtls.PROTOCOL_DTLS_SERVER 作为模式选项在 DTLS 模式下创建一个 SSLContext,然后可以使用此上下文来包装一个普通的 UDP socket 以获得安全的 UDP 连接。

mpremote 命令行工具现在支持通过新的 rm -r 选项进行递归删除;例如,可以使用 mpremote rm -rv : 删除目标设备当前工作目录中的所有文件和目录。mpremote 现在还支持 package.json 文件中的相对 URL,从本地文件系统安装,并在 mpremote mount 中优化了 readline 支持。

核心解释器的改进包括:在 str.startswith()str.endswith() 方法中完全支持元组和 start/end 参数;在大多数 ports 上启用内置 next() 函数的双参数版本;一个新的 sys.implementation._build 条目,它保存了目标的构建名称;以及不带参数的 vfs.mount() 现在返回已挂载文件系统的列表。

添加了 marshal 模块,其中包含 dumps()loads() 函数,它们目前支持代码对象,并且与 function.__code__ 结合使用,允许将函数转换为/从字节对象转换。默认情况下未启用此模块,但可以在自定义构建配置中使用。

MicroPython native linker mpy_ld.py 现在包括自动链接静态库的支持。这允许 native-module 构建脚本从编译器提供的诸如 libgcclibm 之类的库中查找所需的符号。这现在使得可以在 native modules 中使用诸如 exp() 之类的标准 C 函数。此外,native modules 现在支持 32 位 RISC-V 代码。

esp32 port 现在支持 IDF v5.3 和 v5.4,并且已删除对低于 v5.2.0 的版本的支持。现在在 ESP32-S2 和 ESP32-S3 MCU 上启用了动态 USB 设备支持,允许在运行时配置 USB 设备。已经在所有 ESP32-C3 开发板上启用了 I2S,添加了 Pin.toggle() 方法,并且 I2C 总线标识符现在是一个可选参数(默认情况下,使用总线 0)。此外,还改进了内存管理,用于分配 TLS sockets 以尝试在需要时自动释放任何现有的未使用 TLS 内存。

mimxrt port 现在启用了 exFAT 文件系统支持以及用于具有 lwIP 联网功能的开发板的 PPP 驱动程序,并且支持 UF2 bootloader,从而可以更轻松地部署固件。已删除 machine.RTC.now() 方法(请改用 datetime()),添加了 ADC.read_uv(),并且 machine.I2C 支持 timeout 关键字参数。I2C、SPI 和 UART 类现在支持默认总线,因此如果使用默认总线,则不再需要这些构造函数的第一个参数。修复了 PWM 输出的一些不一致之处,以及 UART RX 和 TX 缓冲区的一个分配错误。

rp2 port 引入了许多新的 RP2350 开发板,包括 Pico 2 W,以及具有大小自动检测功能的 PSRAM 支持。PIO 接口现在支持 side_pindir 选择,SPI 允许不指定 MISO 引脚。I2C 和 SPI 类现在都将总线标识符作为可选参数,其默认值基于开发板配置。现在 Pico W 和 Pico 2 W 在 AP 和 STA 模式下都支持 WPA3。由于在第二个核心上执行代码而导致的 WiFi 事件丢失现在已修复,mDNS 已修复,并且 rp2.bootsel_button() 和 USB sleep 现在可以在 RP2350 上工作。已添加 ROMFS 支持,但默认情况下未在任何开发板上启用;请参阅 commit 50a7362,了解如何手动启用它。

samd port 增加了对 UART 外围设备中 9 位数据的完全支持,并支持 I2C、SPI 和 UART 的默认总线和引脚。修复了 SAMD51 上两个通道的 DAC,并且 UART 缓冲进行了一些错误修复。

stm32 port 现在在软重置时会取消初始化 I2C 和 SPI 总线,这可能是某些应用程序的重大更改;请务必在创建 I2C 和 SPI 实例时始终对其进行初始化。CAN 代码已重构,并且在那里修复了一些小错误。现在可以在启动时正确处理损坏的 littlefs 文件系统:代码不会因为挂载失败而导致硬故障,而是尝试使用默认块设备参数再次挂载,如果也失败了,则会打印一条消息并继续启动过程。ROMFS 在 PYBD-SFx 开发板和所有 Arduino 开发板上启用,并且可以通过手动配置在其他开发板上启用;有关详细信息,请参阅 commit bea7645。PYBD-SF6 固件现在支持原始开发板和具有更大 SPI 闪存的新开发板。现在在使用 cyw43-driver 的开发板上支持 WPA3。mboot 现在包含一个版本字符串,该字符串位于为此引导加载程序分配的闪存段的末尾(通常为 32k);可以使用 fwupdate.get_mboot_version() 函数检索此版本。

zephyr port 已经实现了 machine.Timermachine.WDT

在此版本中添加的新开发板有:ALIF_ENSEMBLE 和 OPENMV_AE3 (alif port), MAKERDIARY_RT1011_NANO_KIT (mimxrt port), MACHDYNE_WERKZEUG, RPI_PICO2_W, SEEED_XIAO_RP2350, SPARKFUN_IOTNODE_LORAWAN_RP2350, SPARKFUN_IOTREDBOARD_RP2350, SPARKFUN_PROMICRO_RP2350, SPARKFUN_THINGPLUS_RP2350, SPARKFUN_XRP_CONTROLLER, SPARKFUN_XRP_CONTROLLER_BETA 和 WEACTSTUDIO_RP2350B_CORE (rp2 port), ADAFRUIT_NEOKEY_TRINKEY, ADAFRUIT_QTPY_SAMD21, SAMD_GENERIC_D21X18, SAMD_GENERIC_D51X19 和 SAMD_GENERIC_D51X2 (samd port), WEACT_F411_BLACKPILL (stm32 port)。

自上一个版本以来,各种 ports 的选定构建的代码大小变化是(文本部分的绝对和百分比变化):

  bare-arm:   +4 +0.007%
minimal x86:  -90 -0.049%
  unix x64: +16941 +2.046%
   stm32:  -96 -0.025%
   cc3200:  +280 +0.152%
  esp8266:  +964 +0.138%
   esp32: +10956 +0.654%
   mimxrt: +7508 +2.065%
 renesas-ra:  -160 -0.026%
    nrf:  +168 +0.090%
    rp2: +7944 +0.872%
    samd: +1112 +0.418%

导致代码大小发生这些变化的主要原因是:

VM 和运行时的性能与上一个版本相比没有实际变化。

感谢所有为此版本做出贡献的人:Alessandro Gatti, Alex Brudner, Amirreza Hamzavi, Andrew Leech, Angus Gratton, Anson Mansfield, Carl Pottle, Christian Clauss, chuangjinglu, Corran Webster, Damien George, danicampora, Daniël van de Giessen, Dryw Wade, eggfly, Garry W, garywill, Glenn Moloney, Glenn Strauss, Graeme Winter, Hans Maerki, Herwin Grobben, I. Tomita, iabdalkader, IhorNehrutsa, Jan Klusáček, Jan Sturm, Jared Hancock, Jeff Epler, Jon Nordby, Jos Verlinde, Karl Palsson, Keenan Johnson, Kwabena W. Agyeman, Lesords, machdyne, Malcolm McKellips, Mark Seminatore, Markus Gyger, Matt Trentini, Mike Bell, Neil Ludban, Peter Harper, peterhinch, Phil Howard, robert-hh, Ronald Weber, rufusclark, Sebastian Romero, Steve Holden, stijn, StrayCat, Thomas Watson, Victor Rajewski, Volodymyr Shymanskyy, Yoctopuce。

MicroPython 是一个全球性的开源项目,贡献来自以下时区:-0800、-0700、-0600、-0500、-0400、+0000、+0100、+0200、+0300、+0330、+0700、+0800、+1000、+1100、+1300。

此版本中完成的工作部分由 GitHub Sponsors 资助,部分由 George Robotics、Espressif、Arduino、LEGO Education、OpenMV 和 Planet Innovation 资助。

以下是详细的更改列表,该列表是从 git commit 历史记录生成的,并按部分组织。

主要组件

py core:

extmod:

shared:

drivers:

mpy-cross: 没有特定于此组件/port 的更改 lib:

支持组件

docs:

examples:

tests:

tools:

CI:

The ports

all ports:

alif port: