【MaixPy快速上手】存储系统介绍-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3735|回复: 0

【MaixPy快速上手】存储系统介绍

[复制链接]
发表于 2021-7-1 10:48 | 显示全部楼层 |阅读模式

[md]# 存储系统介绍

MaixPy 存储系统大致如下图所示:

[![](https://cn.maixpy.sipeed.com/assets/get_started/memory.png)](https://cn.maixpy.sipeed.com/assets/get_started/memory.png)

由上图可知,MaixPy 中的存储介质主要由  `Flash`,`SD`  卡组成,分为三块区域,分别是 MaixPy.bin 固件区,xxx.kmodel 模型区,文件系统区:Flash 上为  [`spiffs`](https://github.com/pellepl/spiffs)(SPI Flash File System),SD 卡为 Fatfs(FAT file system)。

## 1. MaixPy.bin 固件区[](https://cn.maixpy.sipeed.com/zh/get_started/get_started_fs.html#maixpybin-%E5%9B%BA%E4%BB%B6%E5%8C%BA)

用来存储 MaixPy.bin 固件,起始于 0x000000,因为 K210 会从 0x000000 地址开始运行程序。

## 2. xxx.kmodel 模型区[](https://cn.maixpy.sipeed.com/zh/get_started/get_started_fs.html#xxxkmodel-%E6%A8%A1%E5%9E%8B%E5%8C%BA)

通常起始于 0x300000,模型文件之所以不烧录在  `Flash`  的文件系统(文件系统会后续解释)中,原因有下:

1.  `Flash`  中文件系统拥有的内存并不够大,不足以放入大模型,更大的模型可以放入  `SD`  卡中。
2.  直接读取模型文件比经过文件系统读取速率更快。

该区域没有文件系统管理,需要根据烧录时的起始地址操作文件,例如当模型烧录在 0x500000 时的读取方法:

```
KpuTask = kpu.load(0x500000)

```

## 3. 文件系统区[](https://cn.maixpy.sipeed.com/zh/get_started/get_started_fs.html#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%8C%BA)

通常从 0xD00000 开始,该区域交由文件系统管理,我们预留了  `Flash`  末尾的  `3MiB`  空间,交由  [`spiffs`](https://github.com/pellepl/spiffs)  管理, 另外也支持  `FAT32`(Fatfs) 的  `SD`  卡。这些文件系统提供接口使我们通过  **文件名**  便可对文件进行读写操作,而不必像模型区那样使用  **文件起始地址**  操作。同时还能帮助我们有效管理存储介质,例如磨损均衡(Flash 是有磨损寿命的,相关知识请自行搜索)可以充分发挥 Flash 的寿命。

### 3.1. MaixPy 文件系统的使用[](https://cn.maixpy.sipeed.com/zh/get_started/get_started_fs.html#maixpy-%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%9A%84%E4%BD%BF%E7%94%A8)

由于  `Flash`  和  `SD`  卡的文件系统各不相同,接口不一致,使得操作不同文件系统需要调用不同接口,此时 MaixPy 中的虚拟文件系统(VFS)正是用于解决该问题,`VFS`  可以挂载多个不同类型文件系统,并为用户操作这些文件系统提供统一接口,用户使用这些接口时可以忽略不同文件系统之间的差异。这些接口在  `os`  模块中实现,使用示例如下:

```
import uos

print("files:", uos.listdir("/flash"))

with open("/flash/test.txt", "w") as f:
    f.write("hello text")

print("files:", uos.listdir("/flash"))

with open("/flash/test.txt", "r") as f:
    content = f.read()

print("read:", content)

```

以上示例中,`spiffs`  文件系统开机被自动挂载到  `/flash`  目录,用户只需要在使用  `os`  的接口时传入  `"/flash"`  目录名作为参数便可访问该文件系统。

解读:

-   导入  `uos`  模块
-   列出  `/flash`  目录下所有文件
-   向  `/flash`  目录写入一个名为  `test.txt`  的文件,内容为  `hello text`,
-   列出  `/flash`  目录下所有文件,会发现  `test.txt`  的存在
-   读取文件内容到  `content`  变量
-   打印  `content`  变量, 输出  `hello text`,也就是刚刚写入文件的内容
-   这个内容在开发板断电之后再上电,仍然能读到正确的内容(Flash 断电后不会丢失内容)

当然也支持 SD 卡, 如果你需要使用, SD 卡需要满足以下几点:

-   支持  `SPI`  模式, 市面上大多数正版卡都支持
-   分区为  `MBR (msdos)`
-   格式化为  `FAT32`
-   大小测试过最大  `128GiB`  可用 断电插入  `SD`  后, 上电,`SD`  卡会被挂载在  `/sd`,如果有多个分区,第二个分区名是`/sd2`

注意`/`(根目录)不能写入数据,只能往`/flash`或者`/sd`写入数据 开机如果有`SD`卡, 会自动将当前目录切换到`/sd`, 如果没有,则会自动切换到`/flash`[/md]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-28 01:33 , Processed in 0.069476 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表