基于SD卡的μC/FS文件系统在ARM上的移植研究

时间:2022-09-26 03:25:12

基于SD卡的μC/FS文件系统在ARM上的移植研究

摘要:分析了实践中广泛应用的移动设备上数据保存的问题,说明了在ARM系统上应用SD卡作为存储器移植μC/FS的方法。由于SD卡有两种工作模式,提出了接口隔离的策略,避免依赖于SD卡的工作模式,从而改进了软件的适应度。实践证明,该架构实现方便、易维护,取得了较好的效果。

关键词:SD卡 μC/FS 移植 软件架构

中图分类号:TP274.2 文献标识码:A 文章编号:1007-9416(2013)10-0090-02

随着嵌入式系统广泛地应用于工业生产及日常生活等各领域,其功能变得更加多元化,产生的数据量也逐渐增加。通常,这些数据需要及时地保存到存储器中以备将来使用,因而对于存储器也提出了更多需求。一般地,嵌入式系统中的存储器要求可移动性好、可靠性高、容量大、速度快等特点。嵌入式系统中常用的存储器有CF卡、MMC卡、SD卡、TF(Micro SD)卡、工业电子盘等等。SD卡是目前广泛使用的一种存储器,其特点是重量轻、体积小、快速安全等,它由MMC卡发展而来,且与MMC卡保持向上兼容。

为方便开发,一般嵌入式系统会移植操作系统。μC/OS-Ⅱ是一个开源的实时嵌入式操作系统,在嵌入式领域有广泛的应用,但它只是一个实时性的内核,没有提供文件管理功能,不能满足数据存储的需求。为此,可在μC/OS-Ⅱ内核之上增加文件系统。μC/FS就是应用于μC/OS-Ⅱ内核之上的一个文件系统层,内置对FAT文件系统的支持。本文采用SD卡作为物理存储介质,将μC/FS移植到采用μC/OS-Ⅱ作为操作系统的ARM系统上。

1 μC/FS文件系统

μC/FS与μC/OS-Ⅱ出自同一公司,可以很方便地移植到基于μC/OS-Ⅱ的嵌入式系统。实际上,μC/FS采用标准ANSI C编写,可以方便地移植到任何操作系统。μC/FS 1.X版文件系统采用分层的方式设计,如图1所示。

API层是应用程序与μC/FS文件系统的接口,包含一个函数库,提供了诸如FS_FOpen, FS_FWrite等文件操作函数。API层在这些函数内部调用文件系统操作,完成实际的文件操作。文件系统层将文件操作转换成对逻辑存储块的访问,并通过指定驱动器选择实际的物理设备。逻辑块层封装了底层设备驱动接口,向文件系统层提供了一个简单易用的接口。设备驱动层提供对物理存储设备的实际访问接口,比如对扇区的读写等操作。

目前μC/FS在文件系统层提供了对FAT的支持,然而API也可以支持其它文件系统,因此,只要提供合适的接口,μC/FS也可以支持其它文件系统。

2 μC/FS的移植过程

sd卡是在嵌入式系统中广泛使用的存储介质,本文讨论SD卡在μC/fs上的移植。μC/FS在设计时就充分考虑了系统的可移植性,移植的第一步是修改配置文件。

(1)如果系统使用了操作系统,则在文件fs_conf.h中,设置相应的系统:

#define FS_OS_UCOS_II 1 /* 1 =use μC/OS-II */

(2)如果希望文件系统支持目录操作,则在文件fs_conf.h中,作如下设置:

#define FS_POSIX_DIR_SUPPORT 1 /*POSIX 1003.1 like directory support */

#if FS_POSIX_DIR_SUPPORT

#define FS_DIR_MAXOPEN 4/* Maximum number of directory handles */

#endif

(3)在文件fs_conf.h中,选择MMC设备驱动,使其支持SD卡。

#define FS_USE_MMC_DRIVER 1

设定系统中作为文件存储器的SD设备的数量:

#define FS_MMC_MAXUNIT 1

如果需要为设备提供缓存,则在下面设定期望的缓存大小:

#define FS_MMC_CACHENUM 10

μC/FS中还有数个与移植相关的地方需要注意。 在文件Fs_info.c中,保留与SD设备驱动相关的结构定义。

extern const FS__device_type FS__mmcdevice_driver;

#define FS_DEVINFO_DEVMMC {"mmc", &FS__fat_functable, &FS__mmcdevice_driver, FS_CACHEINFO_MMC_DRIVER 0 },

以及mmc_drv.c文件中的设备驱动程序结构:

const FS__device_type FS__mmcdevice_driver = {

"MMC device",

_FS_MMC_DevStatus,

_FS_MMC_DevRead,

_FS_MMC_DevWrite,

_FS_MMC_DevIoCtl

};

3 驱动程序设计实现

μC/FS设计成可以支持多种硬件设备,在设置好配置文件之后,只需提供相应的硬件设备的驱动程序即可完成移植。SD卡接口有两种模式:SD模式和SPI模式,每种模式又对应一种或多种状态(非活动状态、就绪、读、写数据等),主机通过发送命令可以使SD卡在不同的状态间转换,SD卡接受命令,并根据自己现在所处状态做出不同的响应。SD卡提供SPI模式主要是为了兼容,SPI模式工作效率较低,但是适应性好,一般arm芯片都带有SPI接口,因此软硬件实现较简单,在一些要求不高的场合应用广泛;而SD模式效率高,实现略复杂。默认情况下,SD卡工作在SD模式。实际设计中,可能因为某种原因,将SD卡从一种模式改为另外一种,为了适应这种模式上的变更,软件设计上采用接口设计的方式,如图2所示。

接口ISdMode以头文件的方式实现:

#ifndefine __ISDMODE_H__

#define __ISDMODE_H__

extern void SDMODE_Send(unsigned char *bytes, int len);

extern void SDMODE_Recv(unsigned char *bytes, int len);

#endif

在SdDriver文件中包含进此头文件即可引用其中的函数。根据SD卡工作模式的不同,提供相应的文件实现此接口文件中的函数。这样,SdDriver文件就不再依赖于具体的SD卡工作模式,从而解除了对工作模式的依赖。SdDriver文件部分代码如下:

#include “ISdMode.h”

int SD_ReadBlock(unsigned short blockNumber, int len, unsigned char *buf)

{

result = SDMODE_Recv(buf, BUF_LEN);

}

… …

采用SPI模式部分示例代码如下:

#include “ISdMode.h”

void SDMODE_Send(unsigned char *bytes, int len){

int i;

for(i = 0; i < len; i++){

SendByte (*bytes ++);

}

… …

}

static void SendByte(unsigned char byte){

S0SPDR = data;

while( (S0SPSR & 0x80) == 0); // 等待数据发送完毕

}

在mmc_drv.c文件中适当修改以调用SdDriver.c中提供的SD操作函数。

4 其它移植考虑

μC/FS 3.X版去掉了逻辑块层,取而代之是存储层(Storage Layer),并且在API层新增了Storage Api,包含直接访问存储介质的函数集,允许直接读写扇区,API层将这些操作传递给存储层。某些嵌入式系统应用需要持久保存数据,却不需要复杂的文件系统的功能,这些数据可以直接写入存储器,在这种情况下,Storage Api就非常有用。

除了FAT文件系统之外,μC/FS 3.X还提供了EFS文件系统作为选项之一。通过优化磁盘空间的使用,EFS可以数据碎片而不损失性能。EFS也直接支持长文件名,这在许多嵌入式系统应用中可能非常有吸引力。

μC/FS 3.X版的移植与以上过程类似,主要是要提供硬件的驱动程序,然后通过函数FS_AddDevice()添加,这样系统就可以访问设备了。μC/FS 3.X版的主要问题是不再开源了。

5 结语

将μC/FS文件系统移植到以SD卡为存储器的系统上,非常适合在便携性要求较高的场合使用。μC/FS文件系统移植操作简单,结合μC/OS操作系统,还可将其移植到多种常见存储介质。实践中,用LPC2124连接SD卡,工作在SPI模式,取得了预期的效果。

参考文献

[1]Jean J.Labrosse.邵贝贝等译.嵌入式实时操作系统μC/OS-Ⅱ(第2版)[M].北京:北京航空航天大学出版社,2003.

[2]Micri?m Technologies Corporation.?C-FS-UserManualV1-26[EB/DK].2002

[3]Micri?m Technologies Corporation. ?C-FS-UserManualV3-10[EB/DK].2007

[4] Robert C.Martin, Micah Martin. 邓辉,孙鸣译.敏捷软件开发-原则、模式与实践(C#版)[M].北京:人民邮电出版社,2008.

[5]Dino Esposito,Andrea Architecting Applications for the Enterprise[M].北京:人民邮电出版社,2009.

[6]David R. Hanson.C语言接口与实现:创建可重用软件的技术[M].北京:人民邮电出版社,2011.

[7]吴国伟,徐子川,姚琳.嵌入式系统原理与设计[M].北京:机械工业出版社,2010.

上一篇:“一卡通”在门诊就诊流程中的应用研究 下一篇:舰载光电跟踪设备电磁兼容性设计