基于uTenux的fatfs文件系统移植本科毕业论文设计_第1页
基于uTenux的fatfs文件系统移植本科毕业论文设计_第2页
基于uTenux的fatfs文件系统移植本科毕业论文设计_第3页
基于uTenux的fatfs文件系统移植本科毕业论文设计_第4页
基于uTenux的fatfs文件系统移植本科毕业论文设计_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

绪论1.1实时操作系统简介1.1.1实时操作系统的概念实时操作系统(Real-timeOperationSystem,RTOS):系统能够及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致的运行的嵌入式操作系统。在工业控制、航空航天、实时检测等流程控制要求非常精确的领域,必须要在指定的时间内做出指定的响应,这时就需要实时操作系统来控制。我们常常说的嵌入式操作系统都是嵌入式实时操作系统,比如uTenux、uC/OS-II。1.1.2常见的实时微控制器操作系统及其对比1.uTenux微控制器操作系统uTenux是一款优秀的开源免费的实时微控制器操作系统,是由大连悠龙软件科技有限公司开发与维护。Tenux是由T-EngineLinux的缩写构成,Tenux具有(a)T-Engine的开源高实时性内核T-Kernel为内核;(b)Linux上丰富的开源中间件为中间件;(c)Eclipse+GNU开源开发工具为基础工具;(d)打造适合中国电子产品市场的开源嵌入式实时操作系统及方便的集成开发环境。uTenux适用于微控制器(CortexM/ARM7,ROM:大于64K),它的内核是uT-Kernel,具有丰富紧凑的中间件,比如FATFS、LWIP、FLTK。适用产品:小型物联网控制终端,比如机器人、智能仪表、小型数控机床、PLC、相机等。它的特点有:所有源码公开、完全免费占有日本60%市场的成熟实时微内核支持函数和软中断两种方式抢占式实时多任务操作系统不需要MMU,占用ROM/RAM少可以支持所有32位ARM7/9和CortexM系列的微控制器可配置任意多个任务、任务的优先级最多255个2.uCOS微控制器操作系统uC/OSII(MicroControlOperationSystemTwo)是一个可以基于ROM运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。为了提供最好的移植性能,uC/OSII最大程度上使用ANSIC语言进行开发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU(包括DSP)。uC/OSII可以简单的视为一个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。内核属于抢占式,最多可以管理60个任务。从1992年开始,由于高度可靠性、鲁棒性和安全性,uC/OSII已经广泛使用在从照相机到航空电子产品的各种应用中。3.uTenux和ucos的对比(1)uTenux有固定和可变尺寸内存池管理;ucos只有固定尺寸内存池。(2)uTenux的邮箱支持消息队列和任务等待队列,因此发送多个消息都可以;ucos的邮箱只能发送一条消息,很简单。(3)uTenux中有专门定义中断处理程序的系统调用-tk_def_int,很方便,而ucos中就没有。(4)uTenux有Trace、Hook等调试功能,而ucosii没有。(5)uTenux的任务堆栈等需要内存的地方,可以由系统自动分配也可以开发人员手工分配;但ucos只能手工分配。(6)uTenux的任务、信号量等系统对象采用ID方式实现,用户看不到内部的数据结构,对于安全性比较好,使用也方便;而ucos是用户定义每个系统对象的变量。(7)uTenux的任务间通信机制比ucos多了好几种,比如集合点端口等,而且每个通信机制都支持任务队列和消息队列。(8)uTenuxV1.5的易用性没有ucos的强,幸好uTenux已经意识到自己的问题,向ucos的易用性学习,在模仿中超越对手。(9)uTenux终身开源免费,无论是学习、商用、修改再发布,而ucos只有学习时是开源免费的,商用必须付费。综上所述,学习uTenux的意义大于ucos。1.2嵌入式文件系统简介1.2.1文件系统概述文件系统是操作系统的重要组成部分,用于控制对数据、文件及设备的存储[2]。它提供对文件和目录的分层组织形式、数据缓冲以及对文件的存储权限的控制。文件系统必须提供必要的用来创建、删除文件、读文件和写文件等相应的系统调用。文件的存储通过目录完成,所以对目录的操作是文件系统功能的一部分,,文件系统应具有以下功能:=1\*GB2⑴提供对文件和目录的分层组织形式;=2\*GB2⑵建立与删除文件的能力;=3\*GB2⑶文件的动态增长和数据保护。硬盘的出现推动了针对桌面操作系统的文件系统的发展,同样,嵌入式存储设备特别是flash的出现,也推动了嵌入式文件系统的发展。1.2.2嵌入式文件系统一般体系结构在嵌入式文件系统中,嵌入式系统可以针对特殊的目的定制,特别是随着ASOS(为应用定制的嵌入式操作系统)的发展,对嵌入式操作系统的系统功能完整性和可伸缩性提出了更高的要求。所以不得不采取一种灵活的系统体系结构,对于操作系统来说,文件系统是一个独立的子包含的整体,可以灵活的加载和卸载,这一切操作对操作系统内核的功能没有任何影响。嵌入式文件系统系统体系结构从上到下一般有3层,如图1.1所示。图1.1嵌入式操作系统体系结构最上一层是文件系统的核心,使文件系统实现的核心算法,提供了用户可见的所有API函数,以供用户操作数据,这一层是文件系统功能的集合。第二层是高速缓冲管理,高速缓冲区的大小直接关系到文件系统的处理效率,高效的缓冲区处理算法能大幅提高数据的处理效率;同时它为文件系统提供了与硬件无关的接口,为文件系统的层次性提供了基础。最下面一层是设备驱动程序,涉及到具体的硬件。设备驱动程序的另一个重要任务就是提供统一设备驱动接口。文件系统和操作系统内核的关系主要体现在三方面:实时时钟、信号量和中断管理。用时钟实现外设任务的等待延时;用信号量实现外设的同步和互斥;用中断管理机制管理外设的中断处理程序。1.2.3文件系统概述目前,嵌入式文件系统解决方案比较多,由于嵌入式设备的多样性,相应文件系统的实现也有针对各种设备的,如只读存储器、可读存储器、Flash存储器等。嵌入式文件系统也是要针对嵌入式操作系统的。1.FatFSFatFS是一个开源免费通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统。FatFs的编写遵循ANSIC,因此不依赖于硬件平台。它可以嵌入到便宜的微控制器中,如8051、PIC、AVR、SH、Z80、H8、ARM等等。它是window兼容的FAT文件系统,平台依赖性小,易于移植,代码和工作区占用非常小,有多种配置选项。通过配置FatFS可以使得FatFS占用的RAM达到44字节,代码空间的占用可以小到2K-4K,在这样小的空间中它还能支持FAT32,这是以文件的写功能的限制为代价的。FatFS是标准FAT文件系统的小型嵌入式文件系统,它是一个自由软件,可以用于教育、研究、商业。在使用过程中不用担心被限制。用户可以修改,重新发布以个人的身份。但是必须在源代码中包含这个版权申明。文件分配表FAT(FileAllocationTable)用来跟踪硬盘上每个文件的数据库,而FAT表存储关于簇的信息。FAT表示microsoft在FAT文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。FAT分区格式是microsoft最早支持的分区格式,依据FAT表中的每个簇链的所占位数分为FAT12、FAT16、FAT32三种形式,但其基本存储方式是相似的。如图1.2所示。图1.2FatFs模块结构2.uC/FSuC/FS是uCOS的文件系统,它是由Micrium公司新开发的一个产品,主要应用在使用uCOS内核的嵌入式系统中。uC/FS是一个用于能提供基础访问功能的FAT格式的文件系统,是一个高效率的库,为高速、多功能及内存使用进行优化。它用ANSIC编写,由不同的层次结构组成,包括API层、文件系统层、逻辑区块层、设备驱动和硬件层。总之,在上述的嵌入式文件系统中,FatFS和uC/FS都用于小容量闪存设备,功能都比较齐全。但是uC/FS是属于拥有知识产权的技术,是商业产品,而FatFS则完全是开源免费的,用户可以随时下载所有全代码,更改和再发布。随着NANDFAlsh作为嵌入式系统中大容量存储介质的普及应用,FatFS文件系统作为开源代码的项目,得到芯片产商,项目开发人员的一致好评。所以在本项目中选择FatFS作为目标文件系统。1.3嵌入式文件系统的必要性嵌入式系统过去主要用于工业控制领域,对效率的比较高,对于数据处理不够重视,引入文件系统不但没有必要而且会降低效率,所以很多嵌入式系统应用都没有加载操作系统。随着嵌入式处理器性能的不断升级,嵌入式系统的功能不断加强,用户的需求也和功能复杂度的增加,许多嵌入式系统都面临着处理大量数据的问题;另外对于应用程序开发人员直接访问内存具有很大的风险性,需要对内存的访问进行封装。综上所述在嵌入式操作系统内核和应用程序之间加一个文件系统成为必然趋势。2uTenux实时操作系统uTenux实时操作系统的体系结构如图2.1所示。图2.1uTenux实时操作系统的体系结构Board:为uTenux所支持的处理器有ARM7、ARM9、CortexMx(x为0-4),用到的外设环境有通用输入输出端口(GPIO)、同步串口(SPI)、异步串口(UART)、存储设备(NandFlash/SD)、USB接口等。uT/Kernel:为uTenux的核心部分,主要包括了三个部分uT/OS是操作系统内核,包含了系统调用的所有API函数;uT/SM是终端函数,设备管理函数;uT/DS为调试所需要的函数,主要包括内核状态查询函数;uT/Lib:为操作系统移植相关部分,uT/CPU指的是系统的启动代码,执行CPU的初始化;uT/DEV这的是开发板上一系列外设的的初始化和配置文件;uT/TM指的是串口打印函数,这是为了开发人员方便使用而设置的。StandCLib:标准的C语言库,uTenux操作系统支持标准的C语言库。目前支持C99标准库。uT/Subass:是uTenux上的一系列中间件,介于应用程序和操作系统之间。包括GUI图形界面;FatFS文件系统;LWIP网络模块等等;IDE/ICE:分别表示uTenux所支持的开发环境,烧写工具等。3FatFS文件系统的移植3.1FAT协议介绍3.1.1FAT协议概述每个分区(卷)都是一个独立的文件系统;FAT文件系统将分区分为四个区域,保留区、FAT表区、目录区、数据区。FAT表区:FAT(FileAllocationTable)是文件分配表的简称,它是FAT文件系统最重要也是最根本的部分。文件分配表记录了一个个链表,记录了每个文件片段的直接后继的地址,从而将一个个的文件片段连接起来,形成一个完整的文件。一个FAT链表记录了一个完整的文件。为了便于对数据的管理,FAT文件系统将目录也抽象为文件,这个目录下的所有文件称为这个目录文件的内容。FAT文件系统存储文件的基本单位是簇,也就是说一个文件片段就是一个簇。簇是文件系统中数据区的概念,一个分区(卷)中簇的多少,决定了这个文件系统中文件分配表中每个一个簇链所占用的位数,根据文件分配表每一个簇项所占用的位数将文件系统分为FAT12、FAT16、FAT32三种形式,但原理基本相同。一个簇包含2的n次幂个扇区,每个扇区是512个字节或者是512的倍数。扇区是在文件系统中可以统一使用的逻辑地址。保留区:保留区位于整个卷的最前面,记录了这个文件系统的一些基本的参数,比如扇区的大小,簇的大小,文件系统的类型,FAT表是否有备份,每张FAT表的大小,目录区的大小等。目录区:如果说FAT表区是记录的每个簇的直接后继的话,那么目录区则记录了这个链表的头结点,以及一些其他的文件属性,每天记录占用32个字节。数据区:用来以簇为单位存放文件内容。一个文件是以链表的形式存放在卷中,数据区的每个簇都是这个链表一个结点的上内容。综上,保留区记录了整个文件系统基本参数,以及剩余簇的数量。FAT表区充当了一个链表的next结点。目录区记录了每一个文件和目录的基本属性,以及每个文件的开始簇号。数据区存放了每一个结点的内容。每次的文件访问,文件系统都会从目录区的第一条(根目录)开始读取,查找链表进入文件或选择指定的文件。3.1.2FAT保留区保留区位于分区(卷)的第一个扇区,同时也属于FAT文件系统基本区域的保留区。这个扇区又叫做“启动扇区”、“保留扇区”、“0扇区”。众多的说法都是一个意思,该扇区是FAT卷的第一个扇区。这个区域最重要的就是BPB(BIOSParameterBlock),FAT32的BPB内容和FAT12、FAT16的内容在BPB_Toset32区域以前完全一致,而从偏移36开始它们的内容才有所区别,这么做是为了启动扇区中存放一个完整的FAT12、FAT16或FAT32的BPB内容,以达到最好的兼容性。表3.1FAT保留区各字段含义名称偏移byte大小byte描述BS_jmpBoot03跳转指令,指向启动代码,有两种形式BS_OEMName38标志字符串,建议值为“MSWIN4.1”BPB_BytsPerSec112每个扇区的字节数,512取得最好兼容性BPB_SecPerClus131每个簇的扇区数,必须为2的n次幂,簇大小必须小于32kBPB_RsvdSecCnt142保留区中扇区的数目,FAT12/16为1,FAT32为32BPB_NumFATs161FAT表的份数。建议为2,这样就会有一个备份FAT表BPB_RootEntCnt172在此卷中总共目录的项数,乘以32必须是512的倍数BPB_TotSec16192此卷中扇区总数,若为0那么BPB_Tot32必须为非0BPB_Media211存储介质的类型,固定存储介质0xF8,移动的为0xF0BPB_FATSz16222一个FAT表所占用的扇区数,对于FAT32为0BPB_SecPerTrk242每磁道的扇区数,用于BIOS的0x13中断BPB_NumHeads262磁头数,用于BIOS的0x13中断BPB_HiddSec284在卷之前的扇区数,用于BIOS的0x13中断BPB_TotSec32324对于FAT32类型,为此卷的扇区总数结束标志151010x55结束标志251110xAA从偏移36开始FAT12/FAT16的内容开始不同于FAT32,表3.2为FAT12/FAT16的内容:表3.2FAT12/FAT16的内容名称偏移(byte)大小(byte)描述BS_DrvNum361用于BIOS中断0x13得到磁盘驱动器参数BS_Reserved1371保留——供NT使用BS_BootSig381扩展引导标记,用于指明后期的3个域可用BS_VolID394卷标序列号,此域往往由日期和时间组成,用于检测磁盘BS_VolLab4311磁盘卷标,此域必须与根目录中11字长的卷标一致BS_FilSysType548文件系统类型标记,此域为实际的字符串FAT32的内容。如下表3.3所示。表3.3FAT32的内容名称偏移(byte)大小(byte)描述BPB_FATSz32364一个FAT表所占的扇区数BPB_ExtFlags402Bit0-3:不小于0的活动FAT数目BPB_FSVer422高位为主版本号,低位为此版本号BPB_RootClus444根目录所在的第一个簇号,通常为2BPB_FSInfo482保留区中FAT32卷FSINFO结构所占扇区数,通常为1BPB_BkBootSec502保留区中引导记录的备份数据所占的扇区数,通常为1BPB_Reserved5212保留BS_DrvNum641同FAT12/16的定义BS_Reserved1651同FAT12/16的定义BS_BootSig661同FAT12/16的定义BS_VolID674同FAT12/16的定义BS_VolLab7111同FAT12/16的定义BS_FilSysType828同FAT12/16的定义,通常设为“FAT32”3.1.3FAT表区FAT表是文件系统一个重要的数据结构,每一个FAT表项绑定一个数据区的簇,即FAT表的表项数目与数据区的簇的数目相等,所以簇的数目决定了FAT表项所占的位数,如占12位则文件系统为FAT12,占16位则为FAT16,占32位则为FAT32,其中不允许出现其他的数字。顺序的第一个FAT表项对应数据区的第一个簇,第二个表项对应数据区的第二个簇……。就像每一袋鼠都有一个袋子一样,都可以用来存放自己的后继者。簇的袋子就是对应的FAT表项。FAT表项相当于链表的next结点,那么文件片段簇4的直接后继,就应该读取FAT表中的第4个表项,得到的值则为直接后继的簇号。对于特殊的表项值进行了如下定义。以FAT32为例,如表3.4所示。表3.4FAT表区各个字段的含义序号FAT表项值含义10x00000000表示本表项对应的簇为空簇,为可用簇20x00000002~0xFFFFFFEF以用簇,表示本表项对应的下一个簇的簇号30xFFFFFFF7表示本表项对应的簇为坏簇40xFFFFFFF8置于FAT表的第一个表项,作为磁盘标识符50xFFFFFFFF设置FAT表的第二个表项,表示第一个簇被占用60xFFFFFFF8~0xFFFFFFFF表示本表项对应的簇为最后一个节点从表3.4可以看出,FAT表的第一和第二表项都有默认值,作为识别使用,所以文件系统没有簇0和簇1,簇的命名是直接从簇2开始的。3.1.4FAT目录区所有链表的根源都来自于目录区,目录区存放了一条条记录,表示各个目录和文件的基本属性。每条记录占32个字节。对于FAT32,目录区和数据区没有明显的界线,数据和目录是混合在一起的,每次写数据时都是先用最小的空闲簇。每条记录的各个字段的含义如表3.5所示。表3.5目录区各个字段的含义名称偏移(byte)大小(byte)描述DIR_Name011短文件名DIR_Attr111文件属性:只读(x01)、隐藏(0x02)、系统(0x04)、卷标(0x08)、目录(0x10)、归档(0x20)、长文件名(0x0F)DIR_NTRes121保留给WindowNT使用DIR_CrtTimeTenth131文件创建时间的毫秒戳,精度为2毫秒DIR_CrtTime142文件创建时间DIR_CrtDate162文件创建日期DIR_LstAccDate182最后访问日期,只有日期DIR_FstClusHI202该目录或文件的簇号的高位字DIR_WrtTime222最后写的时间,文件被创建被认做写DIR_WrtDate242最后写的日期,文件被创建被认做写DIR_FstClusLO262该目录或文件簇号的低位字DIR_FileSize284文件大小,由32-byte双字组成3.1.5FAT数据区文件是被分割成一个个的簇大小的片段,保存在数据区的不同地方。簇是文件存储的基本单位,即使是一个只有一个字节的文件也要占用一个簇的空间。3.2FatFS文件系统的配置FatFS文件系统是高度可裁剪的,可以根据功能的需求,容量的需求,效率的需求,在ffconf.h中配置需要的功能。函数和缓冲区的配置选项有:_FS_TINY、_FS_READONLY、_FS_MINIMIZE、_USE_STRFUNC、_USE_MKFS、_USE_FORWARD、_USE_FASTSEEK。本地命名空间的配置选项有:_CODE_PAGE、_USE_LFN、_MAX_LFN、_LFN_UNICODE、_FS_RPATH。物理驱动的配置选项有:_VOLUMES、_MAX_SS、_MULTI_PARTITION、_USE_ERASE。系统配置的配置选项有:_WORD_ACCESS、_FS_REENTRANT、_FS_TIMEOUT、_SYNC_t、_FS_SHARE。_FS_TINY0:为正常模式(默认),1:为微型模式。当_FS_TINY被设置为1时,FatFs使用扇区缓冲来代替正常模式的下文件中的私有缓冲区。这样可以为每一个文件结构类型减少512个字节的空间开销。并且还会移除一些功能函数。_FS_READONLY0:可读可写(默认),1:只读。设置_FS_READONLY为1时,将会移除关于写的函数,f_write,f_sync,f_unlink,f_mkdir,f_chmod,f_rename,f_truncateanduselessf_getfree_FS_MINIMIZE可设置为0~3。0为默认值。_FS_MINIMIZE选项定义了文件系统的最小级别。通过移除一些函数,将文件系统分为四个级别。0:支持所有功能1:f_stat,f_getfree,f_unlink,f_mkdir,f_chmod,f_truncateandf_renameareremoved。2:f_opendirandf_readdirareremovedinadditionto1。3:f_lseekisremovedinadditionto2。_USE_STRFUNC0:禁止(默认)1~2:使能。通过设置_USE_STRFUNC来使能和禁止字符串函数功能。_USE_MKFS0:禁止(默认)1:使能。通过_USE_MKFS来使能f_mkfs(格式化)函数。此时_USER_MKFS需要设置为1,并且_FS_READONLY需要设置为0。_USE_FORWARD0:禁止(默认)1:使能。通过设置_USER_FORWARD来使能f_forward函数,需要设置_USER_FORWARD为1:,并且_FS_TINY设置为1_USE_FASTSEEK0:禁止(默认)1:使能。使能快速定位功能,需要设置_USE_FASTSEEK为1。_CODE_PAGE936:为简体中文,0为ASCII。这个选项精确的规定了可以使用的OEM字符集,不正确的设置将会使文件打开失败。_USE_LFN0~3可以用来设置,默认为0。_USE_LFN用来选择支持长文件名的方式。此处配置为1。0:禁止使用长文件名,_MAX_LFN和_LFN_UNICODE将不起作用。1:使能长文件名功能,使用BSS段的静态缓冲区。重入功能将不能被使用。2:使能长文件名功能,使用动态的栈缓冲区。3:使能长文件名功能,使用动态的堆缓冲区。_MAX_LFN12~255可以被设置,用来表示最大长文件名的长度。长文件名的工作缓冲区占用(_MAX_LFN+1)*2字节。如果使能了长文件名,unicode操作函数ff_convert()和ff_wtoupper()必须被添加。如果使用了是堆缓冲区,那么内存控制函数ff_memalloc()和ff_memfree()必须被添加。_LFN_UNICODE0:ANSI/OEM(默认),1:unicode。FatFsAPI要切换字符编码形式为Union时,将LEN和LFN_UNICODE为1。_FS_RPATH0~2可以被设置,默认为0。_FS_RPAH用来配置相对路径的特性。0:禁止使用相对路径,移除相关的函数。1:使能相对路径特性,可以使用f_chdirve()和f_chdir()两个函数。2:在1的基础上增加了f_getcwd()函数。注意:读取路径函数f_readdir()将会受到这个选项的影响。_VOLUMES默认为1。整个文件系统有几个逻辑驱动器(分区)。_MAX_SS512(默认)、1024、2048、4096。扇区被设置的最大字节数。在硬盘上将会一直被设置为512,但是一个大的分区可能会要求,比如在板上flash、软盘、光盘。如果_MAX_SS大于512,那么disk_ioctl中的GET_SECTOR_SIZE必须生效。_MULTI_PARTITION0:单分区,每个分区都会被绑定到一个屋里驱动号上。而且只能挂载第一个分区。1/2:使能多分区功能,每一个分区都会去试图分开在VolToPart[]中。_USE_ERASE0:禁止(默认),1:使能。使能扇区擦除功能,需要设置_USE_ERASE为1,且必须使disk_ioctl()函数中的CTRL_EARSE_SECTOR命令生效。_WORD_ACCESS0~1可以被设置,0为默认值。_WORD_ACCESS选项定义了选择哪一种存储方式在FAT分区(卷)中来处理字操作。0为字节存储,能够兼容所有的平台。1为字存储。当字节顺序为大端或者没有字对齐时,必须使用字节存储。_FS_REENTRANT0:禁止(默认),1:使能。_FS_REENTRANT选项用来配置FatFs的重入(线程安全访问)功能模块。0:禁止重入,_SYNC_t和_FS_TMEOUT失去作用。1:使能重入,用户可以提供同步操作,ff_req_grant,ff_rel_grant,ff_del_syncobj函数必须被提供。_FS_TIMEOUT设置操作最大所允许的响应时间,在_FS_TIMEOUT个滴答周期后,发送timeout信号。_SYNC_t操作系统依所依赖的关于同步操作的结构,比如有:HANDLE,OS_EVENT*,ID等等。_FS_SHARE0:禁止(默认),大于0:一个文件所允许打开的次数。使能文件共享特性,需要设置_FS_SHARE为大于等于1的数。这个值将是所允许同时打开的文件数目。3.3FatFS文件系统结构分析3.3.1FatFS模块结构FatFS文件系统由上下两层组成,上层是文件系统的核心,通过实现文件系统的操作接口实现了文件系统的FAT原理。底层是文件系统的基础,主要定义了一些底层扇区的读写、及控制函数。如图3.1所示。应用程序文件系统层文件操作功能函数(ff.c)文件操作底层接口函数(diskio.c)文件操作功能函数(ff.c)文件操作底层接口函数(diskio.c)操作系统时间管理信号量操作时间管理信号量操作STDIOGPIO UART RTC 芯片、外设及其对应的外设库STDIOGPIO UART RTC 图3.1FatFS模块结构3.3.2FatFS定义的结构体FatFS文件系统用到了基本的四个结构体类型,分别为FATFS、FIL、DIR、FILINFO。FATFS定义了文件系统的一些基本属性,主要是文件系统保留区的的信息。fs_type0表示没有挂载drv物理驱动器号csize每个簇的扇区数n_fats本文件系统共有几个fat表wflag缓冲win[]写满标识,如果为1的话必须回写fsi_flagfsinfo结构写满标识,如果为1的话必须回写id文件系统的挂载IDn_rootdir根目录下的入口个数ssize每个扇区的字节数,仅在_MAX_SS不等于512时有效_SYNC_t在多线程中实现同步操作的结构,只有在使能重入配置时才有效last_clust最后一个存储的簇号,在只读模式下无效free_clust空闲簇的数目,在文件系统中有专门的扇区来存放空闲的簇的数目,在只读模式下无效fsi_sectorfsinfo结构的扇区,在只读模式下无效cdir用来记录当前文件的起始簇号,在使能相对路径时才有效n_fatnet最大的簇号fsize一张fat表所占用的扇区数fatbasefat表区的起始扇区号dirbase目录区的起始扇区号database数据区的起始扇区号winsect当前在win[]缓冲区中存放的扇区号win[]磁盘存储窗口,微型文文件系统没有这个缓冲区FIL定义了文件的读写信息,包括读写指针的位置,当前所在簇,当前扇区,文件的大小等。fs指向自身所在的文件系统的指针id此文件系统挂载的IDflag文件状态标志padlfptr文件读写指针,0:表示文件刚打开fsize此文件的大小sclust文件的起始簇号,当文件大小为0时,起始簇号也为0clust当前所在的簇desct当前的所在扇区号dir_sect扇区包含的目录入口,只有在读写模式下才有效dir_ptr在win[]缓冲区中指向目录入口的指针,只有在读写模式下才有效cltbl指向簇链接表的指针,当文件打开时为null,只有在使能快速查找功能时才有效lockid文件锁定号(在信号量表中的索引)buf[]文件的读写缓冲区DIR目录结构体定义了目录的一些基本信息fs指向自身所在的文件系统的指针id此文件系统挂载的IDindex当前读写索引号sclust起始簇号clust当前所在簇的粗豪sect当前扇区号dir在win[]缓冲区中指向短文件名得起始地址fn指向SFN的指针,指向短文件名lfn指向长文件名得工作缓冲区,只有在使能长文件名的时候才可以使用lfn_idx最后一个匹配的长文件名索引号,0xFFFF:表示没有长文件名,只有在使能长文件名得时候才能使用FILINFO文件的属性结构体,定义了文件的基本属性,创建日期,修改日期,访问日期等等fsize文件的大小fdate文件的修改日期ftime文件的修改时间fattrib文件的基本属性fname[]短文件名lfname指向长文件名得指针lfsize记录长文件名得长度3.4SD卡接口3.4.1SD协议SD卡是基于flash的存储卡。SD卡和MMC卡的区别在于初始化的过程不同。SD卡的通信协议包括SD和SPI两类。SD卡使用卡内智能控制模块进行FALSH操作控制,包括协议、安全算法、数据存储、ECC算法、缺陷处理和分析、电源管理、时钟管理。SD卡结构如图3.2所示。SD卡Flash模块SD卡控制芯片数据输入/输出Flash模块SD卡控制芯片数据输入/输出SD总线/SPI总线接口 SD总线/SPI总线接口控制控制 图3.2SD卡接口图SD总线协议是基于命令和数据位流的方式的,有一个起始位开始,以一个停止位结束。命令——命令是开始操作的标记。命令从主机发送一个卡(寻址命令)或所有连接的卡(广播命令)。命令在CMD线上串行传送。响应——响应是从寻址卡或所有连接的卡(同步)发送给主机用来响应接受到的命令的标记。命令在CMD线上串行传送。响应标记(token)根据内容不同具有四种格式,标记长度。长度为48位或136位。数据块的CRC算法采用16位的CCITT多项式。数据——数据可以通过数据线在卡和主机间双向传送。3.4.2SD命令SD卡的命令长度为48位,命令格式如下表3.6所示。表3.6命令结构01bit5….bit0bit31…bit0bit6…bit01起始位Host命令编号参数CRC7结束位SD卡命令集分为基本命令、读块命令、写块命令、擦除命令、写保护命令、锁命令、应用命令7类,每个类支持一个卡功能集合操作。用的命令如表3.7所示。表3.7常用的SD卡命令命令索引类型参数响应缩写描述CMD0bc--GO_IDLE_STATE重置所有卡到空闲状态CMD8bcr[31:12]保留[11:8]电压[7:0]模式R7SEND_IF_COND发送SD卡的接口环境ACMD41bcr[31:1]OCRR3SD_APP_OP_COND请求条件寄存器OCRCMD2bcr[31:0]数据位R2ALL_SEND_CID请求标识寄存器CIDCMD3bcr[31:0]数据位R6SENG_ELATIVE_ADDR要求提供新的地址RCACMD7ac[31:16]RCA[15:0]数据位R1bSELEC/DESELECT_CARD选择或者取消卡3.5FatFS文件系统的移植FatFS文件系统具有很好的移植性和层次性,能够在所有的支持C标准系统下运行。目前FatFS在微控制器领域广泛应用,相关的资源比较多。本节讨论FatFS文件系统在uTenux上移植和一些注意事项。导体(ST)的STM32f407ZG,SD卡选择的为MicroSD卡,容量为2G。把FatFS编译进uTenux内核,然后通过J-Link烧写到开发板SRAM中,复位加载内核。本次移植工作采用的是宿主机+目标板的开发模式。宿主机为PC+Win7,目标板为意法半FatFs具备清晰的层次结构,这种层次结构使得文件系统与硬件相关的部分都包含在diskio.c中,即只需要按照disk.h编写出对应的disk.c即可使文件系统运行起来。3.5.1开发环境uT/Stdio本次移植工作是在uT/Studio[1]V3.1上进行开发编译的。在微控制器的开发过程中,大学生和小企业因为成本原因,不能购买商业软件,这时可以使用悠龙软件的开源免费的开发环境工具-uT/Studio工具链,其中包含了Eclipse集成开发环境、ARM公司针对微控制器优化的GNU编译器及其二进制工具集、MSYS最小POSIX系统工具集。推荐使用的仿真器是J-LinkICEV8,其中包括了FlashROM的烧写工具和在线调试工具等。下载相关代码:(1)从http://www.uloong.cc/cn/develop/tenux.htm下载uT/StudioV3.1安装包,并参照软件包中的uT-Studio_V3.0.00_C\uT-Studio_Edition\manual手册进行uT/Studio安装。(2)从http://www.uloong.cc/cn/index.htm下载uTenuxV1.500R160源代码。(3)从/fsw/ff/00index_e.html下载FatFsR0.09源代码。(4)从意法半导体(ST)官网下载SD卡库。3.5.2构建移植环境将uTenuxV1.5工程导入uT/Studio中,建立相关目录,如表3.8所示。表3.8新建目录和文件序号目录子目录子目录子目录说明1include2sbs3midfatfsFatfs、sd卡头文件4subass5midfatfs6build7app_stm32f4makefile8src源文件9diskio.c新建文件1.将FatFs源代码和SD卡库中的.h文件复制到include/sbs/midfatfs目录下。将FatFs源代码和SD卡库中的.c文件复制到include/sbs/midfatfs目录下。2.修改数据类型:为了使整个工程都遵循C99标准,需要修改添加进来的程序文件,并将之前的类型定义文件integer.h删除,修改规则如表3.9所示。注意:(1)将所有源数据类型替换为对应的目标数据类型,注意不要将注释或字符串替换。(2)将#include”integer.h”替换为#include”ts_basic.h”;将#include<stdio.h>替换为#include”ts_basic.h”;将option\*.c中#incliude“../ff.h”替换为#include“ff.h”。(3)将sdcard.c中bool类型的声明删除。(4)将integer.h文件删除。需要修改的文件有\include\sbs\midfatfs\*.h,\subass\midfatfs\src\*.c,\subass\midfatfs\src\option\*.c。表3.9数据类型转换标准序号类型1(源)类型2(源)类型3(源)C99类型(目标)1intINT-int32_t2unsignedintUINT-uint32_t3charCHAR-int8_t4unsignedcharUCHARBYTEuint8_t5shortSHORT-int16_t6unsignedshortUSHORT-uint16_t7unsignedshortWORDWCHARuint16_t8longLONG-int32_t9unsignedlongULLONGDWORDuint32_t10BOOL--Bool11FALSE--false12TRUE--true修改宏和条件编修改编译条件使得能将FatFs编译到内核中,用到了makefile的语法的基本知识,由于冗长此处略写,可以参照FatFs移植文档。3.5.3初始化diskio_initialize函数用来初始化/识别指定的存储设备,识别成功才能执行后续操作,假如识别失败,则报错自动退出。通过传进来的参数判断此时要初始化的磁盘物理驱动号,此参数用于多分区,或者存储设备比较多时,假如为单分区,这个参数默认为0,多分区时多见于用switch语句进行选择,此处用if语句进行判断。选择了指定的驱动器号0,然后就是执行对SD卡的识别和初始化操作,读取相关的信息。代码如下:/**FunctionName:disk_initialize*CreateDate:2013/05/08*Author:Houlw*Description:diskinitialize*Param :uint8_tdrv:Physicaldrivenmuber(0..)*ReturnCode:DRESULT*/DSTATUSdisk_initialize(uint8_tdrv){/*Physicaldrivenmuber(0..)*/SD_ErrorStatus;if(drv==0){Status=SD_Init();if(Status!=SD_OK){returnSTA_NOINIT;}else{Status=SD_GetCardInfo(&SDCardInfo);if(Status!=SD_OK){returnSTA_NOINIT;//RES_NOTRDY;}Status=SD_SelectDeselect((u32)(SDCardInfo.RCA<<16));if(Status!=SD_OK){returnSTA_NOINIT;}switch(SD_Mode){case0:/*dmamode*/Status=SD_EnableWideBusOperation(SDIO_BusWide_1b);if(Status!=SD_OK){returnRES_NOTRDY;}Status=SD_SetDeviceMode(SD_DMA_MODE);if(Status!=SD_OK){returnRES_NOTRDY;}break;case1:Status=SD_EnableWideBusOperation(SDIO_BusWide_1b);if(Status!=SD_OK){returnRES_NOTRDY;}Status=SD_SetDeviceMode(SD_INTERRUPT_MODE);if(Status!=SD_OK){returnRES_NOTRDY;}break;default:returnRES_NOTRDY;}return0;}}else{returnSTA_NOINIT;}}3.5.4读写函数读写函数向磁盘中读出或写入数据,供上层函数调用。读写通过SD卡命令,来操作SD卡。有四个参数,依次为磁盘驱动号、读写缓冲区、起始扇区号、读写的扇区个数。读一个扇区,则:Status=SD_ReadBlock(sector<<9,(u32*)(&buff[0]),BlockSize);读多个代码则:Status=SD_ReadMultiBlocks(sector<<9,(u32*)(&buff[0]),BlockSize,count);写一个扇区,则:Status=SD_WriteBlock(sector<<9,(u32*)(&buff[0]),BlockSize);写多个扇区,则:Status=SD_WriteMultiBlocks(sector<<9,(u32*)(&buff[0]),BlockSize,count);4移植结果的测试可以通过单元测试来检测与文件系统相关的各个外设模块、寄存器、变量值的正确性。通过集成测试来测试文件系统的各个功能函数使用的正确性,由于篇幅所限这里只列出部分测试代码。本次测试主要针对的是文件系统的可用性,主要证明移植的正确性。测试的功能为输出SD卡中根目录下存在的文件,并输出每个文件的前一部分内容。SD卡中有3个文件:文件名为filename1,filename2,filename3。文件内容依次为1.2.3…..,a.b.c.d…..,A.B.C.D….主要代码如下:ercd=disk_initialize(0);if(ercd!=RES_OK){tm_putstring((UB*)"diskinitializeerror.\n");return;}else{tm_putstring((UB*)"diskinitializesuccess.\n");}ercd=f_mount(0,&fs);if(ercd!=RES_OK){tm_putstring((UB*)"FileMountreturn;}else{tm_putstring((UB*)"FileMount}if(f_opendir(&dirs,path)==FR_OK){while(f_readdir(&dirs,&finfo)==FR_OK){if(finfo.fattrib&AM_ARC){if(!finfo.fname[0]){break;}tm_putstring((UB*)"filename:");tm_putstring((UB*)finfo.fname);tm_putstring((UB*)"\n");#if_USE_LFNtm_putstring((UB*)"Longfilename:");tm_putstring((UB*)finfo.lfname);tm_putstring((UB*)"\n");#endifres=f_open(&fsrc,finfo.fname,FA_OPEN_EXISTING|FA_READ);br=1;a=0;tm_putstring((UB*)"Filetext:");for(a=0;a<512;a++){buffer[a]=0;}res=f_read(&fsrc,buffer,sizeof(buffer),&br);tm_putstring((UB*)buffer);tm_putstring((UB*)"\n");if(res||br==0){/*errororeof*/break;}f_close(&fsrc);}}}串口信息输出如下图4.1:图4.1串口输出信息5总结与展望文件系统作为操作系统的重要组成部分,决定了操作系统本身信息和用户数据在存储设备上的组织形式。随着嵌入式系统的发展,越来越多的嵌入式系统需要处理大量的数据,所以文件系统将是嵌入式系统应用的一个必然趋势。由于嵌入式存储设备的特殊性、电源供给的不稳定性和移动存储的安全性等要求,嵌入式系统的重要性在嵌入式系统中愈加明显。本论文基于SD卡实现了文件系统的基本操作,比如文件和目录的基本操作,以及格式化等基本的SD卡操作,对系统的性能的提高有很大的作用。第一次实现FatFs在uTenux上的移植。本论文在研究FAT文件系统规范的基础上,在嵌入式uTenux上移植了FatFs文件系统,具有可读写,占用资源少,启动速度快等优良特点。实际应用中还需要注意一些地方,增加文件系统多线程访问和互斥访问机制,增加时间管理等功能,以适应嵌入式操作系统对文件系统功能要求的增强。

参考文献[1]刘波文.ARMCortex–M3应用开发实例详解[M].北京:电子工业出版社,2011[6]孟博宇.STM32自学笔记[M].北京:北京航空航天大学出版社,2012[2]魏忠,蔡勇,雷红卫.嵌入式开发详解[M].北京:电子工业出版社,2003[3]王田苗.嵌入式系统设计与实例分析[M].北京:清华大学出版社,2003[4]张继柯,谷青范.基于Flash的嵌入式文件系统设计与实现[J].工业控制计算机,2011,24(4):84-86.[5]李世奇,董浩斌.基于FatFs文件系统的SD卡存储器设计[J].测控技术.2011,30(12):70-81.[6]林建民.嵌入式操作系统发展趋势[J].计算机工程.2001,7(10):1-4[7]WolfW.Cybel-physicalsystems[J].IEEEComputer.2009,42(3):88-89[8]RosenblumM.TheDesignandImplementationofaLogStructuredFileSystem[J].TransactionsonComputerSystems.1992,10(8):25-30[9]毛永强.基于日志结构的嵌入式文件系统研究与应用[D].华中师范大学,2006[10]高永占,周洪利.基于SD卡的嵌入式文件系统的设计与实现[D].北京交通大学,2010[11]ChaN.ELM-FATFileSyatemModule[EB/OL]./fsw/ff/ooindex_e.html[12]uTenux源代码.http://www.uloong.cc/cn/index.htm[13]uT/Stdio安装包.http://www.uloong.cc/cn/develop/tenux.htm[14]SD卡接口规范[S].V2.0[15]FAT规范[S].MicrosoftExtensibleFirmwareInitiativeFAT32FileSystemSpecificationVersion1.03MicrosoftCorporation

致谢在攻读学士学位,特别是完成论文期间,很多人在多方面为我提供帮助和支持,值此论文结束之际,一并向他们表示真诚的感谢。首先,我衷心的感谢我的导师刘春贵,是他为我提供了学习,研究的机会和工作平台。在整个学习过程中,刘老师不仅从学术上、还是为人处世、个人发展及生活等方面给予我极大的关怀和支持。他渊博的知识、严谨的治学态度、精益求精的工作作风给我留下了深刻的印象,是我终生尊敬的师长、学习的榜样。其次,我要深深的感谢大连悠龙公司的王绍斌,王晓东等老师,他们无私的知道也使我终生受益,与他们的探讨和交流,给了我很多启发,使我受益非浅,感悟颇深。最后,衷心地感谢为我评阅论文而付出辛勤劳动的老师和学者们。

FatFsFileSystemMigrationBasedonuTenuxOperatingSystem Abstract:Withthedevelopmentofembeddedtechnology,especiallytheARMtechnologyconstantlyupdated,launchedthecortexserieschip,makingthegrowingcapabilitiesofembeddeddevices,andgraduallytransitiontotheeraofthesingle-chipmicrocontrollerera,haveaccesstothedatavolumeasignificantincrease,whichrequiresdatamanipulationlevelofclarity,improvedtransparency,maintainability,standardizationofinterfaces,portable,flexibleoperationanddatastoragereliabilityandsoputforwardhigherrequirements,soitisnecessarytointroducefilesystemtocompletethedatastorageandmanagementcapabilities,providinguserswithaccesstodatabyname,theinterface,thusavoidingtheapplicationdevelopersdirectaccessmemorybroughtinsecurity.ThisthesisisbasedonuTenuxoperatingsystemmigrationFatFSfilesystems,filesystemsarediscussedindetailtheimplementationoftheprinciple,bytransplantingsoFatFSinuTenuxoperatingsystems.Implementationfilesanddirectoriestocreate,open,read,write,close,etc.Keywords:microcontrollers;uTenux;FatFS;ARM基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的粗光栅位移测量系统研究单片机控制的后备式方波UPS提升高职学生单片机应用能力的探究基于单片机控制的自动低频减载装置研究基于单片机控制的水下焊接电源的研究基于单片机的多通道数据采集系统基于uPSD3234单片机的氚表面污染测量仪的研制基于单片机的红外测油仪的研究96系列单片机仿真器研究与设计基于单片机的单晶金刚石刀具刃磨设备的数控改造基于单片机的温度智能控制系统的设计与实现基于MSP430单片机的电梯门机控制器的研制基于单片机的气体测漏仪的研究基于三菱M16C/6N系列单片机的CAN/USB协议转换器基于单片机和DSP的变压器油色谱在线监测技术研究基于单片机的膛壁温度报警系统设计基于AVR单片机的低压无功补偿控制器的设计基于单片机船舶电力推进电机监测系统基于单片机网络的振动信号的采集系统基于单片机的大容量数据存储技术的应用研究基于单片机的叠图机研究与教学方法实践基于单片机嵌入式Web服务器技术的研究及实现基于AT89S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论