本文介绍了MicroPython如何提供并使用设备上的文件系统,以及如何使用Python标准的I/O方法进行持久存储。MicroPython会自动创建默认配置并侦测主文件系统,同时支持修改分区、文件系统类型或自定义块设备。
文件系统通常由设备上的内部闪存支持,但也可以使用外部闪存、RAM 或自定义块设备。在某些端口(如 STM32)上,文件系统可以通过 USB MSC 连接到PC主机。pyboard.py 工具还为主机访问所有端口上的文件系统提供了一种途径。
**注意:**这主要用于 STM32 和 ESP32 等裸机端口,在带有操作系统的端口上(如 Unix 端口),文件系统由主机操作系统提供。
虚拟文件系统 VFS(Virtual File System)
MicroPython实现了类似Unix的虚拟文件系统层,所有挂载的文件系统都被整合到一个根路径为/
的虚拟文件系统。文件系统被挂载到该目录结构,并且在启动时工作目录会被更改到主文件系统的挂载目录。
在STM32/Pyboard
上,内置闪存被挂载在/flash
,可选的SD卡被挂载在/sd
.而ESP8266/ESP32
的主文件系统则被挂载在/
。
块设备
块设备是实现了os.AbstractBlockDev
协议类的实例。
内置块设备
端口提供内置块设备以访问其主闪存。
开机时,MicroPython 会尝试侦测默认闪存上的文件系统,并自动进行配置并加载,如果找不到文件系统,MicroPython 会尝试为整个闪存创建一个FAT文件系统。端口还可以提供"出厂重置"主闪存的机制,通常是在开机时通过按键组合来实现。
STM32/Pyboard
pyb.Flash
类可以访问内部闪存,对于某些有大容量外部闪存的板子(如:Pyboard D)则会使用外部闪存,必须要指定start
参数,如:pyb.Flash(start=0)
。
**注意:**为实现向后兼容性,不带参数的情况下(即 pyb.Flash()),仅实现简单的块接口,并反映 USB MSC 所显示的虚拟设备(即在开始时包含一个虚拟分区表)。
ESP8266
内部闪存以块设备对象的形式呈现,启动时在 flashbdev
模块中创建。默认情况下,该块设备对象被添加为全局变量,通常只需使用 bdev
即可访问。它实现了扩展接口。
ESP32
esp32.Partition
类为电路板定义的分区实现了一个块设备。与 ESP8266 类似,有一个指向默认分区的全局变量 bdev
。它实现了扩展接口。
自定义块设备
下面的类实现了一个简单的块设备,它使用bytearry
将数据存储在内存中:
class RAMBlockDev:
def __init__(self, block_size, num_blocks):
self.block_size = block_size
self.data = bytearray(block_size * num_blocks)
def readblocks(self, block_num, buf):
for i in range(len(buf)):
buf[i] = self.data[block_num * self.block_size + i]
def writeblocks(self, block_num, buf):
for i in range(len(buf)):
self.data[block_num * self.block_size + i] = buf[i]
def ioctl(self, op, arg):