espidf SPIFFS 文件系统使用的一个注意事项
本文总结了ESP-IDF中SPIFFS分区配置的关键要点。当使用单一SPIFFS分区时,partition_label可设为NULL自动识别;但存在多个分区时必须明确指定partition_label为对应分区名称(如"spiffs"),否则会导致挂载失败。文章详细解释了配置参数:base_path是挂载路径前缀,partition_label对应分区表标签,max_files
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
spiffs, data, spiffs, , 3M ,
类似于这样的配置,只有一个分区,代码中初始化
esp_vfs_spiffs_conf_t conf = {
.base_path = "/spiffs",
.partition_label = NULL,
.max_files = 5,
.format_if_mount_failed = true
};
可以填写.partition_label = NULL,一个分区自动识别了。
但是,坑在这里,如果是两个分区
# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x4000,
otadata, data, ota, 0xd000, 0x2000,
phy_init, data, phy, 0xf000, 0x1000,
model, data, spiffs, 0x10000, 0xF0000,
ota_0, app, ota_0, 0x100000, 6M,
ota_1, app, ota_1, 0x700000, 6M,
spiffs, data, spiffs, 0xD00000, 1M,
注意,最后面加,号
如果两个分区,烧录需要指定烧录到哪个分区
# 配置 SPIFFS 自动烧录(关键代码)
spiffs_create_partition_image(spiffs data FLASH_IN_PROJECT)
spiffs分区名字 data文件夹名字
然后使用的时候有个地方很容易忽略
// SPIFFS配置(指定spiffs分区)
esp_vfs_spiffs_conf_t conf = {
.base_path = "/spiffs",
.partition_label = "spiffs",
.max_files = 5,
.format_if_mount_failed = true
};
.partition_label = "spiffs",
不能用NULL,必须指定分区名称了。base_path并不是分区名称的意思,而第二个partition_label才是,所以不要弄混了,多分区害我搞了几个小时才明白问题在这里。会导致读不出来,然后改别的地方又冒出一大堆几十个错误,哎。。。。最后发现是这里问题,踏马的
2. 各参数详解
(1).base_path = "/spiffs"
- 作用:指定 SPIFFS 分区在系统中的 “挂载路径”(类似电脑的
C:/
D:/
)。 - 使用:后续通过文件操作函数(如
fopen
fread
)访问该分区时,必须以这个路径为前缀。例如:fopen("/spiffs/test.txt", "r")
表示打开 SPIFFS 分区中的test.txt
文件。 - 注意:路径可以自定义(如
"/storage"
),但需保证唯一性,避免与其他文件系统(如 FATFS)冲突。
(2).partition_label = "spiffs"
- 作用:指定要挂载的 SPIFFS 分区的 “标签”(对应分区表中的
label
字段)。 - 背景:Flash 中可能有多个 SPIFFS 类型的分区(如你的项目中有
model
和spiffs
两个),通过标签可以精准定位到目标分区。 - 对应关系:必须与
partitions.csv
中目标分区的标签完全一致,否则会报 “分区未找到” 错误。
(3).max_files = 5
- 作用:限制 SPIFFS 同时打开的最大文件数量(防止资源耗尽)。
- 设置:根据实际需求调整(如同时播放音乐、读取配置文件等场景可能需要更大的值),但不宜过大(会占用更多内存)。
(4).format_if_mount_failed = true
- 作用:当 SPIFFS 挂载失败时(如分区未初始化、文件系统损坏),自动格式化该分区并重新挂载。
- 适用场景:
- 首次使用新分区(为空,无文件系统结构)时,自动初始化;
- 分区损坏时(如意外断电导致文件系统错乱),自动修复(但会丢失所有数据)。
- 风险:设为
true
可能导致数据丢失,生产环境可根据需求改为false
(仅报错不格式化)。
更多推荐
所有评论(0)