邓开+邱政+梁国龙
摘要:以典型微型水声监测系统硬件结构为例,分析了几种常见嵌入式应用方面的文件系统的优缺点,介绍了FatFs文件系统的详细移植方法和过程,最后以监测系统的实际使用效果证明了应用FatFs文件系统的优势。
关键词:FatFs;文件系统;水声;监测系统
中图分类号:TP368 文献标识码:A 文章编号:1009-3044(2016)22-0200-03
Abstract: Take the hardware structure of the typical miniature hydroaccoustic monitoring system as an example, this paper analyzes the advantages and disadvantages of several common file systems in embedded system application, and introduces the method and process of migrating FatFs file system in detail, finally the practice effect proves that FatFs file system benefits miniature hydroaccoustic monitoring system.
Key words: FatFs; file system; hydroaccoustic monitoring system
1 引言
随着科学技术的进一步发展和海洋探索的进一步加深,采用电池供电的便携式微型监测系统在水声信号采集和存储领域有着更多的需求[1]。尤其是目前对水声监测系统越来越长的工作时间要求,致使监测数据动辄几百M、几G甚至几十G字节,在这种情况下,对监测数据采用何种存储方式就显得尤为重要。
传统的存储方式一般采用在软盘、光盘、硬盘、闪存等存储介质上直接写入监测数据,完成监测任务后再使用特定编写的软件读出监测数据,转换成与操作系统兼容的TXT、DAT、XLS等文件,以便分析使用或者归档存储。随着存储数据量的越来越大,这种传统存储方式的弊端也愈发突出,如无法避免的转换过程、转换时间越来越长、多次记录数据管理能力的缺失等,都成为了水声监测系统发展上的制约。采用嵌入文件系统的存储方式,可以直接把数据存储为与操作系统兼容的文件格式,并且支持多次记录数据的管理,从而简化监测系统设计上的复杂度,减少监测任务后的数据处理时间,增加水声监测系统使用方法上的灵活性。
2 硬件结构
本文重在讨论FatFs文件系统在微型水声监测系统中的应用,因此硬件系统结构选择有代表性的典型部件来举例说明。在此,我们选择STM32F103RE作为MPU,ADS8326为AD采样核心器件,16G Micro SD卡作为存储介质。此外,硬件系统器件均采用低功耗器件,并进行最小化电路设计,使得我们可以选择普通手机电池为系统电源,以达到降低硬件系统成本和减少系统复杂度的目的。硬件结构如图1所示。
3 文件系统
操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统[2]。文件系统由三部分组成:与文件管理有关的软件、被管理的文件以及实施文件管理所需的数据结构。从系统角度来看,文件系统是对文件存储空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
3.1 常见文件系统对比
我们最早和经常接触的文件系统主要在计算机应用方面,比较常见的有window系统的FAT12、FAT16、FAT32和NTFS,Linux 系统的Ext2、Ext3和Ext4,还有大部分光盘使用的CDFS等。同样,在嵌入式系统应用方面,也有UC/FS、ZLG/FS、efsl、MINIFAT、FatFs等众多常见文件系统,下面进行简要介绍[3-4]。
UC/FS是由Micrium公司开发的文件系统,它是一个高度可移植、可固化的嵌入式FAT文件系统。UC/FS是为与各种类型的硬件兼容而设计的,它适用于所有的存储介质。但它是一个付费的嵌入式文件管理系统,是一个商业版软件,它比较大,且对磁盘的操作效率不高。
ZLG/FS是广州周立功单片机科技有限公司开发的嵌入式文件系统,其公司很多的开发板上面都送了这个文件系统的源代码,但它对磁盘读写操作速度太慢,不适用于实际应用,比较适用于教学。
efsl是sourceforge.net网站发布的一个开源、免费的文件系统,它的整体结构很简单,只需要提供读扇区和写扇区2个函数即可,因此移植工作量很少,但它功能较少,稳定性较差。
MINIFAT是 Toshiba 提供的一个文件系统,此文件系统只支持 fat12/16,提供了比较完整的文件操作函数,支持多设备和多文件,也支持cache管理,有较高的管理效率。但此文件系统不支持长文件名的读取,所有的文件都严格要求是Dos8.3格式的短文件名,总体来说代码清晰,可以自行扩展fat32及长文件名的支持。
FatFs是一个完全免费开源的文件系统,它是一个专门为小型嵌入式系统设计的通用FAT文件系统模块。FatFs完全用标准C语言编写,并且完全与磁盘I/O层分开,因此它独立于硬件架构。它可以被嵌入到低成本的微控制器中,如AVR, 8051,PIC ,ARM, Z80, 68K等等,而且移植比较简单。它支持FATl2、FATl6 和FAT32,支持多个存储介质;有独立的缓冲区,可以对多个文件进行读/写,并特别对8 位单片机和16 位单片机做了优化。
经过以上比较分析,FatFs文件系统比较适用于便携式的微型水声监测系统。
3.2 FatFs文件系统简介
FatFs文件系统的层次结构如图2所示。
图2 FatFs文件系统层次结构
最顶层是应用层,使用者无需理会FatFs的内部结构和复杂的FAT 协议,只需要调用FatFs模块提供给用户的一系列应用接口函数,如f_open,f_read,f_write 和f_close等,就可以像在PC 上读/写文件那样简单。
中间层是FatFs模块,实现了FAT 文件读/写协议。FatFs模块提供的源代码文件是ff.c和ff.h,除非有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。
需要我们编写移植代码的是FatFs模块提供的底层接口,它包括存储介质读/写接口(disk I/O)和供给文件创建修改时间的实时时钟。
官方网站下载FatFs文件系统源代码后,发现移植需要的源代码文件有6个,文件及其说明列举如表1。
FatFs源代码文件中还包括一个名为option的文件夹,其中是一些可选的外部c文件,包含了多语言支持需要用到的文件和转换函数。比如我们需要简体中文支持,则需要添加cc936.c文件,此文件包含了简体中文的GBK和转换函数。
4 FatFs文件系统移植
FatFs文件系统的移植过程大致分为三步。第一步修改数据类型定义文件interger.h,使之与CCS、Keil、IAR等硬件开发平台相适应。第二步修改FatFs模块配置文件ffconf.h,满足我们对FatFs模块的裁减、设置等需求。第三步根据用户实际硬件结构,补充完善disk I/O模块接口层文件diskio.c,需要用户提供实现底层物理磁盘的读写和获取当前时间的功能函数。
4.1 修改数据类型定义文件
修改数据类型定义文件前,需要了解硬件开发平台所用编译器的数据类型定义,根据编译器数据类型修改数据类型定义文件。STM32F103RE是以Cortex-M3 为内核的32 位微处理器,支持的开发环境有Keil 和IAR 等,程序清单1为在KEIL 下定义的数据类型。
程序清单1 数据类型定义
Prog.1 Data Type Definition
/* 以下类型必须为8位 */
typedef char CHAR;
typedef unsigned char UCHAR;
typedef unsigned char BYTE;
/*以下类型必须为16位*/
typedef short SHORT;
typedef unsigned short USHORT;
typedef unsigned short WORD;
typedef unsigned short WCHAR;
/*以下类型必须为16或32位,Keil下为32 位*/
typedef int INT;
typedef unsigned int UINT;
/*以下类型必须为32位*/
typedef long LONG;
typedef unsigned long ULONG;
typedef unsigned long DWORD;
4.2 修改FatFs模块配置文件
从FatFs的R0.07e版开始,需要对FatFs配置的选项从ff.h分离出来,成为1个单独的文件ffconf.h。ffconf.h中提供了丰富的配置选项,移植者可以根据硬件资源的多少和需要使用的功能进行配置,从而达到优化设计的目的[5]。下面我们介绍本硬件平台移植中的几个重要配置选项,其他配置项在FatFs的说明文档里有很详细的介绍。
1. _FS_TIN。这个选项在R0.07版本中开始出现,之前都是以独立的C文件出现,有了这个选项后,两者整合在一起,使用起来更方便。本次移植这个选项定义为0。
2._FS_READONLY。这个选项用来配置是不是只读。我们移植文件系统用于水声监测系统,需要写入记录的数据,因此定义为0。
3._USE_STRFUNC。这个选项用来配置是否支持字符串操作。除了要写入数据,我们还需要记录一些信息,故定义为1。
4._USE_MKFS。这个选项用来配置是否支持格式化。我们在初始化硬件系统的时候需要把SD卡格式化为FAT16或者FAT32,定义为1。
5._US_FASTSEEK。使能快速定位。多次监测时需要找到文件末尾处继续记录,定义为1。
6._CODE_PAGE。需要支持中文GBK码,定义为936。
7._USE_LFN。是否支持长文件名。0表示不支持,1~3表示支持但文件名存储区域不同。我们定义为3。
8._VOLUMES。逻辑存储介质个数。定义为1。
9._MAX_SS。扇区缓冲的最大值,设置为512。
4.3 补充完善disk I/O模块接口层文件
在disk I/O模块接口层文件中,我们需要编写6个接口函数:disk_initialize,disk_status,disk_read,disk_write,disk_ioctl,get_fattime。它们分别实现存储介质初始化、状态读取、介质读、介质写、介质控制和获取时钟的功能。根据水声监测系统功能,存储介质的状态在读写操作之后读入并判断等待过程中会简单使用到,故无需专门编写接口函数,返回RES_OK即可。另外介质控制和获取时钟功能不需要,因此分别返回RES_OK和返回0即可。需要编写的另外3个接口函数如程序清单2~4所示。
程序清单2 disk_initialize函数
Prog.2 disk_initialize function
DSTATUS disk_initialize (
BYTE drv /* 物理驱动器号 */
)
{
if (drv) /* 只有1个,只能是0 */
{
return STA_NOINIT;
}
Status = SD_Init(); /* SD卡的初始化程序 */
if (Status != SD_OK )
{
return STA_NOINIT;
}
else
{
return RES_OK;
}
}
程序清单3 disk_read函数
Prog.3 disk_read function
DRESULT disk_read (
BYTE drv, /* 物理驱动器号 */
BYTE *buff, /* 数据缓冲区地址指针*/
DWORD sector, /* 起始扇区号*/
BYTE count /* 读取扇区数 */
)
{
if (count > 1)
{
SD_ReadMultiBlocks(buff, sector * BLOCK_SIZE, BLOCK_SIZE, count); /* 读多扇区块函数 */
SD_WaitReadOperation(); /* 等待读操作完成 */
}
else
{
SD_ReadBlock(buff, sector * BLOCK_SIZE, BLOCK_SIZE);
/*读单扇区块函数*/
SD_WaitReadOperation(); /* 等待读操作完成 */
}
return RES_OK;
}
程序清单4 disk_write函数
Prog.4 disk_write function
DRESULT disk_write (
BYTE drv, /* 物理驱动器号 */
BYTE *buff, /* 数据缓冲区地址指针*/
DWORD sector, /* 起始扇区号*/
BYTE count /* 读取扇区数 */
)
{
if (count > 1)
{
SD_WriteMultiBlocks(buff, sector * BLOCK_SIZE, BLOCK_SIZE, count); /* 写多扇区块函数 */
SD_WaitWriteOperation(); /* 等待写操作完成 */
}
else
{
SD_WriteBlock(buff, sector * BLOCK_SIZE, BLOCK_SIZE);
/*写单扇区块函数*/
SD_WaitWriteOperation(); /* 等待写操作完成 */
}
return RES_OK;
}
5 结束语
通过以上三个步骤的移植后,我们即可使用FatFs文件系统提供的多种多样、功能强大的应用层函数进行存储介质的文件系统管理,实现微型水声监测记录系统免除数据文件转换、直接存储系统兼容文件、多次记录数据管理等目的。
在微型水声监测记录系统的实际使用中,连续监测8小时数据量为6GB左右,由于采用FatFs文件系统并直接存储为二进制*.dat文件形式,能节约数据导出和转换时间40分钟左右。对于多次监测记录任务而言,也无需考虑存储区域管理和分配问题,定义不同的存储文件名即可记录不同任务的数据。实践证明,文件系统的使用能简化微型水声监测系统设计上的复杂度,减少监测任务后的数据处理时间,增加水声监测系统使用方法上的灵活性。
参考文献:
[1] 曲加圣,杨松. 便携式水下声信标探测定位设备技术设计与实现[J]. 舰船科学技术,2012(4):75-78.
[2] 席卫华. FatFs文件系统在数码相框上的应用[J]. 信息安全与技术,2012(1): 71-73.
[3] 王亮. 基于FatFs嵌入式文件系统的振动检测设备[J]. 可编程控制器与工厂自动化,2014(7):91-93+126.
[4] 龙德亮. 基于μC/GUI和FATFS的车载GPS数据显示与存储系统[D]. 山东师范大学,2014.
[5] 路敦强,吴晓荣. 基于MSP430F5438和FatFs嵌入式文件系统的实现[J]. 天津师范大学学报:自然科学版,2011(2):28-31+68.