MicroPython的文件系统操作

本文介绍了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_sizeself.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):if op == 4: # 获取块数return len(self.data) // self.block_sizeif op == 5: # 获取块大小return self.block_size

使用举例:

import osbdev = RAMBlockDev(512, 50)
os.VfsFat.mkfs(bdev)
os.mount(bdev, '/ramdisk')

下面举例说明同时支持简单接口和扩展接口(即同时支持 os.AbstractBlockDev.readblocks()os.AbstractBlockDev.writeblocks() 方法的签名和行为)的块设备:

class RAMBlockDev:def __init__(self, block_size, num_blocks):self.block_size = block_sizeself.data = bytearray(block_size * num_blocks)def readblocks(self, block_num, buf, offset=0):addr = block_num * self.block_size + offsetfor i in range(len(buf)):buf[i] = self.data[addr + i]def writeblocks(self, block_num, buf, offset=None):if offset is None:# 先擦除,再写for i in range(len(buf) // self.block_size):self.ioctl(6, block_num + i)offset = 0addr = block_num * self.block_size + offsetfor i in range(len(buf)):self.data[addr + i] = buf[i]def ioctl(self, op, arg):if op == 4: # 块数量return len(self.data) // self.block_sizeif op == 5: # 块大小return self.block_sizeif op == 6: # 块擦除return 0

由于它支持扩展接口,因此可以与 littlefs 一起使用:

import osbdev = RAMBlockDev(512, 50)
os.VfsLfs2.mkfs(bdev)
os.mount(bdev, '/ramdisk')

挂载后,文件系统(无论其类型如何)就可以像在 Python 代码中使用的那样使用了:

with open('/ramdisk/hello.txt', 'w') as f:f.write('Hello world')
print(open('/ramdisk/hello.txt').read())

文件系统

MicroPython 移植可以提供 FAT、littlefs v1 和 littlefs v2 的实现。

下表显示了特定端口/板卡组合的固件默认包含哪些文件系统,但在定制固件构建中可以选择启用这些文件系统。

板子FATlittlefs v1littlefs v2
pyboard 1.0, 1.1, D
其它STM32
ESP8266(1M)
ESP8266(2M+)
ESP32

FAT

FAT 文件系统的主要优点是可以通过已支持的电路板(如 STM32)上的 USB MSC 进行访问,无需在主机 PC 上安装任何额外的驱动程序。

不过,FAT 不能容忍写入过程中的断电,这会导致文件系统损坏。对于不需要 USB MSC 的应用程序,建议使用 littlefs 代替。

使用 FAT 格式化整个闪存:

# ESP8266 和 ESP32
import os
os.umount('/')
os.VfsFat.mkfs(bdev)
os.mount(bdev, '/')# STM32
import os, pyb
os.umount('/flash')
os.VfsFat.mkfs(pyb.Flash(start=0))
os.mount(pyb.Flash(start=0), '/flash')
os.chdir('/flash')

Littlefs

Littlefs 是专为闪存设备设计的文件系统,对文件系统损坏的抵抗能力更强。

**注意:**有报告称,littlefs v1 和 v2 在某些情况下会出现故障,详情请参见 littlefs 第 347 期和 littlefs 第 295 期。

使用 littlefs v2 格式化整个闪存:

# ESP8266 and ESP32
import os
os.umount('/')
os.VfsLfs2.mkfs(bdev)
os.mount(bdev, '/')# STM32
import os, pyb
os.umount('/flash')
os.VfsLfs2.mkfs(pyb.Flash(start=0))
os.mount(pyb.Flash(start=0), '/flash')
os.chdir('/flash')

使用 littlefs FUSE 驱动程序,还可以在电脑上通过 USB MSC 访问 littlefs 文件系统。请注意,必须同时指定 --block_size 和 --block_count 选项才能覆盖默认值。例如(在构建 littlefs-fuse 可执行文件后):

$ ./lfs --block_size=4096 --block_count=512 -o allow_other /dev/sdb1 mnt

这将允许在 mnt 目录下访问主板的 littlefs 文件系统。要获取 block_sizeblock_count 的正确值,请使用:

import pyb
f = pyb.Flash(start=0)
f.ioctl(1, 1)  # 在 littlefs raw-block 模式下,
block_count = f.ioctl(4, 0)
block_size = f.ioctl(5, 0)

Hybrid (STM32)

通过使用 pyb.Flashstartlen 参数,可以创建跨闪存设备子集的块设备。

例如,将前 256kiB 配置为 FAT(可通过 USB MSC 使用),其余配置为 littlefs:

import os, pyb
os.umount('/flash')
p1 = pyb.Flash(start=0, len=256*1024)
p2 = pyb.Flash(start=256*1024)
os.VfsFat.mkfs(p1)
os.VfsLfs2.mkfs(p2)
os.mount(p1, '/flash')
os.mount(p2, '/data')
os.chdir('/flash')

这对于通过 USB MSC 提供 Python 文件、配置和其他很少修改的内容可能很有用,但也允许将频繁更改的应用程序数据驻留在 littlefs 上,以更好地应对断电等情况。

偏移量 0 处的分区将自动挂载(文件系统类型也会自动检测),但也可以添加以下内容:

import os, pyb
p2 = pyb.Flash(start=256*1024)
os.mount(p2, '/data')

到 boot.py 以挂载数据分区。

Hybrid (ESP32)

在 ESP32 上,如果构建了自定义固件,可以修改 partitions.csv 来定义任意分区布局。

启动时,名为 "vfs "的分区默认挂载在/位置,但也可以使用 boot.py 挂载其他分区:

import esp32, os
p = esp32.Partition.find(esp32.Partition.TYPE_DATA, label='foo')
os.mount(p, '/foo')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/607704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试 React 框架八股文十问十答第二期

面试 React 框架八股文十问十答第二期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)redux 的工作流程&…

golang中gorm使用

前言 记录下go语言操作mysql数据库,选用gorm,gorm是一个流行的对象关系映射(ORM)库,用于简化与数据库的交互。 接入步骤 安装gorm:首先,你需要使用Go模块来安装gorm。在终端中运行以下命令&…

【Linux】nmap命令:扫描网络中的主机和端口

目录 1.扫描特定IP地址的所有端口: 2.扫描特定IP地址的特定端口: 3.扫描一个IP地址范围的端口: 4.扫描特定端口范围: 5.扫描并显示所有端口的详细信息: 6.扫描并输出XML格式的结果: 7.使用“ping…

Doris 案例篇——长安汽车基于 Doris 的车联网数据分析平台建设实践

Doris 案例篇——长安汽车基于 Doris 的车联网数据分析平台建设实践 随着消费者更安全、更舒适、更便捷的驾驶体验需求不断增长,汽车智能化已成必然趋势。长安汽车智能化研究院作为长安汽车集团有限责任公司旗下的研发机构,专注于汽车智能化技术的创新与研究。为满足各业务部…

数据结构第十一弹---堆

堆 1、堆的概念及结构2、堆的性质3、堆的调整算法3.1、向下调整算法3.2、向上调整算法 4、堆的实现4.1、头文件包含和结构定义4.2、初始化4.3、销毁4.4、插入数据4.5、删除数据 删除堆顶4.6、获取堆顶元素4.7、获取有效数据个数4.8、判断是否为空 5、代码汇总5.1、Heap.h5.2、H…

好用的设备租赁管理软件有哪些?

“我们公司是做设备租赁的,想找一款适合设备租赁的库存管理软件,最好有库存管理,客户信息,设备外调管理,租赁天数管理,设备的借出与归还信息管理与查询。” 总结一下—— 库存管理客户信息管理设备租赁管…

阿里云服务器 使用Certbot申请免费 HTTPS 证书及自动续期

前言 Certbot是一款免费且开源的自动化安全证书管理工具,由电子前沿基金会(EFF)开发和维护,是在Linux、Apache和Nginx服务器上配置和管理SSL/TLS证书的一种机制。Certbot可以自动完成域名的认证并安装证书。 一、 安装软件 1.1…

38.深入MySQL

深入MySQL 索引 索引是关系型数据库中用来提升查询性能最为重要的手段。关系型数据库中的索引就像一本书的目录,我们可以想象一下,如果要从一本书中找出某个知识点,但是这本书没有目录,这将是意见多么可怕的事情!我们…

JVM如何执行synchronized修饰的方法

首先市面上关于synchronized的资料已经很多了,但是大家对于底层的原理实现可能没有什么概念,大多都是死记硬背,所以我想通过实战的方式给大家带来一些不一样的体验。具体体现在哪些方面呢? 更系统。市面上目前虽然资料众多&#x…

【OpenCV学习笔记02】- 图像入门

内容 这里介绍了图像处理的入门操作,,你将学习如何读取图像,如何显示图像以及如何将其保存回去你将学习以下功能:cv.imread(),cv.imshow(),cv.imwrite() 简单使用OpenCV 读取图像 使用cv.imread()函数读…

【程序员干货】开发常用免费接口

全国快递物流地图轨迹查询:【H5物流轨迹、单号识别】通过物流单号和收寄件地址,自动评估物流时效,并在地图中展示包裹运输轨迹。包括顺丰、圆通、申通等主流快递公司。自动识别快递公司及单号,实时查询,稳定高效&#…

WPF 入门教程DispatcherTimer计时器

https://www.zhihu.com/tardis/bd/art/430630047?source_id1001 在 WinForms 中,有一个名为 Timer 的控件,它可以在给定的时间间隔内重复执行一个操作。WPF 也有这种可能性,但我们有DispatcherTimer控件,而不是不可见的控件。它几…

15-链表-环形链表 II

这是链表的第15题,力扣链接。 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链…

中科驭数诚邀您参加第二届证券基金行业先进计算技术大会暨2024低时延技术创新实践论坛(上海站)

低时延技术是证券基金期货领域业务系统的核心技术,是打造极速交易系统领先优势的关键,也是证券基金行业关注的前沿技术热点。 继去年圆满举办首届证券基金行业先进计算技术大会之后,在中国计算机学会集成电路设计专委、先进计算产业联盟、证…

在macos上查看当前进程的栈信息

概述 在调试程序时,如cpu莫名的高或低,一个常用的方式就是打印当前进行的调用栈,然后确认各线程的执行函数是否有异常。 在linux系统中可以使用pstack命令,直接打印各线程的栈信息,可惜在macos上没有该命令。一种解决…

25 心形按钮

效果演示 实现了一个心形的心形图案&#xff0c;当用户点击图案时&#xff0c;图案会旋转并缩小&#xff0c;同时背景颜色会变成白色。 Code <div class"love"><input id"switch" type"checkbox"><label class"love-heart&…

049.Python包和模块_虚拟环境超详细讲解

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

二叉树的层序遍历经典问题(算法村第六关白银挑战)

基本的层序遍历与变换 二叉树的层序遍历 102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入…

Java顺序表(1)

&#x1f435;本篇文章将对顺序表中的方法进行模拟实现 一、线性表 线性表是指在逻辑结构上呈连续的线性结构&#xff0c;而在物理结构上不一定是连续的结构&#xff0c;常见的线性表有&#xff1a;顺序表、链表、栈、队列等 二、顺序表 顺序表一般采用数组来存储数据&#x…

【STM32】| 01——常用外设 | USART

系列文章目录 【STM32】| 01——常用外设 | USART 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 前言1. 基础理论1.1 并行通信和串行通信1.2 同步通信和异步通信1.3 单工/半双工/全双工1.4 电平信号(RS232/TTL)和差分信号(RS485)1.5 端口(COM) 2. 串口理论2.1 串口物理…