2. 嵌入式存储介质选型:NOR Flash、NAND Flash、eMMC、UFS、SD卡的特点与适用场景对比

做嵌入式系统,选存储介质是第一步,也是最容易踩坑的一步。

我见过不少项目,硬件都打样回来了,才发现Flash读写速度跟不上,或者寿命不够。嗯,那时候改方案,成本可就高了去了。

今天咱们就把市面上主流的几种存储介质掰开揉碎聊一聊。NOR Flash、NAND Flash、eMMC、UFS、SD卡,它们各自什么脾气,适合干什么活,我一次性说清楚。

2.1 NOR Flash:老当益壮的代码执行器

NOR Flash 最大的特点是什么?支持XIP(就地执行)。说白了,就是CPU可以直接在上面跑代码,不需要先把代码拷贝到RAM里。

我个人习惯在Bootloader阶段用NOR Flash。为什么?因为上电就能跑,延迟极低。我记得有一次调试一个FPGA的加载时序,用NAND死活起不来,换成NOR Flash,一次就过了。

核心参数速览:

  • 读取速度:快,约 80-100MB/s(SPI接口下)
  • 写入速度:慢,约 1-5MB/s
  • 擦除速度:慢,块擦除约 1-2秒
  • 寿命:约 10万次擦写
  • 容量:通常 1MB - 512MB

你想想看,NOR Flash 的读取时序和SRAM很像,地址线直接给,数据就出来。但它的写入就麻烦了,需要先擦除再写,而且擦除单位是块(通常64KB或128KB)。

避坑指南:我曾经在一个工业控制项目里,用NOR Flash存日志数据。结果三个月后,设备频繁死机。查了半天,发现是频繁写入导致某个块提前报废了。后来我加了磨损均衡算法,才解决问题。

适用场景:

  • Bootloader / BIOS 存储
  • FPGA 配置芯片
  • 对可靠性要求极高的工业控制
  • 代码量小、不需要频繁更新的场景

2.2 NAND Flash:大容量存储的主力军

NAND Flash 和 NOR Flash 完全是两种思路。NAND 走的是「便宜大碗」路线,容量大、成本低,但操作复杂。

为什么复杂?因为NAND天生就有坏块。你买来一颗新的NAND芯片,里面可能就有几个坏块。这很正常,厂商出厂时就标记好了。

我的经验:第一次用NAND做文件系统时,我天真地以为直接读写就行。结果数据校验总是出错。后来才明白,NAND必须搭配ECC(纠错码)和坏块管理机制。现在主流的SLC NAND需要1bit ECC,MLC需要4bit,TLC需要8bit甚至更多。

NAND Flash 按存储单元分为几种:

类型 每单元位数 寿命(擦写次数) 速度 成本
SLC 1 bit 约 10万次 最快 最高
MLC 2 bit 约 3000-10000次 中等 中等
TLC 3 bit 约 1000-3000次 较慢 较低
QLC 4 bit 约 500-1000次 最慢 最低

我个人建议,做嵌入式Linux rootfs,至少用MLC起步。TLC和QLC虽然便宜,但寿命和速度都堪忧,用在监控录像、日志存储这类写密集型场景,很容易翻车。

2.3 eMMC:集成度最高的嵌入式存储方案

eMMC 说白了就是把NAND Flash和控制器封装在一起。你买到的eMMC芯片,里面已经包含了坏块管理、ECC纠错、磨损均衡等功能。

这对嵌入式工程师来说,简直是福音。你不需要再写复杂的NAND驱动,直接用MMC子系统操作就行。

eMMC 的版本演进:

  • eMMC 4.5:速度约 200MB/s
  • eMMC 5.0:速度约 400MB/s
  • eMMC 5.1:速度约 400MB/s,支持HS400模式

我记得有个项目,客户要求用NAND做rootfs,结果开发周期拖了两个月,光调试坏块管理就花了一个月。后来我建议换成eMMC,一周就搞定了。这就是集成方案的价值。

注意:eMMC虽然方便,但它的寿命受限于内部的NAND颗粒。我曾经拆解过一个坏掉的eMMC,发现是内部某个Die的磨损均衡算法没做好,导致局部提前报废。所以,选eMMC时,尽量选大厂(三星、东芝、海力士)的,小厂的控制器算法可能不成熟。

适用场景:

  • Android / Linux 嵌入式系统
  • 手机、平板、智能电视
  • 对开发周期有要求的项目
  • 容量需求在 4GB - 256GB 之间

2.4 UFS:性能怪兽,旗舰标配

UFS(Universal Flash Storage)是eMMC的升级版。它采用了全双工通信,可以同时读写,而eMMC是半双工,读写不能同时进行。

你想想看,UFS 3.1的理论速度能达到 2.9GB/s,这已经接近SATA SSD的水平了。用在高端嵌入式设备上,体验提升非常明显。

我的观察:现在旗舰手机基本都用UFS 3.1或UFS 4.0。但在工业嵌入式领域,UFS还不太普及。为什么?因为UFS的控制器复杂度高,低温环境下稳定性不如eMMC。我曾经在-40℃环境下测试UFS,发现读写延迟增加了3倍,而eMMC只增加了50%。

适用场景:

  • 旗舰手机、平板
  • 车载信息娱乐系统
  • 高性能边缘计算设备
  • 需要高速连续读写的场景

2.5 SD卡:可插拔的灵活选择

SD卡其实内部也是NAND Flash加控制器,但它多了个可插拔的特性。这个特性既是优点也是缺点。

优点很明显:容量可以随时升级,数据可以方便地导出。缺点呢?接触不良、热插拔导致的数据损坏,我见过太多了。

SD卡速度等级:

  • Class 2:最低写入 2MB/s
  • Class 4:最低写入 4MB/s
  • Class 10:最低写入 10MB/s
  • UHS-I U3:最低写入 30MB/s
  • UHS-II:理论速度可达 312MB/s

我个人习惯,在需要频繁更换数据的场景用SD卡。比如无人机、运动相机、树莓派。但如果是工业设备,我坚决不用SD卡做主存储。为什么?因为SD卡的卡座是有寿命的,插拔几千次后,触点就会磨损。

避坑指南:我曾经在一个数据采集项目里用SD卡存数据,结果发现文件系统经常损坏。排查了很久,发现是设备震动导致SD卡瞬间接触不良。后来我加了螺丝固定卡座,并在软件里做了掉电保护,才解决问题。

2.6 选型决策树

说了这么多,到底怎么选?我画了一张图,帮你快速决策。

嵌入式存储介质选型决策树 存储需求 需要XIP执行? 需要大容量? 容量 < 512MB? 需要可插拔? NOR Flash NAND Flash SD卡 eMMC/UFS 需要高性能? eMMC UFS 注:实际选型还需考虑成本、功耗、温度范围等因素

2.7 总结:我的选型建议

说了这么多,最后给个简单粗暴的建议:

  • Bootloader + 小代码:用NOR Flash,省心
  • Linux rootfs + 中等容量:用eMMC,开发效率最高
  • 大容量 + 高性能:用UFS,但要注意散热
  • 数据导出 + 灵活更换:用SD卡,但别用在震动环境
  • 成本敏感 + 大容量:用NAND Flash,但要做好坏块管理

嗯,存储介质选型就聊到这儿。记住一句话:没有最好的存储,只有最合适的存储。选型时多想想你的应用场景,比盲目追求参数要靠谱得多。