开篇:润墨网以专业的文秘视角,为您筛选了一篇基于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.