新闻中心

EEPW首页 > 消费电子 > 设计应用 > 适宜于嵌入式多媒体应用的Flash文件系统

适宜于嵌入式多媒体应用的Flash文件系统

——
作者:清华大学电子工程系 董明 刘加 刘润生时间:2006-10-25来源:中电网收藏
随着电子技术的不断发展,越来越多地在控制类、消费类、通讯类等电子产品中广泛应用,并且随着数字信号处理与人机交互界面等相关技术的不断成熟,嵌入式多媒体应用数量也逐渐上升。多媒体业务的数据量大,数据内容复杂,在多媒体应用中数据的存储与管理是不容回避的问题。存储器因制造成本低廉、存储容量大、数据非易失、无机械故障,在目前的中被广泛用作外存储器件。然而Flash存储器却是一种数据正确性非理想的器件,应用中可能会出现坏损数据单元,这又给应用Flash存储器的进行数据存储管理增添了新的难度[1]。

在嵌入式系统中应用Flash存储器最好的办法是在其上构造一个文件系统,对Flash存储器中的数据内容进行基于文件代号的存储管理,同时对于Flash存储器本身的坏损单元自动进行应用透明的坏损管理。目前在通用计算机上已经有很多成熟的文件系统,如DOS下的FAT文件系统、Windows NT下的NTFS文件系统及UNIX文件系统等[2]。

但是这些文件系统并不适合直接用到嵌入式系统中进行多媒体数据内容的存储:第一,嵌入式系统的应用条件远比计算机恶劣,电源电压的不稳定以及突发性断电将对Flash的存储造成灾难性的影响,通用文件系统对于可靠性的设计考虑不足;第二,通用文件系统是针对系统资源非常丰富的计算机平台并基于速度较慢的磁盘驱动器,它们常常大量使用缓存技术,如注重文件系统的速度特性,要耗费比较多的系统资源。这与嵌入式系统中系统资源十分有限,Flash存储器又相对于磁盘驱动器较快的应用情况不同;第三,嵌入式系统中存储于Flash上的内容很多是多媒体数据资料,这些数据内容往往允许一定程度的误码损伤,未必需要如通用文件系统那样严格保证存储的正确性。通过灵活的校验机制与坏损管理,达到更优化的存储速度与更高效的存储空间利用,这对成本敏感的嵌入式系统来说尤其具有帮助。

基于上述考虑,设计了一个适合嵌入式多媒体应用的Flash文件系统。它不仅支持文件代号管理、文件指针存取以及对应用透明的自动坏损管理这些通用文件系统所具有的功能,并且在文件系统的可靠性以及文件系统的额外资源消耗方面进行了改善;此外还引入了基于存储内容自适应的坏损管理策略,从而使该Flash文件系统更加适合嵌入式多媒体应用。 

1 Flash存储器的操作特点

Flash存储器在读取方面与普通的SRAM存储器类似,一般可以实现完全随机的读取。Flash存储器最大的不同在于写操作方面。Flash存储器的写操作需要经过"擦除-写入"两个操作过程。当希望对Flash存储器的某一个单元进行写入时,首先必须对这个存储单元所在的区块(Block)执行擦除操作,擦除操作成功完成后,整个区块的数据内容都被清空(一般被设置成0xFF);然后对目的单元所在的页面(Page)执行写入操作,需要一次写入整个页面的全部数据内容(也有一些Flash存储器支持部分页的写入,这样可以分多次写完一个页面,但是一旦写过的存储单元数据就不能再被更改),操作成功后要进行数据正确性的校验。

一个区块(Block)包含一个或多个页面(Page),一个页面包含多个数据存储单元(字节或字)。为了增强所设计Flash文件系统在不同Flash存储器上的移植能力,选取了3个最基本的操作作为本Flash文件系统与Flash存储器设备的应用接口:区块擦除(Block_Erase)、页面写入(Page_Write)、页面读出 ( Page _ Read )。这样虽然可能会忽略某些Flash存储器产品的独有特性,但却增加了所设计的Flash文件系统对不同Flash存储器产品的适应能力。另外,Flash存储器写入的时间瓶颈并不在于数据传递,而是Flash存储器内部的擦除和写操作等待;Flash存储器读出的速度和微处理器处理数据的速度都很快,因此虽然将读和写的基本单位扩大到了页面,但额外增加的操作时间是很短的。 

2 Flash文件系统的基本结构

本Flash文件系统在基本结构上与MS-DOS的FAT文件系统类似[3]。MS-DOS是一个应用了几十年的商业化软件产品,其FAT文件系统技术成熟、结构简单、系统资源开销小,易于在嵌入式系统的硬件平台上实现。本文件系统的基本结构如图1所示,整个文件系统包括如下几个部分: 

(1)系统记录(SR, System Record) 存放媒质信息和最重要的文件系统信息。媒质信息诸如Flash存储器的类型、容量,划分成多少个区块,每区块包含多少个页面等。文件系统信息包括版本信息、保留区块的数目和位置、文件分配表和文件登记表所在的位置和大小、数据区域的位置和大小等。

(2)文件分配表(FAT, File Allocation Table) 存放着Flash存储器上所有区块的占用与空闲情况以及每个文件的存储链接结构。MS-DOS FAT文件系统中有12位、16位、32位三种不同的FAT格式。考虑到在微处理器上实现的方便性并权衡Flash文件系统应用的规模,选择将文件分配表固定为16位的格式。

(3)文件登记表(FRT, File Register Table) 存放着Flash文件系统中每一个文件的文件代号、文件长度、文件属性以及该文件的存储链在文件分配表中的入口。考虑到嵌入式系统的应用范围,本Flash文件系统不支持子目录结构。

(4)数据区域(Data Area)用于存放文件的数据内容。本Flash文件系统中,数据分配的最小单位是Flash存储器的一个基本擦除单位,即一个物理区块(Block)。本Flash文件系统提供:文件系统的格式化(Format)、文件的创建(Create)、删除(Delete)、打开(Open)、关闭(Close)、读(Read)、写(Write)、文件指针的移动(Seek)、位置读取(Tell)等基本的功能。程序主体代码以ANSI C语言写成,使用一个非常小的Flash存储器设备驱动接口,扩展及移植的能力都比较好。

flash系统文件基本结构


3 提高Flash文件系统的可靠性

在MS-DOS的FAT文件系统中,仅仅对数据区域提供坏损管理,而对于它的主引导记录、文件分配表和根目录这三个极重要的文件系统数据结构却未做任何保护(虽然MS-DOS的FAT文件系统中存在着两张FAT表,但是DOS只是简单地复写第二张FAT表而从不使用它。一旦这三个区域的内容出现一点失效,将必然导致文件数据的大量损失。另外,如果这些数据结构的存储区域发生物理性损坏,更会导致整张磁盘的报废。这在由Flash存储器占据很大成本比重的嵌入式应用中,是非常不希望的。

归结起来,嵌入式系统中的Flash存储器主要面临两大类不稳定因素:一是Flash存储器本身可能出现物理性的损坏;二是嵌入式系统面对较多的突发掉电与重启动,造成Flash存储器写操作的异常终止。

针对Flash存储器的物理损坏问题,除对文件数据区域提供坏损管理外,还将系统记录、文件分配表和文件登记表这三个文件系统重要数据结构采用浮动位置的方法存储。即不仅对文件数据存储进行动态的分配管理,对于Flash文件系统中的这三个重要数据结构也不固定其存储位置。这样可以避免因它们的存储区域发生物理损坏造成整个文件系统失效。具体做法是:对于系统记录定义一个系统记录保留区,将系统记录存在这个区域内,确切的位置在文件系统初始化的时候通过标识幻数(Magic Number)的方法扫描找到;而文件分配表和文件登记表则存放在文件数据区域内,通过系统记录中的索引项找到。

针对Flash存储器的写操作异常终止问题,将系统记录、文件分配表和文件登记表这三个对Flash文件系统最重要的数据结构均进行双份的存储以改善其安全性。在文件系统的操作中,程序对每一个表结构的两个备份进行顺次修改,以此确保Flash存储器上总是存有一整套完好的系统记录表、文件分配表和文件登记表。在系统被启动运行时,文件系统会首先进行自检,通过这三个表结构中的标识幻数,以及最开头和最末尾的更新序列号可以确定每一张表备份的合法性和时效性,判断出前次系统关闭中存在着的操作异常终止并及时更正。通过这样的设计,即使文件系统在使用中出现了写操作异常终止的情况,错误将只涉及当时被操作的文件数据,不会扩散给文件系统中的其它文件,更不会因此损坏三个文件系统表结构,造成整个文件系统的彻底瘫痪。

通过以上两个方面的改进,本Flash文件系统的可靠性相比于MS-DOS FAT文件系统有了很大的提高。从实验1和实验2的仿真结果可以看到,即使在Flash极不可靠和写操作异常终止频发的最恶劣工作条件下,本Flash文件系统也能够保持可靠工作,从而使之能够适合于嵌入式系统的应用。 


4 降低Flash文件系统的资源消耗

嵌入式系统相对于通用计算机系统来讲,往往有苛刻得多的成本要求,需要嵌入式系统尽可能低的系统资源配置。尤其对于Flash文件系统这种用于增强系统功能的服务性质模块,就更需要降低对系统资源的消耗,才能够扩大其使用的范围。

就Flash文件系统的资源消耗来讲,主要包括程序代码开销、处理器占用时间、运行时内存开销以及额外的Flash存储器消耗。其中,运行时内存开销最限制Flash文件系统的应用,同时设计结构的改善与运行时内存开销直接相关。所以针对资源消耗的结构优化主要着重于降低运行时的内存开销。

Flash存储器的擦除单位是区块(Block),这是本Flash文件系统中数据存储分配的最小单元。如果不采用任何措施的话,运行时内存开销中将至少包括备份一个完整区块数据的缓冲区。但一个Flash存储器的区块可能很大(Sumsung[TM] KM29U128是16KB),这在很多嵌入式系统中都是过大的资源开销(最通用的8位微处理器MCS-51系列,总线寻址的能力只有64KB),必须进行改进。

为此,采用交换缓冲区(Swap Buffer)技术来解决这个困难。当需要准备某一个区块的数据时,并不直接向该区块写入,而是首先擦除用于做交换缓冲区的区块,然后逐步向交换缓冲区填入目的数据内容。因为此时,任何有用数据内容都未被破坏,所以运行内存中的缓冲就可以做得比较小。当交换缓冲区填写完成后,再擦除目的区块,拷贝交换缓冲区内容到目的区块。 

采用交换缓冲区后,对内存中的缓冲区大小没有特别要求,考虑到Flash存储器的操作特性,选取Flash存储器的页面(Page)容量作为内存缓冲区大小。在结构上作了上述改进后,虽然大大降低了Flash文件系统的运行时内存消耗,但代价是将一个数据区块的写入时间延长了一倍。不过一般的Flash存储器中都有一特别制作的区块,该区块保证不会损坏,正好适用做交换缓冲区。这样就可以省去中间交换缓冲过程的数据完整性检验,加快写操作的速度。 表1给出了在与MCS-51兼容的微处理器上本Flash文件系统实例,对Sumsung KM29U128 Flash存储器(16KB/Block



评论


相关推荐

技术专区

关闭