- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
基于DSP视频系统的CF卡FAT文件系统设计与实现
0 引言
随着DSP系统在视频处理领域中越来越广泛的应用,其应用功能也在拓展。视频存储是DSP系统中不可或缺的功能,如何对经过处理后的视频数据进行灵活的存储是目前DSP系统应用开发领域面临的问题之一。
在存储介质的选择中,CF卡以其容量大、功耗低、体积小等优点成为目前主流的存储介质之一,被广泛应用于数据采集等领域。为了能方便地在CF卡上进行数据存储,需要在DSP系统中设计CF卡上的FAT文件系统。当DSP系统应用于视频处理时,视频处理是以帧为单位的,需要对每帧数据进行实时存储。这就要求更复杂的FAT文件系统设计。
本文在DM642视频处理系统上,以CCS为开发平台,对经过压缩后的视频数据利用线程间SCOM通信,实时地存储到CF卡中,存储格式采用FAT16文件系统,并实现与PC机操作的兼容。
1 DSP视频系统CF卡FAT文件系统设计
1.1 DSP系统模块框架
本文所涉及到的DSP视频处理系统的框架示意图如图1所示。
摄像头采集视频,通过DS进行各种处理,压缩编码后,存储到CF卡中。系统软件构架包括视频采集线程、视频处理线程、视频压缩编码线程、CF卡读/写线程、视频压缩解码线程、视频显示线程。
1.2 FAT文件系统
FAT16文件系统包括DBR(DOS BOOT RECORD)扇区、FAT表和FAT表备份、根目录和数据区。DBK扇区是引导记录区,占用分区的第0个扇区,512个字节。根目录用于存储文件的目录项。FAT文件系统在存储文件时将数据区以簇为单位划分,簇大小由数据区大小决定。文件在数据区的存储情况都会在FAT表中体现出来。FAT表偏移位置对应了数据区中的所有簇的序号,起始簇号是2。若一个文件占用了若干个簇,被占用的簇的序号对应的FAT表的位置会做出相应的标识。
1.3 SCOM通信
SCOM通信是RF5结构中线程之间数据通信的方式。RF5结构包含了四个处理部件:标准算法、单元、通道、和线程。这四个部件位于不同的层次,处理部件之间可以进行数据的通信。RF5中的数据通信包括线程级通信和单元级通信。其通信机理为使用结构体进行信息传递。
线程级通信中就利用SCOM通信来实现,即发送SCOM消息。SCOM消息是用户定义的一个数据结构,用于任务之间交换信息。为实现信息传递,某个任务申请一定大小的数据缓冲区,以供其他任务读/写数据。
1.4 FAT16文件系统设计
针对图1中DSP视频处理系统系统,本文设计了基本的文件操作:
格式化分为以下几个步骤:
(1)写DBR扇区。将DBR扇区设在CF卡的起始位置。在DBR扇区中的内容如表1所示。
在BPB块中,有两个比较重要的字段,每簇扇区数m和每FAT扇区数n,偏移位置分别为0x0D和0x16。这两个字段由CF卡的容量所决定的。本文中的CF卡容量为2G,m为128,n为128。
(2)初始化FAT表和FAT2表。FAT表的起始标识符是0xFFF8,在格式化后,其对应各个簇号的有效内容都为0,FAT2表作相同的处理。
(3)初始化根目录表。只需全部写入0。
初始化成功后,返回值为0,否则为-1。
FAT_getfileinfo函数用于获取文件的目录项,参数是文件名和指向目录项的指针。执行此函数,第二个参数pfdt指向的结构体存放文件对应的目录项。若文件名存在,函数返回目录项在根目录表的索引位置,若不存在或已删除,返回-1。
FAT_creat函数用于创建新文件,参数是文件名。首先调用FAT_getfileinfo函数,如果返回值不为-1,报错返回0;申请目录项空间,如果查找的范围超出了根目录表,报错返回;申请成功后,对新建目录项进行初始化。
FAT_read函数用于读取CF卡中的视频文件,参数为文件名。读取文件时系统的有效线程有CF卡读线程、解码线程、显示线程。所以利用SCOM进行线程间通信时,不需要考虑CF卡的读线程的上游线程同步,向压缩编码线程发送NULL消息即可。
视频数据在线程之间的传递是以帧为单位的,所以在进行读文件时也是按帧读取。而在FAT文件系统中,文件在数据区的存储又是按簇进行的,所以需要对视频数据的存储情况进行考虑。
经过压缩的图像帧包括帧头信息和帧数据。帧头信息包括帧大小和对应的时间信息,占用一个扇区。图像帧的存储有图2所示几种情况。
图2(a)表示帧在簇内存储;图2(b)表示帧在簇内,但是帧尾也是簇尾;图2(c)表示帧跨簇存储,只有部分帧数据在下一簇;图2(d)表示图像帧跨簇存储且只有帧头在本簇。对这三种情况,要做不同的处理。
FAT_read函数的具体操作步骤如下:
(1)调用FAT_getfileinfo函数判断文件是否存在,并获取文件的目录项信息。
(2)读取FAT表,并通过FAT表和目录项中的起始簇号计算文件在数据区的偏移位置。
(3)用剩余文件长度作为循环条件重复执行以下操作。
读取帧头信息,确定帧数据占的扇区数,并通过本簇已读扇区判断帧存储情况。参照图2,若是情况(a),则在读帧头和帧数据时都不需要更新;若是情况(b),则在读完此帧数据后更新簇号;若是情况(c),则在读帧数据时更新簇号;如果是情况(d),则在读取帧头后就立即更新簇号。保存帧头的时间和长度信息,和帧数据信息利用SCOM通信一并发送至解码线程。语句如下,
MsgWork.bufChannel=FRAME_BUF;//对SCOM消息赋值
SCOM_putMsg(fromWorktoEnc,NULL);//向上游线程发送同步信息
SCOM putMsg(fromWorktoDec,&MsgWork);//向下游线程发送SCOM消息
SCOM_getMsg(fromDectoWork,SYS_FOREVER);//等待接受下游线程同步消息
FAT_write为写文件函数,参数为文件名和写命令。写命令为TRUE时,实现文件拼接,为FALSE时,实现文件覆盖。写文件时,系统中的线程全为有效线程,所以在线程通信和同步时需要同时考虑上下游线程。
(1)读取文件的目录项信息,获得其长度,起始簇号等信息,通过簇链找到文件已写到的最后一个簇号。并利用文件长度信息,计算出最后一簇已写的扇区数。若writen_seetnum为0,则需要寻找下一个未占用的簇。
(2)利用SCOM通信获取编码线程发送过来的帧头信息和帧数据,将其写入CF卡,按照图2所示的4种情况进行处理。与读文件不同的是,在更新簇号时需要寻找未占用簇。
(3)写完此帧数据后,通过SCOM通信向解码线程发送数据消息,并更新目录项和FAT表及FAT2表。
(4)重复以上步骤。写完所有的图像帧后,将更新后的目录项FAT表及FAT2表写入CF卡相应位置。
若要实现文件覆盖,在写文件之前调用FAT_delete函数将文件删除,然后再重新创建写入即可。
FAT_delete函数首先调用FAT_getfileinfo函数判断文件是否存在,若存在则获取文件的目录项及其索引位置。将FAT表中的簇链清除,并将目录项中文件名的第一个字符值置为0xe5,表示已删除。
2 实验结果与结论
CF卡FAT文件系统的设计功能分别在DM642平台和Windows操作系统中得到了验证。在DM642视频处理平台上,可对文件进行各种操作,包括格式化CF卡,创建新的空文件,写入视频文件,包括以拼接方式写文件和以覆盖方式写文件,删除文件。
在DM642平台上写入4个视频文件到CF卡,视频文件经过H.264格式压缩,每个文件写入200帧。将CF卡通过读卡器与PC机连接,可在PC机中查看到文件并进行各种操作,如删除、移动、复制等。
图3是CF卡在Windows系统中视频文件的查看。
图4为WinHex工具下查看的CF文件系统信息内容,可以查看到CF卡中的内容存放形式以及各个部分的起始位置以及占用空间大小。
实验结果表明,本文设计的FAT文件系统能成功地运用在DSP视频处理平台上。通过该系统,可对视频数据进行FAT文件格式的实时存储。此系统设计方案还可应用于一相关存储设备(如SD卡)和实时系统。