记录数据的可靠性,通常只考虑到突然掉电、写入不完全等,往往忽略了存储器件的使用寿命。存储器件的擦除次数寿命是行业公认的客观事实,工程师只能尽量的符合器件使用规范,以免过快损耗擦写寿命。
Nand-Flash/eMMC(带有 Flash 控制器的 Nand-Flash)作为一种非线性宏单元模式存储器,为固态大容量存储的实现提供了廉价有效的解决方案。Nand-Flash 存储器具有容量大,改写速度快等优点,适用于大量数据的存储,因而越来越广泛地应用在如嵌入式产品、智能手机、云端存储资料库等业界各领域。
图 1 Nand-Flash 与 eMMC 芯片
存储器件使用寿命
使用了 Nand-Flash 的主板出现丢数据掉程序现象,是一个让无数工程师毛骨悚然的事故。眼看着程序用着用着就消失了,只能干着急也无法下手。有经验的工程师手起刀落换上一颗新物料,熬夜补代码继续撑过半个项目周期。回头无处发泄还要大刀阔斧换厂商、换品牌。与其换几片 Nand-Flash 还能负担得起,但毕竟这是一个无底洞,不如去深入探明问题原因,不然散尽家财也无法弥补亏空。
器件数据手册中通常描述 Nand-Flash 的块擦写寿命达 10 万次,EMMC 的块擦写最高也会有 1 万次;同理,EEPROM、SD 卡、CF 卡、U 盘、Flash 硬盘等存储介质在都存在写寿命的问题。在文件系统向写数据的底层存储器块写数据时,常规会先将块里的数据读出来,擦除块干净后,将需要写入的数据和之前读出来的块数据一起在回写到存储器里面去,如果文件系统写平衡没有处理好,特别是要求 1 分钟以内要记录一次数据这样频繁的擦写块操作,就有可能将 Nand-Flash 或 EMMC 的块写坏。
存储器件掉电丢数据
文件系统向存储器写数据时,常规是先将块里的数据读出来,擦除块干净后,将需要写入的数据和之前读出来的块数据一起在回写到存储器里面去。如果设备在擦除块过程中或者在回写数据过程中意外发生断电甚至电压不稳定,均会造出数据丢失或者损坏。如果丢失的数据是文件系统的 FAT 表,则会造成文件系统崩溃。这就是引起系统程序无法启动灾难性后果的原因。
系统数据保护方案
很多时候,产品在未出厂前烧录程序、反复测试,无论怎样折腾也不会出现丢程序的情况。这可能的因素是测试设备保证了稳定的运行中电源输出,因此系统运行中正常的 Flash 保护机制是可靠执行的。
相对于用户实际使用而言,想避免 Flash 损坏的情况。需要严格遵守产品说明使用,尤其注意避免在 Flash 擦除或写入过程中人为地突然掉电。这是存储器件用法的一个大忌,即使完好的器件,如此不规范的使用也会大大缩短其寿命。而且不同环境下的电源系统五花八门,在电源不满足功率要求情况下程序对于电源低电量的检测阈值较低,此时强制启动系统或执行写操作更会加剧系统耗电波动,巨大的纹波也会引起 CPU 对存储的误操作。
解决此问题对于软件方面而言:
调试系统或现场使用时,建议使用软件复位,避免人为频繁的通过断电实现复位操作;有断电必要时,将打印信息添加如“系统加载完成”、“数据保存完毕”等指示说明后操作;
软件采取 Flash 均衡保存算法,高效地调整更改数据时擦除的 Flash 区域大小;
可将数据先写入内存或者铁电存储器,然后定期的再将数据搬移到大的存储器里面,减少直接断 Nand-Flash、EMMC 擦写次数;
在程序中加入或者提高电源电量检测的阈值,程序上保证所有电源系统下的芯片在此阈值上均可以正常工作;
读写过程中仔细对坏块表进行维护更新,避免程序写入坏块。读取数据时对 ECC 校验,确保读取数据无误。
从硬件角度考虑需要注意:
用法上避免在 Flash 擦除或写入过程中人为突然掉电;
设计好处理控制核心的电源系统,防止 CPU 等在启动、运行中,电源系统因瞬时变化引起的纹波等情况;
配掉电检测电路,在检测到外部电源掉电的同时,及时迅速关闭文件系统,停止向文件系统内写数据的操作;
添加文件系统电源域 UPS 电源,乃至整机掉电续航工作电源;
对于使用 EEPROM 等小容量存储的用户而言,可以考虑使用高可靠性的铁电材料加工制成的铁电非易失性存储器 FRAM 来替换。FRAM 可以像 RAM 一样快速读写。数据在掉电后可以保存 10 年,且其读写寿命高达 100 亿次,比 EEPROM 和其他非易失性记忆体系统可靠性更高,结构更简单,功耗低等优点。
图 2 铁电材料非易失性存储器
下面简介一款基于法拉电容的 UPS 电路设计思路,要点如下:
由于电容存在个体差异,电容存储电荷的速率不一样,存在过充造成电压超过耐压值的问题,电路中存在多颗法拉电容时需要做均压处理;
为保证电容能够充满电能,源端需采用恒流源充电;
为维持电容电压稳定,并降低充电电路功耗,需增加过压检测电路;
若对电压高于法拉电容本身电压上限的电源系统提供掉电续航时,Vcc_backup 端需通过 BOOST 升压电路后以实现,且注意系统正常时(充电过程中)关断 EN 脚。
图 3 基于法拉电容的 UPS 核心电路
系统电源正常时,充电电路即给 UPS 充电。系统电源掉电时,UPS 放电给系统提供备用电能,建议 UPS 在掉电后能持续给文件系统供电能力不低于 10 秒,在 10 秒续航期间内,系统可以将电源异常状态上报、及时保持临时重要数据、关闭文件系统,保证系统稳定性,避免文件系统在掉电情况下出现损害,影响应用程序的正常启动。
图 4 建议 UPS 充放电时序
此外系统掉电情况需要掉电检测电路实现。使用一颗比较器器件即可,注意使用 Output_VCC 端供电,以确保外部掉电时,比较器仍然可以工作。比较器负端连接一个参考电压,参考电压由稳压二极管提供。正常供电时,比较器输出电压由升压电路的反馈端分压决定;掉电时,比较器输出低电平,此时处理器仍未掉电,收到状态信息可及时响应处理。另一路掉电检测可供其它功能使用。
图 5 系统掉电检测电路
工业品质稳定可靠在 ARM 内核核心板、开发板、工控机等领域,M6708 核心板、M/A335x 核心板、M/A28x 核心板、EPC 系列工控主板、IoT 系列无线主板/网关、DCP 系列经典工控机等产品中,核心板产品针对 Nand-Flash 有着完善的坏块管理、工控主板添加掉电保护等措施。例如在 Linux 系统下加固 Flash 驱动、对操作系统进行双备份;软件与硬件信号测试对 Flash 进行 10 万次掉电试验等。
图 6 DCP-1000L 产品剖析图示