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