嵌入式系统的海量存储器多采用Flash存储器实现扩展,由于Flash存储器具有有限写入次数的寿命限制,因此对于Flash存储器局部的频繁操作会缩短Flash存储器的使用寿命。如何设计出一个合理的、针对嵌入式应用的文件系统,实现Flash存储器的损耗均衡,并且实现数据的有效管理,对于提高其使用寿命具有一定的意义。
1 硬件平台设计
本嵌入式文件系统选用Atmel公司的AVR单片机ATmega 128和Flash存储器AT45D13081。该Flash芯片具有8 Mb存储空间,共分为4096数据页,每页可存储264字节。通过串行外围设备接口SPI实现ATmega 128和AT45DB081之间的数据通信。文件系统的硬件结构如图1所示。其中,RTL8019AS是一种全双工即插即用的以太网控制器。
2 嵌入式文件系统总体设计
文件系统的管理是通过把它所管理的信息组织成文件形式来实现的。文件是具有名称的相关信息元素的序列。从用户角度看,文件系统主要实现了按名存储;从系统管理的角度看,它主要实现了文件存储器的空间组织及分配、文件信息的存储以及文件的保护及检索。文件系统要借助于组织良好的数据结构和算法来有效地对文件信息进行管理,使用户更方便地存储信息。文件系统对于底层硬件的特性一般并不关心,只提供简单且标准的接口。
2.1 文件系统存储结构
根据Flash芯片的特性,为了最快捷地实现文件数据的读取,本文件系统采用单级目录结构,利用链接页的方法管理Flash的存储空间。文件系统存储结构图如图2所示。在Flash存储器中,文件系统分为3部分:文件系统信息表(FAT)、文件控制块(File Control Block,FCB)和数据区(Data Area,DA)。
文件系统信息表(FAT)用于存放文件系统的信息和属性。数据结构包含FAT的有效性标志、文件总数、第一个文件控制块的扇区号及其在存储器中的地址,以及当前FAT在存储器中的地址。
文件控制块(FCB)是存放在Flash中的,表示文件的静态信息。数据结构包含文件名(11字节之内)、文件首簇所在的扇区号、文件长度、文件属性、文件创建时间、下一个FCB的Flash地址以及文件控制块有效标志。文件控制块之间采用链表形式链接。
文件句柄(File_Handle)是存放在内存中的,表示文件的动态信息。当用户打开或创建文件时,会在内存中申请一个文件句柄。数据结构包含文件句柄标示号、文件句柄状态、文件名、文件首簇号、首簇所在的扇区号、当前簇号、文件指针、文件长度以及文件的FCB地址。
操作系统中将相邻的扇区组合在一起,形成一个簇,然后再对簇进行管理。显然,簇是操作系统所使用的逻辑概念,而非磁盘的物理特性。为了更好地管理磁盘空间和更高效地从硬盘读取数据,操作系统规定一个簇中只能放置一个文件的内容,因此文件所占用的空间,只能是簇的整数倍。本文设计的文件系统规定一个簇的大小为存储器的一个页。
2.2 文件系统体系结构
如图3所示,文件系统对外接口函数为应用层提供统一的抽象接口和数据结构,应用程序通过文件系统对外接口函数来实现文件操作和设备管理功能,隐藏了文件系统底层驱动和设备驱动的实现细节。位于下层的设备驱动,提供了文件数据在设备上的存取操作接口。
3 嵌入式文件系统实现及设备驱动
文件系统设计的目的在于实现对数据的有效管理以及对存储器空间的平均使用,文件系统的设计包括文件系统对外接口函数和底层驱动程序的设计。
3.1 文件系统对外接口函数
调用文件系统的对外接口函数是应用程序使用文件系统的唯一途径,其接口的规范性、易用性、功能性关系到文件系统的开放型和用户对文件系统的接受程度。文件系统提供的对外接口函数如表1所列。应用程序通过调用这些接口函数即可实现对文件的管理和操作。
3.2 文件系统底层驱动程序
文件底层驱动为文件系统的对外接口函数服务,包括文件系统信息表的读写、文件控制块的读写、文件句柄的读写以及各类簇的相关操作等。文件系统的底层驱动函数如表2所列。
上述文件系统底层驱动函数中,净簇的申请函数(unsigned long app_clus(void))直接影响到对存储器存储区域的使用分配。该函数的流程体现了对存储器存储区域的使用次数的平均分配。
函数功能描述:申请一个净簇。
入口参数:无。
出口参数:<0x100000,申请到净簇的页地址;NO_CLEAN_SECTOR,没有干净的存储空间。
该函数的流程如图4所示,程序从存储区的第一页开始到最后一页申请一个净簇,若成功,返回簇地址;若失败,则进行脏簇的清理,然后从清理过的存储区中再申请一个净簇,成功则返回簇地址,失败则进行错误处理,程序结束。
3.3 Flash设备驱动
对文件系统的操作归根结底是对存储器的读写操作。文件操作时设备驱动程序为文件系统提供对存储器的控制,一般包括读、写和复位操作。本文基于Flash芯片AT45DB081存储器,为文件系统提供表3所列的驱动函数。
完成以上的软硬件设计,基于PC机编写一个客户端测试软件,通过自定的协议对文件进行操作,下载一个文件到文件系统,之后读取比较,从而验证文件系统的正确性。
结语
本文的方案主要针对存储器的耗损均衡控制进行了重点设计,延长了Flash存储器的使用寿命。对于文件的校错、纠错等其他功能并未详细设计,采用单级目录,不支持多级目录。整个方案已在由单片机ATmega128及Flash AT45DB081组成的系统上具体实现及验证,取得很好的效果。本文件系统在基于Flash存储器的日志型数据采集记录应用中具有较高的应用价值。