ESP32 SPIFFS/FATFS高频写入优化及存储选型咨询
ESP32 高频小数据写入的Flash优化方案
针对你电池供电、每10分钟追加少量诊断数据的场景,以下是具体问题的解答:
1. 避免重写全部数据的追加策略
- 直接用追加模式打开文件:在Arduino里用
FILE_APPEND标志打开文件,每次写入都会直接贴在文件末尾,完全不会碰原有内容,自然不用重写整个文件。 - 预分配固定记录块:如果你的诊断数据是固定长度的结构(比如每次都是3个整数),可以预先给文件划分好固定大小的记录区域,每次写入直接跳转到下一个空记录的位置写,能减少文件碎片化,也降低元数据的写入开销。
- 单次唤醒内缓冲:如果允许攒个两三次数据再写(毕竟每次唤醒任务跑10秒,时间够),可以在RAM里先缓存这几次的数据,一次性追加写入,减少Flash写入次数。但注意深度睡眠会清空RAM,所以这个缓冲只能在单次唤醒周期内用,不能跨睡眠。
2. SPIFFS还是FATFS?
优先选SPIFFS:
- SPIFFS是专为嵌入式Flash做的轻量文件系统,对ESP32内置的小容量Flash(一般4MB)空间利用率更高,元数据开销小。
- 它的磨损均衡算法更适合频繁小写入,因为是按页管理,每次小写只会影响对应的数据页;而FATFS用簇管理,频繁小写会频繁更新FAT表,反而增加Flash磨损。
- FATFS更适合需要和电脑交换文件或者大容量存储的场景,你这只是存内部诊断数据,SPIFFS足够且更高效。
3. 追加模式会重写整个文件吗?
不会。不管是SPIFFS还是FATFS,用追加模式(FILE_APPEND)打开时,文件指针直接跳到末尾,写入只在末尾加新内容,原有数据完全不动。唯一的额外操作是更新文件大小这类元数据,但这点开销和重写整个文件比可以忽略。
4. 能存储整数数组吗?
完全可以。两种文件系统都支持二进制写入,直接把整数数组以二进制形式写进去就行,省空间还快:
#include <SPIFFS.h> // 示例:每次要存的整数数组 int diagData[] = {123, 456, 789}; size_t dataLen = sizeof(diagData); void setup() { SPIFFS.begin(); File logFile = SPIFFS.open("/diag_log.bin", FILE_APPEND); if (logFile) { // 把整数数组转成字节流写入 logFile.write((uint8_t*)diagData, dataLen); logFile.close(); } esp_deep_sleep_start(); }
如果需要可读性,也可以把整数转成字符串再追加,但二进制写入更高效。读取的时候只要以二进制模式打开,把数据读回数组就行。
外接SD卡的功耗注意点
如果非得用SD卡,一定要注意功耗控制:
- 写完立刻断电:用GPIO控制SD卡的电源引脚,写入完成后直接切断电源,别让SD卡待机电耗。
- 选SPI接口的低功耗SD卡模块:比SDIO接口功耗低,同时挑低功耗的SD卡型号(比如Class10 UHS-I低功耗款)。
- 但还是优先用内置Flash:ESP32深度睡眠时内置Flash几乎不耗电,而SD卡哪怕待机也有微安级功耗,而且内置4MB Flash足够存数十万条整数数组记录,完全够你用。
内容的提问来源于stack exchange,提问作者Pygmalion
相关产品推荐
相关产品推荐

