来源:无忧电子基地 作者:程全洲 张丽 冯翔
1、引言
随着嵌入式系统应用领域的不断扩大,系统复杂性也在不断提高。闪存作为广泛使用的嵌入式存储设备,其管理技术和访问方式经历了一个由开发员直接控制到由操作系统的I/O软件间接控制的过程。然而目前现有的这些闪存管理方案都不能提供一种方便、统一且移植性好的I/O软件接口,增加了嵌入式产品的研发周期。因此,本文旨在针对一般的嵌入式应用,设计并实现一种更合理的闪存I/O软件。该软件遵循策略与机制分离的原则,采用分层的体系结构,能够更好得适应底层硬件的变化,可大大提高代码的可移植性。
2、闪存设备管理技术的现状及存在的问题
闪存设备不同于一般的非易失性存储设备,它有很多特殊的存取特性,其中最主要的在执行写入操作之前必须先擦除目标单元的内容[1]。因此,闪存设备的管理最基本也应该包含对读、写操作以及擦除操作的

我们设计的闪存I/O软件自下而上被划分为四个层次,分别为硬件驱动层、原始设备层、设备层以及设备节点。其中硬件驱动层代码主要负责在系统启动时驱动闪存硬件。从抽象层次上看,它是通过使用底层的硬件机制,建立了若干基本的使用闪存硬件的策略代码。具体过程由芯片探测模块和操作方法模块来实现的。其中芯片探测模块主要负责探测CFI接口闪存芯片的器件数信息[5],包括芯片大小、芯片编程电压、编程时间、擦除时间、擦除区域分布情况等,并利用这些信息创建出描述芯片物理特性的数据结构。而操作方法模块则负责实现最基本的闪存读、写及擦除例程。该模块在芯片探测模块的基础上,利用硬件的物理信息就能够实现特定闪存芯片的管理和访问方法。
接下来原始设备层代码就把闪存存储区从软件上划分为几个不同的区域,并用设备的概念对各分区进行软件上的封装,使每个分区设备都拥有包含自身信息的数据结构及设备操作例程。这样设计的原因,一方面是为了模拟硬盘的物理分区,方便系统对闪存的管理和使用;另一方面又为上层软件以字符方式和块方式访问闪存提供了基础。具体过程需要通过原始设备实现模块、设备分区实现模块来实现,而闪存配置管理模块则为开发人员根据自身需要任意划分闪存分区提供了配置接口,提高了系统的灵活性。需要说明的是这三个模块的实现具有一定的依赖关系,其中箭头的起始端模块要依赖于该箭头指向的模块。
接着闪存设备层代码在低层软件分区的基础上,用字符设备和块设备两种方式来使用闪存原始设备。具体说,该层主要实现字符设备与块设备的通用接口例程,即文件操作的通用方法,如打开、关闭、定位、读、写等。
最后,闪存设备节点层是为了方便应用程序以文件形式访问闪存设备而创建的设备节点。它的实现并不
(1)闪存I/O软件可移植性的验证
从理论上讲,只有硬件设备驱动层的一部分代码是与设备相关的,而原始设备层和设备层代码都是设备无关的。于是,我们得出如下(表1)的统计结果。在新的I/O软件实现方案下,闪存设备相关代码为35KB,占总代码量的24.1%;设备无关代码为110KB,占总代码量的75.9%。由此可见,我们的实现方案具有很好的移植性,能够有效地提高嵌入式产品的开发速度和质量。

(2)闪存I/O软件有效性的验证
I/O软件的一个重要性能指标是设备的数据吞吐率。当应用程序访问闪存设备文件时,由于每次读/写请求的数据度不同,使得设备的瞬时吞吐率也不同。由于我们的I/O系统实现了闪存设备的两种管理方式:字符设备和块设备,因此下面我们首先针对字符设备方式测试它的读/写吞吐率(见图2 和图3)。


通过分析图2、图3的数据我们发现,当系统从闪存设备中读取或写入小块数据时,吞吐率会随着请求数据长度的增加而增大;但是当请求数据长度超过某一临界值时,读/写吞吐率近似都稳定在一个固定值上。
为了进一步验证上述规律,我们又按照33%的写请求和67%的读请求比例,对各种请求数据长度进行了10次读/写混合操作测试,其结果如图4所示。由此可看出,在请求数据长度大于512KB之后,读写混合的数据吞吐率稳定在3.59MB/S上,这一结果与图2和图3所示结果完全一致。并且该吞吐率变化规律符合常见嵌入式应用中闪存的读、写特性,其指标也基本上能够达到应用需求。

对于块设备方式,我们主要测试基于闪存文件系统的一些典型文件操作性能。其结果如表2所示。该表的第一列代表了执行的文件操作,其中create和wirte代表创建文件并向该文件写入X个字节数据的操作;open和read则代表打开文件并从该文件读出X个字节数据的操作。X的大小按照表中第一行数值的变化而变化。测试数据表明闪存I/O软件块设备功能是正确和有效的。

6、结束语
本文在分析了嵌入式系统现有的各种闪存管理技术缺点的基础上,设计并实现了一种分层合理、模块划分清晰且移植性好的闪存I/O软件。系统的测试数据表明,该I/O软件能够实现对闪存设备的基本管理和访问,可以满足一般嵌入式系统对数据存储器的应用需要。另一方面,由于硬件平台的资源所限,我们只实现了对NOR型闪存的管理;随着性能更优的NAND型闪存的广泛使用,我们下一步的工作就是要将上述软件代码移植到NAND型闪存器件上,进一步检验该软件的性能。