3、数据存储方案选型:嵌入式存储介质对比

做血氧仪,数据存哪儿?这是个绕不开的问题。

我刚开始做嵌入式项目那会儿,觉得存储嘛,随便找个芯片焊上去就行了。结果呢?产品用了三个月,数据丢了,用户投诉,老板拍桌子。从那以后,我养成了一个习惯——先想清楚存什么、存多久、怎么存,再选介质

血氧仪的数据量其实不大。一次测量,无非是血氧饱和度、脉率、波形数据,再加上时间戳。但问题是,它要长期记录,比如连续监测24小时、甚至7天。这就对存储的容量、寿命、可靠性提出了要求。

3.1 嵌入式存储介质对比:Flash / SD卡 / EEPROM

咱们一个一个说。

3.1.1 EEPROM

EEPROM,电可擦除可编程只读存储器。这玩意儿的特点是:按字节读写,掉电不丢。我最早做的一个血氧仪原型,就是用EEPROM存配置参数和最近几次测量结果。

但它的缺点也很明显——容量小。常见的也就几KB到几十KB。你想想看,一次血氧波形数据可能就几百字节,存个几十次就满了。而且写入速度慢,擦写次数有限(一般10万次左右)。

我的建议:EEPROM适合存系统配置、校准参数、设备ID这类小量、不频繁修改的数据。别用它存历史记录,那是自找麻烦。

3.1.2 Flash(NOR Flash / NAND Flash)

Flash是嵌入式系统的主力存储。血氧仪里常用的有NOR Flash和NAND Flash两种。

  • NOR Flash:读取快,支持XIP(片上执行),但写入慢,容量一般16MB以下。适合存固件、少量数据。
  • NAND Flash:容量大(几百MB到几GB),写入快,但需要坏块管理。适合存大量历史数据。

我个人习惯,在血氧仪这种低功耗、小数据量的场景下,更倾向用NOR Flash。为什么?因为血氧仪不需要存视频、图片,几十MB的NOR Flash足够记录几万条测量数据了。而且NOR Flash的可靠性比NAND高,不需要复杂的ECC纠错。

小提示:选Flash时,注意看它的擦写次数。一般NOR Flash是10万次,NAND Flash是1万~10万次。如果你的血氧仪每5分钟记录一次数据,一天288次,一年就是10万次。嗯,算算寿命,心里就有数了。

3.1.3 SD卡

SD卡,说白了就是带控制器的NAND Flash。它最大的好处是容量大、可插拔、通用性强。我见过一些高端血氧仪,直接插TF卡,用户可以把数据取出来在电脑上看。

但SD卡也有坑:

  • 功耗高:读写时电流几十mA,待机也要几百μA。对电池供电的血氧仪来说,是个负担。
  • 可靠性差:接触不良、文件系统损坏、突然掉电丢数据……我踩过这个坑。有一次产品在运输过程中震动,SD卡松了,用户数据全没了。
  • 体积大:虽然TF卡很小,但卡座占地方,还影响防水设计。

我的结论:除非你的血氧仪需要超大容量存储(比如连续记录几天的高频波形),或者需要用户方便取出数据,否则别用SD卡。用Flash更省心。

介质 容量 写入速度 擦写寿命 功耗 适用场景
EEPROM 几KB~几十KB 慢(ms级) 10万次 极低 配置参数、校准数据
NOR Flash 1MB~64MB 中等(μs级读,ms级写) 10万次 固件、历史记录、日志
NAND Flash 64MB~几GB 快(μs级读,μs级写) 1万~10万次 中等 大量数据、音视频
SD卡 几GB~几十GB 取决于内部Flash 可插拔、大容量、用户取数据

3.2 存储容量与寿命评估

选好了介质,接下来算算够不够用。

咱们以血氧仪为例:

  • 一次测量数据:血氧值(2字节) + 脉率(2字节) + 时间戳(4字节) + 波形数据(可选,比如100字节) ≈ 108字节
  • 如果每5分钟记录一次,一天记录288次,一天的数据量 ≈ 108 × 288 ≈ 31KB
  • 如果存30天,总数据量 ≈ 31KB × 30 ≈ 930KB

你看,1MB的NOR Flash就够用了。但别忘了,文件系统、日志、配置参数也要占空间。我一般留出20%~30%的余量

寿命怎么算?

假设你用了1MB的NOR Flash,擦写寿命10万次。如果你每5分钟写一次数据,一天写288次,一年写10.5万次。嗯,刚好一年就快挂了。

怎么办?

两个办法:

  1. 用更大的Flash:比如用4MB的,磨损均衡后,寿命可以延长4倍。
  2. 降低写入频率:比如改成每10分钟记录一次,或者只在血氧异常时记录。
注意:我曾经遇到过一款产品,用了便宜的Flash,没做磨损均衡,结果半年后存储区就坏了。用户数据全丢,只能返厂换芯片。所以,寿命评估一定要做,而且要做最坏情况下的评估

3.3 文件系统选择:FAT32 vs LittleFS

有了存储介质,还得有个文件系统来管理数据。不然你读写数据就像在乱翻抽屉,找都找不到。

FAT32

FAT32是Windows系统常用的文件系统。它的好处是通用性强,插到电脑上就能读。但用在嵌入式系统里,问题不少:

  • 没有掉电保护:突然断电,文件系统可能损坏。我有个同事,产品在写入日志时被拔了电源,结果整个分区都读不出来了。
  • 碎片化严重:频繁写入小文件,会产生大量碎片,影响性能。
  • 占用RAM多:FAT32需要较大的缓冲区,对资源受限的MCU不友好。

我的建议:除非你的血氧仪需要和PC直接交换数据(比如插USB读SD卡),否则别用FAT32。它不适合嵌入式场景。

LittleFS

LittleFS是ARM专门为嵌入式系统设计的文件系统。它有几个特点:

  • 掉电安全:写入时突然断电,最多丢当前这次数据,不会损坏整个文件系统。我测试过,反复掉电几百次,数据完好。
  • 磨损均衡:自动把写入操作分散到不同存储块,延长Flash寿命。
  • 资源占用少:RAM占用只有几百字节,适合MCU。

我个人习惯,在血氧仪这类电池供电、频繁写入、掉电风险高的设备上,首选LittleFS。它虽然不能直接插电脑读,但可以通过串口或蓝牙把数据导出,转换成CSV或JSON格式,用户一样能看。

核心结论:血氧仪数据存储,推荐方案是 NOR Flash + LittleFS。容量选4MB以上,寿命评估按最坏情况算,留足余量。

3.4 数据安全与掉电保护

数据安全,说白了就是别丢数据、别坏数据。掉电保护是重中之重。

我踩过最大的坑,就是掉电丢数据。有一次做产品测试,连续掉电100次,结果有3次数据写了一半,文件系统直接挂了。从那以后,我总结了几条经验:

  • 写前备份:写入关键数据前,先把旧数据备份到另一个区域。写成功了再删备份。
  • 写后校验:写入完成后,读回来校验一下。CRC或MD5都行,别省这一步。
  • 使用事务机制:把一次写入操作拆成「开始-写入-提交」三步。如果掉电,下次启动时回滚到上一个完整状态。
  • 硬件上做掉电检测:在电源输入端加一个电压检测电路,当检测到电压低于阈值时,MCU立即停止写入,保存关键数据。

嗯,这里要注意:掉电保护不是靠硬件就能解决的。软件上也要配合。比如LittleFS本身就支持掉电安全,但如果你用FAT32,就得自己实现保护逻辑,那工作量就大了。

最后说一句:数据存储这件事,宁可多花点成本,也别省那几毛钱的Flash芯片。用户的数据丢了,信任也就丢了。这个道理,我是在被老板骂了三次之后才真正明白的。