一种嵌入式文件系统数据存储模块的实现

出处:韩晓雪,曾 鸣,邵贝贝 清华大学 发布于:2011-09-02 08:48:20

  引言

  信息技术(Information Technology,简称IT),是主要用于管理和处理信息所采用的各种技术的总称。它主要是应用计算机科学和通信技术来设计、开发、安装和实施信息系统及应用软件。它也常被称为信息和通信技术(Information and Communications Technology, ICT)。主要包括传感技术、计算机技术和通信技术。信息技术的研究包括科学,技术,工程以及管理等学科,这些学科在信息的管理,传递和处理中的应用,相关的软件和设备及其相互作用。

  随着信息技术的发展,嵌入式系统简单地对存储介质按地址、字节进行读写的方式已经不能满足实际应用的需求,利用文件系统对存储介质进行管理成为嵌入式系统的一个发展方向。嵌入式系统是“控制、监视或者辅助装置、机器和设备运行的装置”(devices used to control, monitor, or assist the operation of equipment, machinery or plants)。从中可以看出嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。目前国内一个普遍被认同的定义是:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统,对功能、对可靠性、成本、体积、功耗有严格要求的专用计算机系统。本文中基于MC9S12UF32单片机,结合开源文件系统FatFS,设计实现了使用FAT文件系统的大容量数据存储模块。

  1 系统结构

  数据存储系统框架如图1所示。该数据存储模块以Freescale公司的MC9S12UF32为,串行通信接口SCI接收到的数据可以直接通过单片机以FAT文件的形式存储在micro SD卡中。用户程序可以通过编程控制单片机,直接对micro SD卡中的任意文件进行读写,实现存储数据。由于实现了FAT文件系统,用户也可以通过单片机内置的USB接口将本数据模块识别为U盘,用PC机进行读写操作。PC (personal computer),个人计算机一词源自于1978年IBM的部桌上型计算机型号PC,在此之前有Apple II的个人用计算机。能独立运行、完成特定功能的个人计算机。个人计算机不需要共享其他计算机的处理、磁盘和打印机等资源也可以独立工作。今天,个人计算机一词则泛指所有的个人计算机、如桌上型计算机、笔记型计算机、或是兼容于IBM系统的个人计算机等。

  2 硬件结构及底层函数的编写

  本文所介绍的数据存储插件由MC9S12UF32、DSl2887实时钟模块、micro SD卡、串行通信接口以及USB接口5部分组成。实时时钟,可以为数据存储模块的文件系统提供正确的时间戳信息,在精简的系统设计中,这个部分则可以省略。

  2.1 MC9S12UF32单片机

  Freescale公司生产的这款16位单片机具有3.5 KBRAM和32 KB Flash EEPROM。它的特点在于拥有USB2.O接口、ATA5接口以及SD/MMC、SmartMedia、MemoryStick等多种存储卡接口。

  (1)SDHC模块

  SDHC是"Secure Digital High Capacity“的缩写,即“高容量SD存储卡”。2006年5月SD协会发布了SD 2.0的系统规范,并在其中规定SDHC是符合该规范、容量大于2GB小于等于32GB的SD卡。SDHC的特点就是高容量(2GB-32GB)。另外,SD协会规定SDHC必须采用FAT32 文件系统,这是因为之前在SD卡中使用的FAT16文件系统所支持的容量为2GB,并不能满足SDHC的要求。作为SD卡的继任者,SDHC主要特征在于文件格式从以前的FAT12、FAT16提升到了FAT32,而且支持32GB。同时传输速度被重新定义为Class2、Class4、Class6等级别,高速的SD卡可以支持高分辨视频录制的实时存储。

  SDl.O规范协议中定义了对SD卡的两种访问模式:SD模式和SPI模式。使用SDHC(Secured Digital cardHost Controller)模块对SD卡读写采用了SD模式。SD卡与SDHC的连接如图2所示。

  MC9S12UF32内部集成的SDHC模块支持SD卡1.O版本的物理层协议,所以本系统使用标准microSD卡(而非SDHC卡),其存储容量为2 GB。这样的存储容量已经完全可以满足大多数嵌入式应用的需求。

  (2)MC9S12UF32与SD卡之间的数据传输

  在完成对时钟频率和传输数据线宽度的配置之后,通过发送相应的读写命令就可以实现单片机与SD卡之间的数据传输了。在单片机向SD卡写入数据的过程中,编程者将需要写入的数据写入SDHC模块的SDATA寄存器(16位)之后,该数据将被转移至发送数据FIFO中。与此同时,只要发送数据FIFO非空,其中的数据就会不断地通过数据线被写入SD卡的相应位置。在单片机从SD卡中读取数据的过程中,SD卡中的数据将不断发送至接收数据FIFO中。

  2.2 DSl2887实时钟模块

  DSl2887模块使用数据/地址复用的并行异步总线,可以为单片机提供100年以内的实时钟信息(年/月/日/时/分/秒)。它内部具有石英晶振和锂电源,首次使用时,需要对该模块内部的寄存器进行相应配置,激活晶振使其进入工作状态。

  设定DSl2887的时间和从DSl2887中读取时间信息的底层程序比较简单,只需参照芯片手册对寄存器进行合理配置。但是,需要特别注意的是,在写时钟和读取时钟之前需要锁存时钟信息相关的buffer,防止在读写过程中由于出现时钟信息自动更新情况而导致的错误。系统中,在每次读写实时钟之前,查询DSl2887内部控制寄存器A位UIP是否为O,以避免上述错误的产生。因为芯片手册中给出,一旦UIP=O,那么在244μs内实时钟模块都不会自动更新当前的时钟信息,而这段时间足以让单片机完成读写实时钟的过程。

  3 FatFS文件系统的移植与配置

  3.1 FatFS软件包简介

  采用文件系统,是为了在单片机能够对SD卡进行数据读写的同时,保证其读写的数据能够被大多数通用设备识别。换言之,数据在存储器内的组织型式,需要遵循一些已有的工业标准和规范。

  当前着名的嵌入式文件系统有若干种选择,这之中EFSL和FatFs都是开放源码的,具有十分详尽的文档和函数手册,除错更新也十分及时,在本文的设计中我们采用的是FatFS。

  FatFS采用使用ANSI C编写,具有很好的硬件平台独立性,使用者只需要对源程序进行简单的修改和配置,就可以将其移植到各种系列的单片机上。此外,它的内存开销很小,ROM的占有量在十几KB的量级,使用者可以根据不同的应用方便的对代码进行裁减。FatFS支持FATl2、FATl6和FAT32,可以建立独立的缓冲区对多个文件进行读写。FatFs是一个通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统。 FatFs 的编写遵循ANSI C,因此不依赖于硬件平台。它可以嵌入到便宜的微控制器中,如 8051, PIC, AVR, SH, Z80, H8, ARM 等等,不需要做任何修改。

  3.2 FatFS的移植

  可从FatFS的主页上得到FatFS R0.07版本。FatFS的主程序包含5个文件,即diskio.c、diskio.h、ff.c、ff.h和integer.h。其中,diskio.c和diskio.h是与底层硬件I/O相关的函数;ff.c和ff.h是应用函数,主要涉及FatFS的配置和裁减。

  移植FatFS的过程中基本不需要对diskio.h和ff.c进行修改。除了核实integer.h中的数据类型定义是否与MC9S12U32数据类型相符之外,移植的重点工作在于diskio.c中6个主要函数的实现和ff.h中对于文件系统的裁减配置。dikio.c包含的6个接口函数:disk_initial-ize,disk status,disk ioctl,disk read,disk write和disk_fattime。

  具体移植过程如下:

  (1)存储媒介初始化函数

  DSTATUS disk_initialize(BYTE drv)

  由于采用的存储媒介是SD卡,所以该函数的实际功能是对SD卡进行初始化。drv是存储介质号码,由于Tiny-FatFS只支持一个存储介质,所以此处drv始终取O值。执行无误,则返回值=O;执行中出现错误,则返回非O值。

  (2)状态检测函数

  DSTATUS disk_status(BYTE drv)

  该函数用于检测是否支持当前的存储介质。此处的drv仍然恒为O。对Tiny-FatFS而言,只要drv为O,就认为支持当前介质,函数直接返回O值即可。

  (3)读扇区函数

  DRESULT disk read(BYTE drv,BYTE*buff,DWORD seetor,BYTE.count)

  该函数是在“单片机从SD卡读取一个扇区”的函数基础上编写而成的,其功能是从SD卡读取一个或多个扇区的数据。*buff用于存储已经读取的数据,sector是待读取扇区的起始扇区数,count是需要读取的扇区数。如果执行无误则返回O值,否则返回非O值。

  (4)写扇区函数

  DRESULT disk_write(BYTE drv,const BYTE*buff。DWORD sector,BYTE count)

  与disk_read相似,该函数是在“单片机向SD卡写入一个扇区”的函数基础上编写而成的,其功能是向SD卡导入一个或多个扇区的数据。*buff用于保存将要写入的数据,sector是待写入扇区的起始扇区数,count是需要写入的扇区数。如果执行无误,则返回0值;否则,返回非0值。

  (5)存储介质控制函数

  DRESULT disk_ioctl(BYTE drv,BYTE ctrl,VoiI*buff)

  ctrl是控制代码,*buff用于保存或接收需要控制的数据数据。使用者可以在此函数里添加自己需要的功能代码,例如获得存储介质的容量、扇区数等。如果是简单的应用,也可以不执行任何功能,直接返回0值。

  (6)实时钟函数

  DWORD disk_fattime(Void)

  该函数将读取的实时钟信息保存在一个32位无符号整数中,并将其作为函数的返回值。时钟信息在这32位中的具体分布如表1所列。

  3.3 FatFS的裁减与配置Tiny-FatFS

  FatFs提供了丰富的库函数,可以实现创建、读取文件夹,创建、读写文件,移动文件指针,向文件中写入或读取字符串,甚至是类似与C语言fprintf()的格式化输入等各种功能。FatFS提供的函数与宏的对应关系如图3所示。

  FatFS的裁减,不仅仅是函数层面的。更重要的是,在内部机制上形成一个精简版本,称为Tiny-FatFS。它与标准版FatFS相比,主要的区别在于Tiny-FatFS仅支持一个物理存储介质,而且不再针对每个开启的文件建立512字节的缓存,整个文件系统和物理介质使用同一个缓存。显然,Tiny-FatFs需要的内存开销比标准版FatFS更低,只要1 KB左右的RAM。

  在表2中,对ff.h中主要配置宏的含义进行了说明,同时给出了本文所介绍的数据存储模块采用的取值。

  4 FatFS文件系统的使用

  FatFS文件系统中涉及2个基本的数据结构:文件系统(磁盘)的数据结构FATFS和文件的数据结构FIL。这两个结构是FatFS软件主要的RAM开销,FATFS数据结构中有针对磁盘的512字节读写缓存,FIL则有针对每个文件的缓存。

  依次使用f_mount、f_open、f_rcad/f_write、f_close可以完成基本的读写。FatFS允许对同一文件同时复数读取,但完全不支持对同一文件同时复数的写入操作,因为这会引起文件系统错误。具体每一个函数,特别是字符串读写、格式化读写等,可以参见原始帮助和例程。

  此外,由于嵌入式系统具有突然掉电的可能性,一些关键代码段可能导致文件系统错误,所以要注意调用f_sync()及时写入。当然,如果是一组连续的f_write()写入,而每次写完都f_sync(),则会极大地影响速度,可以全部写完后f_sync()。

  V0.07以后版本的FatFS,增加了以下新的功能:

  ①_FS_TINY。Tiny模式变成了一个宏选项,而不是独立的代码包。

  ②_FS_RPATH。决定是否有当前路径的概念,这将影响两个相关函数的参数。

  ③_USE_LFN。启用长文件名支持,可为1或2,为2时可重入。由于长文件名存在堆栈上,而且启用LFN会依据代码页增加一个很大的转换表,占掉几十~几百KB,所以不推荐。

  ④_LFN_UNICODE。长文件名使用Unicode,实验阶段,尚未正式写入文档。

  结语

  MC9S12UF32单片机内部集成的SDHC模块,可将SD总线转换为单片机内部的IP总线,开发者只需要对SD协议的基本内容有所了解,通过读写相应的寄存器就可以方便地实现对SD卡的底层读写,大大简化了硬件的开发过程。同时,独立于硬件平台的FatFS软件包可以方便地移植到各种嵌入式系统中,研发者只需要对该软件包的diskio.c和ff.h进行修改,即可完成移植,从而使用FatFS提供的丰富且易于使用的各种接口函数。

  应用上述主要技术实现的具有嵌入式文件系统的数据模块如图4所示。

  该模块体积小巧、存储数据的灵活性和通用性很高,可以通过模块自带的串行通信接口接收数据,并以文件的形式存储起来。用户既可以直接通过USB接口将本模块识别为U盘进行数据读写和分析,也可以将micro SD卡拔出,在任意一个具有micro SD读卡器功能的设备上读写数据。


  
关键词:存储嵌入式

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

广告
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!