作者:Ken Whitaker
内存子系统不需要显著的学习曲线。对于新手工程师来说,当今嵌入式系统和随附的内存子系统的复杂性有时会产生学习曲线。内存包括作为临时(易失性)或持久(非易失性)存储“容器”运行的硬件组件。这些带电电路的神奇块存储信息状态,用于指令(二进制代码)并将数据组织为可寻址字节(8位),双字节(16位)和四字节(32位)。
结合控制内存子系统等资源的嵌入式操作系统(OS),软件指示处理器(CPU)沿着地址线发送突发电力,该地址线标识转换在存储数据的芯片中的位置。该脉冲可以打开或关闭连接到数据线的晶体管。当电脉冲到达地址线时,脉冲流过闭合的晶体管,并为存储相当于1(导通)位的电容器充电,相反,未充电的电容器表示0(关断)位。
1. 信息的记忆位数组(部分显示)。
易失性存储器用作随机存取存储器 (RAM)。只有在通电时才能保持其内容物。为了补充RAM的使用,在早期的嵌入式系统中,只读存储器(ROM)通常用于运行操作系统和应用程序。可以以字节(8 位)信息单位访问任一内存源。
非易失性存储器可保留数据。对于传统 PC、Mac 和服务器,持久内存存储已用于存储更大的可寻址字节容器— 通常基于底层分组(称为扇区)进行组织。物理尺寸和低功耗要求通常不是固定磁盘或固态设备 (SSD) 等存储系统的优先事项。对于尺寸和低功耗至关重要的小型嵌入式系统,情况并非如此。此持久性存储介质是可移动的(SD 或 CF 卡,或 USB闪存驱动器),并且无论是否存在电源,都应保留其内容。512 和 4192 KB 的块是这些小型设备的常用大小。鉴于许多嵌入式系统外形小巧,设备内存要求和物理空间限制通常决定了可以使用的内存类型。
易失性存储器基础知识
易失性存储器可用于读取CPU执行的指令,从而导致执行某些操作,有时将数据写回内存。当今功能强大的嵌入式 CPU 可以处理和访问 32 位(甚至 64 位)值的信息。8位计算的日子早已一去不复返了。
RAM由一个或多个芯片组成,可以与CPU和I / O端口一起驻留在相同的封装基板中,称为片上系统(SoC),这在可用电路板空间有限的小型设备(如无人机,家用传感器等)中很常见。
非易失性存储器基础知识
闪存最初被称为闪存RAM,正在成为首选的永久存储介质,取代了旋转磁盘。增冈不二雄博士于1984年在东芝工作时发明了闪存。他的同事有泉正治先生想出了闪光灯这个名字,因为从细胞中擦除数据的过程让他想起了相机闪光灯。
闪存是一种非易失性存储器,经过电编程,可长期存储。最初的电可擦除可编程只读存储器(EEPROM)器件由列和行的网格组成,每个交叉点都有晶体管。一层薄薄的氧化物将每个晶体管与其他晶体管分开。如果一个晶体管(浮动栅极)与另一个晶体管(控制栅极)连接,则电池的值为1。如果此链接断开,则该值变为 0。为了将电池组的值更改为0,将发生一个称为福勒 - 诺德海姆隧道的过程,该过程会改变电池的电荷水平。当电源断开时,电池应保留其最后设置(编程或擦除)。
认为闪存仅用于消费者移动设备(如相机和智能手机)的看法是不正确的。在外形尺寸受限且需要永久数据存储的任何系统中,闪存经常使用。闪存要么是驻留的(焊接到电路板上),要么是非驻留的(通过行业标准端口(如SD和USB)的可移动设备)。闪存的美妙之处在于,没有可能对可靠性产生负面影响的活动部件,但与任何技术一样,也有优点和缺点,如表所示。
闪存的好坏。
市面上有两种基本类型的闪存 — NOR 和 NAND。NOR最初设计用于取代只读存储器、三重定位器和易失性存储器。它有一套完整的地址行,允许读取单个字节。事实上,读取通常与DRAM一样快,允许程序直接从NOR存储器运行XIP(原位读取)。但是,擦除非常慢,只要不经常执行擦除操作,就不会出现问题。NOR 最初用于可移动的紧凑型闪存(CF) 卡,是存储操作系统映像、系统引导加载程序和系统配置信息的不错选择。
与NOR相比,NAND的开发旨在实现更高的容量,更小的占地面积和更低的成本。但是,它仅限于串行接口。因此,单个字节不能直接访问;读取、写入和擦除必须以块(或块)为单位执行。该技术不适合替代ROM,但非常适合作为硬盘驱动器的替代品。NAND已成为可移动和常驻介质的标准闪存技术,因此,它适用于需要低成本、高密度和快速擦除的应用。
请注意块和页面之间的区别。每个块由许多页面组成,其中页面大小通常为小块(512 字节)或大块(2048、4096 字节等)。块大小很重要,因为如果记录大小是闪存介质上使用的基础块大小的偶数部分,则通常会获得最佳结果。对于所有NAND,数据以页面形式写入,但页面必须已被删除(到所有1),并且只能擦除块。
2. 页面和块。
如果我们没有提到记忆单元是如何组织以存储信息位的,那么关于NAND的讨论将是不完整的。单级单元 (SLC) 为每个单元存储一位信息。随着存储容量的增加,多级单元(MLC)和三级单元(TLC)已被开发出来,以为每个单元存储多个位。但这种增加的容量有一些缺点。MLC的写入性能通常约为SLC的三分之一到一半。其复杂性的增加也会产生更多的位错误,需要更复杂的纠错码(EC)来防止常见的数据错误情况。与SLC和MLC相比,TLC具有更慢的传输速度,更高的错误率,需要更大的ECC,并且耐用性更低。当块写入最少的次数时,耐久性更好。
典型的NAND需要一个控制器来处理主机和闪存之间的命令和数据移动。控制器提供了执行基本操作(如块读取、写入和擦除)的机制。许多设计都包含一个分立式控制器,该控制器仅提供这些功能,并将其他闪存管理活动(例如更换损坏的模块并确保均匀磨损)留给驱动软件。一些芯片设计人员发现,通过将带有NAND闪存的内置控制器包含在称为托管NAND的同一物理封装中,可以提高效率。这些复杂的控制器以昂贵的芯片成本卸载了一些计算密集型软件管理。
3. 纳米闪存与托管纳米
这有效地使器件能够像典型的块器件一样工作,为主机文件系统提供更简单的接口。由于托管 NAND 的价格可与 NAND 本身的价格相媲美,因此嵌入式主板将常驻管理 NAND 作为嵌入式多媒体存储卡(eMMC) 而不是闪存和控制器也就不足为奇了。
虽然它代表了驯服NAND特性的巨大飞跃,但eMMC并不是一项完美的技术。在对 eMMC 4.3 部件进行了一系列性能基准测试后,Datalight 的工程团队观察到某些部件的性能不佳,尤其是在随机读取时。对于一个特定的 eMMC 部件,对大于 16 MB 的文件执行的随机 I/O 会减慢到 200 字节/秒的传输速率,远低于顺序 I/O 常见的数兆字节速率。
最终,适合您的系统设计的最佳闪存归结为对其用例最重要的是什么。没有一个闪存部件能够以最低的价格提供高质量、大存储容量、非凡的耐用性和“杀手级”性能。总会有一些权衡,应该为特定应用选择正确的内存部分。
界面
驻留闪存在闪存、数据和地址总线之间具有直接接口。为了避免系统设计人员和闪存供应商之间的混乱,通用闪存接口(CFI)定义了大多数供应商支持并得到联合电子设备工程委员会(JEDEC)非易失性存储器小组委员会认可的开放接口标准。因此,可移动闪存符合物理、电气和命令接口标准。这有效地允许各种不同的内存供应商选择类似的部件。
这些标准已经迁移到小型嵌入式系统。例如,第一个 EIDE/ATA 连接是串行 AT 附件 (SATA) 接口标准的替代品,该标准的最大吞吐量为 133 MB/s。另一个流行的接口是小型计算机系统接口 (SCSI),由于使用 16 条并行线,速度高达 40 MB/s,因此在更短的时间内移动的数据比 EIDE 多。为了获得更快的结果,Ultra-640 SCSI 可以以 640 MB/s 的速度传输数据。
令人惊讶的是,对于小型嵌入式电路板数据表,您可能必须四处寻找持久性存储是否驻留在电路板上。例如,树莓派3具有可用于可移动介质的微型SD和USB端口。
软件数据存储堆栈
对于非易失性、持久性闪存,需要系统软件来驱动其运行。该系统软件提供了软件服务的逻辑分离,使应用程序能够将文件系统请求作为结构化数据元素发出,这些请求又被转换为块请求,让人联想到传统的基于块的硬盘驱动器中存在的请求。
4. 软件数据存储堆栈。
Datalight的Reliance Nitro嵌入式文件系统实际上是一组相关的软件模块,每个模块都有明确定义的软件接口(称为应用程序编程接口或API),可以保护来自应用程序的请求并确保可靠性,即使断电也是如此。Reliance Nitro的可配置事务模型在数据实际写入闪存时提供了微调的灵活性。
信实硝基是一种电源故障安全文件系统,可以插入到各种工业嵌入式实时操作系统中,如VxWorks,Linux,安卓和Windows嵌入式。对于物联网设备,可以使用占用小内存的物联网文件系统,即信实边缘,该系统可与FreeRTOS和MQX等小型嵌入式操作系统配合使用。
块设备驱动程序从文件系统接收块请求,并用作闪存转换层 (FTL)。根据嵌入式系统上使用的闪存和接口,FTL 执行最初由文件系统执行的请求。例如,数据照明的闪存FX太拉与NAND或NOR存储器配合使用,并向系统的闪存控制器发出命令。
闪存驱动程序不仅负责为基本闪存操作(读取、写入和擦除)提供支持,还负责优化内存的性能。由于闪存的使用寿命有限,连续重写同一块将导致零件过早磨损。为了防止这种情况,发明了磨损均衡算法,将磨损均匀地分布在闪光灯上。事实上,设计不佳的文件系统和块驱动程序软件基本上会破坏良好的闪存。例如,标准 FAT 文件系统在介质的开头不断写入和重写文件分配表 (FAT)。如果块没有不断重新定位,对这些块的访问可能会很快磨损闪存。
由于单个块会随着时间的推移而磨损,因此坏块管理(BBM)软件是块驱动程序的另一个重要部分。BBM 验证写入数据,当检测到写入失败时,坏块将重新映射到专门为坏块分配保留的备用块。
您可能会认为,使用托管NAND设备,您不需要闪存块驱动程序。数据照明的闪存与受管的 NAND 设备配合使用。由于随机磁盘 I/O 非常重要,特别是对于 Android 嵌入式系统,FlashFXe 将随机 I/O 请求线性化,其方式是将实际的随机读取和写入调度为顺序 I/O 块。因此,随机 I/O 性能会显著提高。通过减少正在执行的写入次数,可以在某些用例中提高闪存耐久性。
数据生命周期
总而言之,重要信息根据系统的状态驻留在内存中。首先是启动时启动。从非易失性闪存中,由整个系统(RTOS、驱动程序、应用程序等)的静态副本组成的启动映像被加载到 RAM 中。易失性存储器被刷新,闪存中的非易失性数据再次可用。
接下来是正常操作。系统运行后,必须执行日常任务。对于基于传感器的 IoT 设备,这些应用使用本地闪存执行工作并依赖于文件系统中的持久数据存储(和检索)。这通常包括打开文件、读取和写入数据以及选择性地执行文件夹和其他文件系统操作。
但是存储在设备上的数据很可能最终会到达企业的其他地方 - 私人或公共。趋势是更多的数据收集、处理和分析要执行,并在本地保存在嵌入式设备上。平台正在不断发展,为这些连接的设备提供安全、设备管理、数据分析、软件更新和连接服务。
最后一步是关闭和系统恢复:当系统需要关闭电源时,有序关闭很重要。如果应用了电源来完成对闪存的所有剩余 I/O 请求,则应有序地关闭文件系统,并将数据信息正确保存到介质中。
对软件数据系统堆栈鲁棒性的真正考验是在发生意外断电时重建文件结构所需的时间,这使得有序关机变得不可能。基于日志的文件系统(如 ext4)可能需要一些时间来重放日志以重建文件系统。