Flash 存储问题总是在我们技术支持渠道位列榜首。Toradex 投入了大量资源保证存储尽可能的稳定。然而,了解一些关于存储的基本知识还是十分重要的。首先你需要知道存储是否磨损,当往内置的存储设备上写入大量数据后,你就很容易损坏它。通过这篇博文,我们想要告诉你 Flash 存储可能会遇到的一些问题。我们先简单介绍技术内容。
目前,Toradex 计算机模块采用 NOR、NAND 和 eMMC Flash。
NOR 和 NAND 是 raw 存储设备。NAND 和 NOR 之间的主要差别是 NOR 允许随机寻址,不需要纠错以及较高的每比特成本。NAND 则只能页读取,每页中的一些位可能出错,因此需要纠错机制。
eMMC Flash 则结合使用 NAND 和一个内置控制器,后者处理大部分使用 NAND flash 时候,本来需要你自己完成的一些列任务。eMMC 也称为 managed NAND。在另一方面,NAND 和 NOR 需要有 OS 和驱动来完成对应的处理。我们稍后会在本博文中讨论这两种不同的挑战。
下面是我们的计算机模块所使用的 Flash 类型概览;
Storage Type |
Toradex Computer Module |
NOR | Colibri PXA270 |
NAND | Colibri PXA310, PXA320, VF50, VF61, iMX7, T20 |
EMMC | Colibri iMX6 and T30, Apalis iMX6 and T30 |
NAND 上面的 bit 密度随着时间在不停增长。最早的 NAND 设备是 Single Level Cell (SLC) flash。这意味着每个闪存单元存储一个bit位信息。借助 Multi Level Cell (MLC),每个闪存单元可以存储两个或者多个bit位,bit 密度也随之提升。MLC 听起来很不错,但是也有缺点:MLC NAND 也带来更高的bit 错误率以及更低的寿命。所有的 eMMC 都使用 MLC NAND。有些 eMMC 设备可以在部分或者全部存储区域上使用 pseudo-SLC (PSLC)。这将会减少存储容量,但是提高设备上使用寿命。
这是 SLC 和 MLC 的简单对比。
SLC | MLC | |
Bits per Cell | 1 | 2 and more (TLC) |
Erase/Program cycles | 100K | 3K to 15K |
Minimal ECC, bits correctable per 512 Bytes, chip dependent |
8 bit | 12 bit |
Cost per Byte | Higher | Lower |
正如上面提到的,关于我们设备上使用的 flash 技术,您需要知道很重要的一点是,您只能有限次地擦写存储设备。往 flash 存储上写入大量的数据,并不是一个好的主意。上面的表格所示,根据所使用的 flash 类型不同,直到数据可能出现损坏或者丢失前,您可以进行 10K 到 100K 次写操作。“擦写周期” 这一个令人烦恼的事情。Flash 存储的一个限制是,在被擦除之前是无法进行写操作的。而且,不能通过位擦差来完成,而是需要更大的单位,称为块。最糟糕的情况是,如果你只想改变一个字节,但是可能需要擦除整个块。一个块最大可以使 512KB。这种比你想象的要大的多的擦/写比现象称为写放大。并且可能还有 flash 文件系统所需的额外写操作。如果你想要评估你嵌入式设备上的存储的寿命,你应该把这个也考虑进来。
下面的内容向你介绍如何提高 NAND 或者 eMMC 的寿命。不要担心,这些工作都已经由 Toradex 完成,你不需采取任何工作。
我们假设你已经了解 flash 只能被有限次地擦写,并且你只是偶尔小批量地更新数据。如果这些数据总是写在同一个 flash 单元,那么你只能在 MLC flash 上写 15K 次。如果永远不使用其他 flash 单元,你的数据将会丢失,一直在写的存储单元磨损后,flash 也就随着报废。智能的 flash 驱动会采用磨损平衡。这个技术确保所有的 flash 单元被平均磨损,而不是总是使用同一个单元。
在 NAND flash 设备有可能发生一个位的数据发生翻转,你的数据因此损坏。磨损或者其他干扰都有可能引起这个现象。因此,数据需要被纠错码(ECC)保护。根据 Flash 控制器和 NAND / eMMC 的不同,部分错误数据可以被检测和纠正。
ECC 使我们能够发现错误的块,我们就可以停止使用这些坏块。根据 ECC 以及纠正的位数,可以设定容错上限,这个范围之内不需要采取进一步行动。一旦达到这个上限,数据被纠正,并转移到正常的块上面。 之前的位置表记为坏块。这些坏块不再被使用,因为它们可能已经损坏。
当你的设备在往 flash 写数据的时候突然掉电,这将会发生什么?在嵌入式设备上,你希望设备仍旧可以正常启动,并且数据不受到损坏。为了达到这个目的,所有相关的软件和硬件都需要有能力应对这种情况。你将会在下面的内容中了解我们是如何做到的。
正如上面提到的,关键是根据存储的类型采用正确配置。我们会分析目前 Toradex BSP 上所使用的技术。
下图展示了在 NAND 设备上行 WinCE 和 Linux 的配置
存储设备:我们的设备只要使用 NAND,那么都用的是 SLC NAND。
硬件驱动:硬件驱动为 NAND 设备和上层系统提供接口。上层系统也负责错误检测和纠正。在 Linux 上我们目前的镜像使用 MTD。WinCE 上我们使用 Microsoft Flash PDD 层。也有例外,如 Colibri T20,我们使用了专门的 PDD 层。
Flash 传输层:该层负责写平衡和坏块管理。在 Linux 中由 UBI 子系统完成;而 WinCE 则由 MDD 层完成。同样在 Colibri T20 上我们使用了专门的层,而不是 Microsoft Flash MDD。
文件系统:文件系统是实际管理分区以及所存文件的部分。用户通过文件 API 来是用文件系统(Linux 中通过 VFS 层)。在Linux 上,目前我们使用 UBI FS。WinCE 使用 Transaction Save exFAT (TexFAT) 。两者都可以应对掉电。基本的文件层通过支持原子操作来应对掉电发生。
下图展示了在 eMMC 设备上行 WinCE 和 Linux 的配置
存储设备:相对于 raw NAND,绝大多数的工作由 eMMC 本身完成。上层软件不需要处理写平衡、纠错和坏块管理。
硬件驱动:这是 MMC 控制器和文件系统之间的接口.
文件系统:和 NAND 设备一样,WinCE 上仍旧使用 TexFAT;我们的 Linux 镜像使用 ext3 文件系统。同样也是能够应对掉电情况。
Toradex 尽自己最大的努力提供可靠和持久的 flash 存储。然而,在开发的过程中,你还是需要始终关注 flash 的使用。
如果您需要更多的信息,或者可以改善我们的配置,欢迎和我们的工程师取得联系。