1SPIFFS 文件系统 2================= 3 4:link_to_translation:`en:[English]` 5 6概述 7-------- 8 9SPIFFS 是一个用于 SPI NOR flash 设备的嵌入式文件系统,支持磨损均衡、文件系统一致性检查等功能。 10 11说明 12----- 13 14 - 目前,SPIFFS 尚不支持目录,但可以生成扁平结构。如果 SPIFFS 挂载在 ``/spiffs`` 下,在 ``/spiffs/tmp/myfile.txt`` 路径下创建一个文件则会在 SPIFFS 中生成一个名为 ``/tmp/myfile.txt`` 的文件,而不是在 ``/spiffs/tmp`` 下生成名为 ``myfile.txt`` 的文件; 15 - SPIFFS 并非实时栈,每次写操作耗时不等; 16 - 目前,SPIFFS 尚不支持检测或处理已损坏的块。 17 18工具 19----- 20 21spiffsgen.py 22^^^^^^^^^^^^^^^^ 23 24:component_file:`spiffsgen.py<spiffs/spiffsgen.py>`(只写)是 SPIFFS 的一种 Python 实现,可用于从主机文件夹内容生成文件系统映像。打开终端并运行以下命令即可使用 ``spiffsgen.py``:: 25 26 python spiffsgen.py <image_size> <base_dir> <output_file> 27 28参数(必选)说明如下: 29 30- **image_size**:分区大小,用于烧录生成的 SPIFFS 映像; 31- **base_dir**:创建 SPIFFS 映像的目录; 32- **output_file**:SPIFFS 映像输出文件。 33 34其他参数(可选)也参与控制映像的生成,您可以运行以下帮助命令,查看这些参数的具体信息:: 35 36 python spiffsgen.py --help 37 38上述可选参数对应 SPIFFS 构建配置选项。若想顺利生成可用的映像,请确保使用的参数或配置与构建 SPIFFS 时所用的参数或配置相同。运行帮助命令将显示参数所对应的 SPIFFS 构建配置。如未指定参数,将使用帮助信息中的默认值。 39 40映像生成后,您可以使用 ``esptool.py`` 或 ``parttool.py`` 烧录映像。 41 42您可以在命令行或脚本中手动单独调用 ``spiffsgen.py``,也可以直接从构建系统调用 ``spiffs_create_partition_image`` 来使用 ``spiffsgen.py``。 43 44在 Make 构建系统中运行:: 45 46 SPIFFS_IMAGE_FLASH_IN_PROJECT := ... 47 SPIFFS_IMAGE_DEPENDS := ... 48 $(eval $(call spiffs_create_partition_image,<partition>,<base_dir>)) 49 50在 CMake 构建系统中运行:: 51 52 spiffs_create_partition_image(<partition> <base_dir> [FLASH_IN_PROJECT] [DEPENDS dep dep dep...]) 53 54在构建系统中使用 ``spiffsgen.py`` 更为方便,构建配置自动传递给 ``spiffsgen.py`` 工具,确保生成的映像可用于构建。比如,单独调用 ``spiffsgen.py`` 时需要用到 *image_size* 参数,但在构建系统中调用 ``spiffs_create_partition_image`` 时,仅需要 *partition* 参数,映像大小将直接从工程分区表中获取。 55 56Make 构建系统和 CMake 构建系统结构有所不同,请注意以下几点: 57 58- 在 Make 构建系统中使用 ``spiffs_create_partition_image``,需从工程 Makefile 中调用; 59- 在 CMake 构建系统中使用 ``spiffs_create_partition_image``,需从组件 CMakeLists.txt 文件调用。 60 61您也可以指定 ``FLASH_IN_PROJECT``,然后使用 ``idf.py flash`` 或 ``make flash`` 将映像与应用程序二进制文件、分区表等一起自动烧录至设备,例如: 62 63在 Make 构建系统中运行:: 64 65 SPIFFS_IMAGE_FLASH_IN_PROJECT := 1 66 $(eval $(call spiffs_create_partition_image,<partition>,<base_dir>)) 67 68在 CMake 构建系统中运行:: 69 70 spiffs_create_partition_image(my_spiffs_partition my_folder FLASH_IN_PROJECT) 71 72不指定 FLASH_IN_PROJECT/SPIFFS_IMAGE_FLASH_IN_PROJECT 也可以生成映像,但须使用 ``esptool.py``、``parttool.py`` 或自定义构建系统目标手动烧录。 73 74有时基本目录中的内容是在构建时生成的,您可以使用 DEPENDS/SPIFFS_IMAGE_DEPENDS 指定目标,因此可以在生成映像之前执行此目标。 75 76在 Make 构建系统中运行:: 77 78 dep: 79 ... 80 81 SPIFFS_IMAGE_DEPENDS := dep 82 $(eval $(call spiffs_create_partition_image,<partition>,<base_dir>)) 83 84在 CMake 构建系统中运行:: 85 86 add_custom_target(dep COMMAND ...) 87 88 spiffs_create_partition_image(my_spiffs_partition my_folder DEPENDS dep) 89 90请参考 :example:`storage/spiffsgen`,查看示例。 91 92mkspiffs 93^^^^^^^^^^^ 94 95您也可以使用 `mkspiffs <https://github.com/igrr/mkspiffs>`_ 工具创建 SPIFFS 分区映像。与 ``spiffsgen.py`` 相似,`mkspiffs <https://github.com/igrr/mkspiffs>`_ 也可以用于从指定文件夹中生成映像,然后使用 ``esptool.py`` 烧录映像。 96 97该工具需要获取以下参数: 98 99- **Block Size**:4096(SPI flash 标准) 100- **Page Size**:256(SPI flash 标准) 101- **Image Size**:分区大小(以字节为单位,可从分区表中获取) 102- **Partition Offset**:分区起始地址(可从分区表内获取) 103 104运行以下命令,将文件夹打包成 1 MB 大小的映像:: 105 106 mkspiffs -c [src_folder] -b 4096 -p 256 -s 0x100000 spiffs.bin 107 108运行以下命令,将映像烧录到 ESP32(偏移量:0x110000):: 109 110 python esptool.py --chip {IDF_TARGET_PATH_NAME} --port [port] --baud [baud] write_flash -z 0x110000 spiffs.bin 111 112 113选择合适的 SPIFFS 工具 114~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 115 116上面介绍的两款 SPIFFS 工具功能相似,需根据实际情况,选择合适的一款。 117 118以下情况优先选用 ``spiffsgen.py`` 工具: 119 1201. 仅需在构建时简单生成 SPIFFS 映像,请选择使用 ``spiffsgen.py``,``spiffsgen.py`` 可以直接在构建系统中使用函数或命令生成 SPIFFS 映像。 1212. 主机没有可用的 C/C++ 编译器时,可以选择使用 ``spiffsgen.py`` 工具,``spiffsgen.py`` 不需要编译。 122 123以下情况优先选用 ``mkspiffs`` 工具: 124 1251. 如果您除了需要生成映像外,还需要拆包 SPIFFS 映像,请选择使用 ``mkspiffs`` 工具。``spiffsgen.py`` 目前尚不支持此功能。 1262. 如果您当前环境中 Python 解释器不可用,但主机编译器可用,或者有预编译的 ``mkspiffs`` 二进制文件,此时请选择使用 ``mkspiffs`` 工具。但是,``mkspiffs`` 没有集成到构建系统,用户必须自己完成以下工作:在构建期间编译 ``mkspiffs`` (如果未使用预编译的二进制文件),为输出文件创建构建规则或目标,将适当的参数传递给工具等。 127 128另请参阅 129-------- 130 131- :doc:`分区表 <../../api-guides/partition-tables>` 132 133应用示例 134------------------- 135 136:example:`storage/spiffs` 目录下提供了 SPIFFS 应用示例。该示例初始化并挂载了一个 SPIFFS 分区,然后使用 POSIX 和 C 库 API 写入和读取数据。请参考 ``example`` 目录下的 README.md 文件,查看详细信息。 137 138 139高级 API 参考 140------------------------ 141 142.. include-build-file:: inc/esp_spiffs.inc 143