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 选型决策树
说了这么多,到底怎么选?我画了一张图,帮你快速决策。
2.7 总结:我的选型建议
说了这么多,最后给个简单粗暴的建议:
- Bootloader + 小代码:用NOR Flash,省心
- Linux rootfs + 中等容量:用eMMC,开发效率最高
- 大容量 + 高性能:用UFS,但要注意散热
- 数据导出 + 灵活更换:用SD卡,但别用在震动环境
- 成本敏感 + 大容量:用NAND Flash,但要做好坏块管理
嗯,存储介质选型就聊到这儿。记住一句话:没有最好的存储,只有最合适的存储。选型时多想想你的应用场景,比盲目追求参数要靠谱得多。