基于Blackfin处理器实现对硬盘FAT32文件系统的操作
Blackfin处理器是美国 Analog Devices公司推出的专为满足当今嵌入式音频、视频和通信应用的计算要求和功耗约束条件而设计的新型嵌入式处理器。当Blackfin用于音视频的处理时,大数据量媒体数据的存储和管理便成为一个关键问题。在处理大容量数据存储的方案中,使用最为普遍的便是IDE硬盘。而针对文件的管理,由于FAT32文件系统在大容量文件分区管理方面具有很高的性能,而且可以在大多数操作系统中被识别,因此具有很高的兼容性。所以IDE硬盘加上FAT32文件系统可以作为嵌入式系统大容量文件存储管理的理想方案。本文主要阐述此方案基于Blackfin533处理器的硬件和软件实现。硬件部分为基于ADSP-BF533 EZKIT Lite评估板设计的IDE接口扩展板;软件部分包括基于扩展板和VisualDSP++ IDDE开发的IDE接口驱动程序和FAT32文件系统操作函数。
本文引用地址:http://www.amcfsurvey.com/article/86358.htm1 IDE硬盘原理
1.1 IDE硬盘的寻址
硬盘的存储结构如图1所示。
它的基本存储单元叫作扇区(Sector),除此之外。硬盘还有两个重要的组成部分就是磁头(Head)和柱面(Cylinder),它们共同组成硬盘的寻址空间,其地址被称为物理地址。显然,物理地址寻址方式不够直观、现在的大多数硬盘都支持另外一种寻址方式,其地址被称为逻辑地址(LBA),它把扇区顺序编号,不必再考虑C、H、S等参数。LBA和C、H、S的换算关系如下:
=NH×NS×C+NS×H+S-1;
C=(LBA div NS)div NH;
H=(LBA div NS)mod NH;
S=(LBA mod NS)+1
NH表示每个柱面的磁头数,NS表示每个磁道的扇区数,C表示柱面数[1]。
1.2 硬盘的引导原理
硬盘分区的引导原理如图2所示。
硬盘的第一个扇区(0柱面,0磁头,1扇区)被称作主引导扇区——MBR(Master Boot Record)。在MBR中,主要内容就是引导代码和主分区表。主分区表只有四个分区表项,它们可以直接描述分区,也可以通过扩展分区表进行扩展[2]。
这种引导组织形式是与文件系统完全无关的,在每一个分区内,使用者可以根据自己的需要安装任意的文件系统。但使用何种文件系统要在响应的分区表项内作记录。
2 FAT32文件系统概述[2][4]
2.1 FAT文件系统
FAT(File Allocation Table)文件系统是微软在20世纪70年代末到80年代初发布的,由微软的MS-DOS操作系统支持。在发展的过程中,出现了FAT12、FAT16、FAT32三个版本,其中,FAT12文件系统由于具有一些致命的缺点,很早就被FAT16取代了,而FAT16和FAT32目前还在广泛使用。表1是三种文件系统的对比。
FAT文件系统的原理可以简单地描述为把存储空间分块映射到一个表中,从而实现对存储空间的灵活支配。存储空间中的每一个块被称作簇,存储空间的映射表被称作FAT表。三种FAT文件系统的一个明显区别就是FAT表中表示一个簇所用的位数不同,分别是12、16和32。文件的存储是不必连续的,但在FAT表中可用链表的形式把文件联系在一起,如图3所示。
由于FAT文件系统目前在大部分操作系统上都给予了支持,而且实现起来简单,所以是理想的嵌入式系统大容量存储文件管理方案。
2.2 FAT32文件系统
由于FAT16文件系统在大容量分区管理方面的效率急剧下降,而FAT32文件系统却很好地解决了这个问题,所以在大分区管理方面,FAT32是理想的文件系统。
FAT32文件系统在结构上延续了FAT文件系统的基本结构,如图4所示,主要由以下三部分组成:
(1) DBR(Dos Boot Record),包括跳转指令、厂商标志、os版本号,BPB(Bios Parameter Block)、扩展BPB、引导程序和结束符;
(2) FAT表,实际数据存储空间的映射表,FAT1和FAT2完全一致,后者作为前者的备份;
(3) 实际数据存储空间,相比FAT16,从簇2不再有专门的根目录空间,而是把根目录也当作一个特殊的文件来处理,起始簇是2。
2.3 FAT32文件系统对文件的管理
除了根目录的所有文件(子目录也作为一种特殊的文件存在)都对应一组数据作为文件描述,被称为文件目录项。每个目录内的所有文件和子目录的文件目录项都存储在这个目录对应的存储空间内,每一个文件目录项有32个字节,主要包括文件名、文件属性、文件大小、文件存储位置以及一系列的时间描述等。 把文件路径、文件目录项、FAT表联系在一起就可以完全把握一个文件在硬盘的存储情况。图5所示是一个例子,通过下面的步骤定位文件的所有内容:
(1) 通过路径找到文件所在目录的簇(a)。
(2) 在目录对应的空间(c)内比对文件名,找到文件对应的文件目录项(d)。
(3) 通过文件目录项确定文件的起始簇和文件大小。
(4) 根据FAT表内的簇链(b)确定文件的存储空间(e)。
3 IDE硬盘接口设计
3.1 ADSP-BF533 EZKIT Lite评估板简介[5]
Blackfin533是美国Analog Devices公司开发的具有MISC体系的微处理器。这种体系是同时具有RISC指令集和DSP内核的一个集合,所以Blackfin533既可以作为通用嵌入式微处理器进行开发应用,又具有强大的DSP数据处理能力。
ADSP-BF533 EZKIT Lite是Analog Devices公司为方便Blackfin533的开发应用而提供的评估板。它可以与PC机通过USB或者PCI接口的仿真器进行调试,操作使用简单方便。评估板的核心是一片Blackfin533处理器,输入频率是27MHz,可以通过内部PLL控制工作在所需的工作频率上,最高可达750MHz。
ADSP-BF533 EZKIT Lite评估板的片上资源非常丰富。有32M SDRAM(16M×16bit)、2M Flash(512K×16bit×2);通过AD1836音频处理芯片提供了四路音频输入和六路音频输出端口;通过ADV7183视频解码芯片和ADV7171视频编码芯片分别提供了三路视频输入和视频输出端口;此外,评估板还提供了UART、JTAG、按钮电路和LED指示等设备,尤其是提供了一组功能齐全的扩展接口便于其它设备的接入。IDE接口电路就是在这组扩展接口的基础上设计的。
3.2 硬件设计
IDE接口扩展板的设计是基于Blackfin533芯片的EBIU(External Bus Interface Unit)设计的。
EBIU是Blackfin533与外部存储器之间的一个通用外部总线接口,通过对EBIU控制寄存器的设置,既可以连接SDRAM等同步存储器,也可以连接ROM、FIFOs、Flash等异步存储器。EBIU内部结构如图6所示。
按照ATAPI协议[3]在EBIU的基础上设计了IDE接口方案,使Blackfin533可以通过这一接口实现对硬盘的操作,如图7所示。
4 FAT32文件系统软件设计
FAT32文件系统接口程序是在VisualDSP++ 3.5集成编译环境下编写和调试的。程序用标准C语言编写,调用关系分为五个层次,如表2所示。
4.1 Visual DSP++3.5集成编译环境[6]
Visual DSP++ 3.5是Analog Devices公司为其DSP而开发的一套方便的管理系统,完整的系统包括集成了Visual DSP++内核的集成编译和调试环境、带实时运行库的C/C++优化编译器、汇编和链接器和仿真软件以及大量的程序例程。VisualDSP++还有很多有用的功能,可以使开发人员更准确地把握程序占用内部资源的情况,更直观地了解程序内部各函数的效率等等,这样在Visual DSP++这个软件平台上就可以方便地进行DSP程序的开发和优化。
4.2 文件读写策略优化
FAT32文件系统底层驱动函数决定文件读写的策略,是提高程序读写文件速度的关键。理论上FAT32文件系统可以按照如图8所示的方式对文件的任意内容进行操作。但是这个操作是要针对IDE硬盘进行的,所以必须考虑IDE硬盘的数据传输特性。
IDE硬盘的数据传输速率可分为外部传输率(External Transfer Rate)和内部传输率(Internal Transfer Rate)。外部传输率指的是通过IDE接口缓存与控制器之间进行数据传输的速率。内部传输率也称硬盘持续传输率,是磁盘与缓存之间的数据传输速率。后者比前者要慢很多,所以要提高传输速度,就要尽量连续读写,减少内部刷写缓存的次数。
通过研究理论上文件操作的过程发现,对FAT表的操作大大地影响了对文件的连续读写。在实际程序设计中,为了解决这个问题,一方面在描述文件的数据结构中指定一个成员来记录当前文件操作指针所在的簇,另一方面把部分FAT表提前读入SDRAM中。这两方面的处理大大减少了硬盘连续读写被打断的次数。实验证明这种方案大大提高了程序的效率,使速度大约提高了三个数量级。
4.3 功能设计
一组完善的文件系统库函数是最基本的对文件操作的功能实现函数,应包括文件的打开、关闭、读、写、定位等函数。本人设计十个函数供外部调用,即文件的打开、关闭、读、写、定位、查找、目录列表、重命名、创建目录、删除等。通过最上层的库函数调用第二层的具体功能函数来实现这些函数的操作,其中最主要的三个功能函数是fnFindFile、fnReadFile、fnWriteFile。
fnFindFile的功能是在指定目录下查找和目标文件名相匹配的文件目录项,生成这个文件的指针,流程图如图9所示。
fnReadFile函数是读文件函数。它的参数包括要读入的地址、要读入数据的单位尺寸、要读入数据的长度和目标文件的文件指针,流程图如图10所示。
fnWriteFile函数是写文件函数。它的参数和基本流程和读文件函数类似,但是由于写文件可能会超过原文件大小,所以必须考虑在硬盘上开辟新的空间和修改文件信息等问题,流程图如图11所示。
本文介绍了一种基于Blackfin533处理器实现IDE硬盘的FAT32文件系统的操作的方案。这套系统是基于硬盘PIO传输模式设计的,硬盘PIO传输模式最大传输速度可达到8.3MByte/s,本系统读文件速度平均可达6MByte/s,这说明本系统具有较高的效率。这套系统可以在VisualDSP++ 3.5下编译成库,其它程序可以很简单地调用库中提供的FAT32文件系统操作函数,实现一种基于Blackfin533处理器的嵌入式大容量文件存储管理的解决方案。
参考文献
1 IDE - Hardware Reference & Information Document. http://www.repairfaq.org/filipg/LINK/F_IDE-tech.html, 1996.11.6
2 FAT文件系统原理(一)(二)(三)(四).http://www.sjhf.net, 2004-04-20
3 Information Technology -AT Attachment with Packet Interface Extension (ATA/ATAPI-4), T13,Revision 18,19 August 1998
4 Microsoft Extensible Firmware Initiative FAT32 File System Specification(Version 1.03). Microsoft Corporation, December 6, 2000
5 ADSP-BF533 EZ-KIT Late(r) Evaluation System Manual. Analog Device Inc,2000
6 刘 峰. Blackfin系列DSP原理与系统开发.北京:电子工业出版社, 2004
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论