基于System ACE的DSP文件系统设计
扫描二维码
随时随地手机看文章
引 言
目前,对图像处理系统的速度和精度要求越来越高,采样的数据量也越来越大。而嵌入式系统中的硬件资源环境一般比较苛刻,嵌入式微处理器和微控制器的内存一般都不大。为了能够实现DSP(Digital Signal Processing)系统的独立运行,需要大容量的存储介质用于保存采样结果。但是板载的Flash等容量通常不大,SDRAM掉电后数据会丢失,并且它们无法方便地把数据转移到计算机主机上。闪存技术的不断发展,使得闪存卡(如CF卡、SD卡等)因其体积小、容量大、可靠性高等优点而在嵌入式存储领域得到越来越广泛的应用。因此,本文介绍一种使用CF卡作为数据存储介质存储大量数据的方法。FAT16文件系统具有出色的文件管理性能,能被大多数操作系统识别,因此将CF卡与FAT16文件系统相结合是嵌入式存储、记录系统的一个理想方案。
1 System ACE原理
1.1 System ACE简介
System ACE(System Advanced Configuration Environment)是Xilinx公司开发的系统高级配置系列,用以满足面向多个FPGA的系统对高效空间、预置、高密度配置需求的解决方案。System ACE技术是一种突破性的系统内可配置的解决方案,大幅节省了开发工作;与传统的PROM相比,每比特成本也大大降低。System ACE技术是高容量FPGA系统的嵌入式解决方案。
System ACE系列把xilinx配置控制的专业技术和专注于存储的产业结合在一起,它的第1个成员是SystemACE CF(CompactFlash)。
System ACE CF是1个芯片集,由2部分组成:一个是ACE控制器,另一个就是用于存储的CF卡。
1.2 ACE控制器
如图1所示,ACE控制器有4个接口,分别用来连接CF(CompactFlash)、MPU(Microprocessor)、用于连接FPGA的CFGJTAG(Configration JTAG)、允许高度灵活配置的TSTJTAG(Test JTAG)。下面着重介绍CF卡接口和MPU接口。
1.3 CF卡接口
CF卡接口可以连接的CF卡类型有Xilinx ACEFlash卡、任意标准的CF卡、高达8 Gb的IBM微型硬盘,以及所有有相同外形和电路板空间需求的存储卡。
CF卡接口由2部分组成:一是CF卡控制器,二是CF卡仲裁器。CF卡控制器不仅用来检测和维护CF卡设备的状态,而且还处理所有的CF设备的访问总线周期及提炼和执行CF命令(如软复位、读/写段)等。CF卡仲裁器决定微处理器和配置JTAG控制器哪一个来访问CF卡的数据缓冲。
1.4 MPU接口
MPU接口功能:
◆MPU接口提供了监控System ACE控制器和ACE Flash读写数据的功能。
◆MPU接口能够识别CF卡并对CF卡进行读写。
◆MPU接口能够控制配置流,包括监控ACE控制器的配置状态和错误状态,还能延时配置、开始配置、决定CF卡或MPU的配置源,控制比特流版本以及复位设备等。
本文就是利用ACE控制器的MPU接口,在该接口处连接DSP芯片,并通过CF卡为DSP加载文件系统。[!--empirenews.page--]
1.5 System ACE的文件和目录
.ACE是在目录结构的最底层。Xilinx的SystemACE软件能够将比特流转换为.ACE文件。1个.ACE文件代表特定设备链的比特流。
.collection是目录结构中紧挨着.ACE的上一层,由8个.ACE组成。在System ACE环境下,同一.collection下的所有.ACE文件都可以处理。
在1个CF卡设备中有多个collection,但在任意一时问只能有1个被激活,至于哪一个被操作是通过xilinx.sys文件来决定的。xilinx.sys文件在ACE Flash设备的根目录下。ACE控制器能够解析xilinx.sys文件。若根目录下面没有xilinx.sys文件,则必须有1个.ACE文件来充当此角色。
System ACE目录结构的分层设计使得它能够维护多个版本或者是不同设计的collection。每一个collection目录可以有1个或者多个不同的子目录。每一个子目录只能包含1个.ACE文件。
Sysrem ACE目录结构的规则如下:
◆Sysrem ACE配置文件必须放在CF卡设备的第1分区。
◆Sysrem ACE分区必须被格式化为FAT12或者FAT16格式。
◆xilinx.sys必须在根目录下。当xilinx.sys不存在时,根目录下必须有1个.ACE来充当此角色。
2 CF卡原理
CF(Compact Flash)卡是以闪存为存储,具有容量大(512 MB)、功耗低和可靠性高等优点,得到广泛的应用。CF卡读写的最小单位为1个扇区(512字节),读写操作是通过卡内缓冲区进行的,不支持直接读写存储区域。
CF卡可以工作在3种模式:PC Card Memory(Memory模式),PC Card I/O(I/O模式)和True IDE模式。PCCARD模式与PCMCIA标准兼容。TRUE IDE模式与ATA/ATAPI-4标准兼容。当上电时,如果OE接地,则进入True IDE模式,在此模式下只可以存取任务寄存器。另外2种模式需要通过设备结构寄存器来选择。
CF卡的操作方式与硬盘的操作方式相似。CF卡读写必须以扇区为单位,每个扇区为512字节,每次可以读写1个扇区或连续多个扇区。扇区的寻址方式有2种:逻辑寻址(LBA)和物理寻址(CHS),它们之间的关系为:
LBA=(柱面号×磁头数+磁头号)×扇区数+扇区数-1
寻址方式采用LBA(Logic Block Address),该方式将全部扇区映射至1块连续的地址空间中,这样可以大大简化编程的工作,同时避免了柱面、磁头和扇区之间的换算,使寻址更方便。对CF卡的配置及各种操作,如读写、删除、格式化等,都通过写特殊功能寄存器完成。
3 文件系统的建立
3.1 文件系统的引入
100个数在文件系统中是如何存放的呢?在计算机中是以0/1二进制的形式简单地存放在存储介质中。如果不同的数多,如何处理?这就引出了文件系统。文件系统实际上就是对存储的数据进行管理。本文在CF卡上建立的文件系统是FAT16。FAT16是Microsoft较早推出的文件系统,具有高度兼容性,目前仍然广泛应用于个人电脑尤其是移动存储设备中。
硬盘上的数据按照其不同的特点和作用大致可分为5部分:MBR(Main Boot Record,主引导扇)区,DBR(DosBoot Record,操作系统引导记录)区,FAT(File AllocationTable,文件分配表)区,DIR(Directory,根目录)区,DATA区。
MBR区位于整个硬盘的0柱面0磁头1扇区(可以看作是硬盘的第1个扇区),bios在执行自己固有的程序以后就会跳转到mbr中的第1条指令,将系统的控制权交由mbr来执行。在总共512字节的主引导记录中,MBR的引导程序占了其中的前446字节(偏移0H~偏移1BDH),随后的64字节(偏移1BEH~偏移1FDH)为DPT(Disk Partition Table,硬盘分区表),最后的2字节“55 AA”(偏移1FEH~偏移1FFH)是分区有效结束标志。MBR不随操作系统的不同而不同,即不同的操作系统可能会存在相同的MBR,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。
DBR(Dos Boot Record,操作系统引导记录)区通常占用分区的第0扇区,共512字节(特殊情况下也要占用其他保留扇区,这里先说第0扇)。在这512字节中,其实又是由跳转指令、厂商标志和操作系统版本号、BPB(BIOS Parameter Block)、扩展BPB、os引导程序、结束标志几部分组成。
FAT表是用FAT16来记录磁盘数据区簇链结构的。如前面的例子,FAT将磁盘空间按一定数目的扇区为单位进行划分,这样的单位称为簇。通常情况下,每扇区512字节的原则是不变的。簇的大小一般是2n(n为整数)个扇区的大小,像512 B、1 KB、2 KB、4 KB、8 KB、16 KB、32 KB、64 KB。实际中通常不超过32 KB。之所以簇为单位而不以扇区为单位进行磁盘的分配,是因为当分区容量较大时,采用大小为512位的扇区管理会增加FAT表的项数,对大文件存取增加消耗,文件系统效率不高。
DIR(Directory)是根目录区,紧接着第二FAT表(即备份的FAT表)之后,记录着根目录下每个文件(目录)的起始单元、文件的属性等。定位文件位置时,操作系统根据DIR中的起始单元,结合FAT表就可以知道文件在硬盘中的具体位置和大小了。
数据区是真正意义上的数据存储的地方,位于DIR区之后,占据硬盘上的大部分数据空间。
3.2 FAT16文件系统存储原理
在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。格式化FAT16分区时,格式化程序根据分区的大小确定簇的大小,然后根据保留扇区的数目、根目录的扇区数目、数据区可分的簇数与FAT表本身所占空间来确定FAT表所需的扇区数目,之后将计算结果写入DBR的相关位置。FAT16 DBR参数的偏移0x11处记录了根目录所占扇区的数目。偏移0x16记录了FAT表所占扇区的数据。偏移0x10记录了FAT表的副本数目。系统在得到这几项参数以后,就可以确定数据区的开始扇区偏移了。FAT16文件系统从根目录所占的32个扇区之后的第1个扇区开始以簇为单位进行数据的处理,这之前仍以扇区为单位。对于根目录之后的第1个簇,系统并不编号为第0簇或第1簇,而是编号为第2簇,也就是说数据区顺序上的第1个簇也是编号上的第2簇。FAT文件系统之所以有12、16、32不同的版本之分,其根本在于FAT表用来记录任意一簇链接的二进制位数。以FAT16为例,每一簇在FAT表中占据2字节(二进制16位)。所以,FAT16最大可以表示的簇号为0xFFFF(十进制的65535),以32 KB为簇的大小的话,FAT32可以管理的最大磁盘空间为:32 KB×65 535=2 048 MB,这就是为什么FAT16不支持超过2 GB分区的原因。FAT表实际上是1个数据表,以2字节为单位,我们暂将这个单位称为FAT记录项,通常情况其第1、2个记录项(前4个字节)用作介质描述。从第3个记录项开始记录除根目录外的其他文件及文件夹的簇链情况。[!--empirenews.page--]
4 DSP对CF卡的读写操作
4.1 DSP对CF卡读写的硬件电路
通过在MPU端口处连接DSP来实现DSP对CF卡的读写,图2为DSP读写CF卡的示意图,图3为硬件连接图。
4.2 DSP对CF卡读写的软件流程
图4为DSP读写CF卡数据的软件流程。首先,DSP通过MPU端口访问CF卡前必须获得CF卡锁,否则进入等待直到CF卡处于空闲状态或者强制获得CF卡锁。其次,CF卡数据的读写是以扇区为单位的。1个扇区可以分为若干个sector,每个sector的大小固定为512字节,每个sector又可分为16个buffer。若已知CF卡的容量就可以通过计算来设置LBA、sector变量以及buffer变量。最后,对buffer进行读写,读写结束后释放CF卡锁。
4.3 程序设计
可以通过以下函数来实现DSP对CF卡的读写。
◆获得CF卡锁:Uint32 get_CF_lock(void);
◆检测CF卡当前状态:Uint32 check_CF_ready (void);
◆检测buffer是否准备就绪:Uint32 wait_buffer_ready(void);
◆读CF卡数据:Uint32 read_data_from_CF(Uint8*p_data,Uint32 LBA,Uint16 Sector Count);
◆向CF卡写数据:Uint32 write_data_to_CF(Uint8*p_data,Uint32 LBA,Uint16 Sector_Count);
◆复位:void reset(void)。
结 语
本文实现了DSP通过System ACE对CF卡进行数据存储管理,充分利用了SystemACE技术的系统内配置方案,突破了传统的多FPGA应用环境。
CF卡作为存储介质具有容量大、接口简单、体积小、价格低廉和可靠性较高等特点,结合FAT16文件系统,可以很方便地存储和回放数据。