1、精品基于uTenux的fatfs文件系统移植本科毕业论文本科毕业论文(设计) 题目: 基于uTenux操作系统的 FatFs文件系统移植 学院: 数学与计算机科学学院 完成日期: 2013 年 6 月 2 日基于uTenux操作系统的 FatFs文件系统移植摘要:随着嵌入式技术的发展,尤其是ARM技术的不断更新,推出了cortex系列芯片,使得嵌入式设备的功能日益壮大,逐渐由单片机的时代过渡到微控制器的时代,对数据的访问量有了显著提高,这就要求数据操作层次清晰、透明度提高、可维护性、接口的标准化、移植性、灵活的操作和数据存储的可靠性等都提出了越来越高的要求,所以有必要引入文件系统来完成数据存储
2、和管理的功能,为用户提供按名存取数据的接口,从而可以避免由程序开发人员直接访问内存所带来的不安全性。本论文基于uTenux操作系统移植FatFS文件系统,详细论述了文件系统的实现原理,通过移植使得FatFS能在uTenux操作系统上运行。实现文件和目录创建、打开、读取、写入、关闭等功能。关键字:微控制器;uTenux;FatFS;ARM目录1 绪论 11.1 实时操作系统简介 11.1.1 实时操作系统的概念 11.1.2 常见的实时微控制器操作系统及其对比 11.2 嵌入式文件系统简介 21.2.1 文件系统概述 21.2.2 嵌入式文件系统一般体系结构 31.2.3 文件系统概述 41.3
3、 嵌入式文件系统的必要性 52 uTenux实时操作系统 63 FatFS文件系统的移植 73.1 FAT协议介绍 73.1.1 FAT协议概述 73.1.2 FAT 保留区 83.1.3 FAT表区 103.1.4 FAT目录区 103.1.5 FAT数据区 113.2 FatFS文件系统的配置 113.3 FatFS文件系统结构分析 143.3.1 FatFS模块结构 143.3.2 FatFS定义的结构体 153.4 SD卡接口 173.4.1 SD协议 173.4.2 SD命令 183.5 FatFS文件系统的移植 193.5.1 开发环境uT/Stdio 193.5.2 构建移植环境
4、 203.5.3 初始化 213.5.4 读写函数 234 移植结果的测试 245 总结与展望 26参考文献 28致谢 291 绪论1.1 实时操作系统简介1.1.1 实时操作系统的概念实时操作系统(Real-time Operation System,RTOS):系统能够及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致的运行的嵌入式操作系统。在工业控制、航空航天、实时检测等流程控制要求非常精确的领域,必须要在指定的时间内做出指定的响应,这时就需要实时操作系统来控制。我们常常说的嵌入式操作系统都是嵌入式实时操作系统,比如uTenux、uC/OS-II。1.1
5、.2 常见的实时微控制器操作系统及其对比1. uTenux微控制器操作系统uTenux是一款优秀的开源免费的实时微控制器操作系统,是由大连悠龙软件科技有限公司开发与维护。Tenux是由T-Engine Linux 的缩写构成,Tenux具有(a)T-Engine的开源高实时性内核T-Kernel为内核;(b)Linux上丰富的开源中间件为中间件;(c)Eclipse+GNU开源开发工具为基础工具;(d)打造适合中国电子产品市场的开源嵌入式实时操作系统及方便的集成开发环境。uTenux适用于微控制器(Cortex M/ARM 7,ROM:大于64K),它的内核是uT-Kernel,具有丰富紧凑的
6、中间件,比如FATFS、LWIP、FLTK。适用产品:小型物联网控制终端,比如机器人、智能仪表、小型数控机床、PLC、相机等。它的特点有:(1) 所有源码公开、完全免费(2) 占有日本60%市场的成熟实时微内核 (3) 支持函数和软中断两种方式(4) 抢占式实时多任务操作系统(5) 不需要MMU,占用ROM/RAM少(6) 可以支持所有32位ARM7/9和Cortex M系列的微控制器(7) 可配置任意多个任务、任务的优先级最多255个2. uCOS微控制器操作系统uC/OS II (Micro Control Operation System Two)是一个可以基于ROM运行的、可裁减的、抢
7、占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。为了提供最好的移植性能,uC/OS II最大程度上使用ANSI C语言进行开发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU (包括DSP)。uC/OS II可以简单的视为一个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。内核属于抢占式,最多可以管理60个任务。从1992年开始,由于高度可靠性、鲁棒性和安全
8、性,uC/OS II已经广泛使用在从照相机到航空电子产品的各种应用中。3. uTenux和ucos的对比(1) uTenux有固定和可变尺寸内存池管理;ucos只有固定尺寸内存池。(2) uTenux的邮箱支持消息队列和任务等待队列,因此发送多个消息都可以;ucos的邮箱只能发送一条消息,很简单。(3) uTenux中有专门定义中断处理程序的系统调用-tk_def_int,很方便,而ucos中就没有。(4) uTenux有Trace、Hook等调试功能,而ucosii没有。(5) uTenux的任务堆栈等需要内存的地方,可以由系统自动分配也可以开发人员手工分配;但ucos只能手工分配。(6)
9、uTenux的任务、信号量等系统对象采用ID方式实现,用户看不到内部的数据结构,对于安全性比较好,使用也方便;而ucos是用户定义每个系统对象的变量。(7) uTenux的任务间通信机制比ucos多了好几种,比如集合点端口等,而且每个通信机制都支持任务队列和消息队列。(8) uTenux V1.5的易用性没有ucos的强,幸好uTenux已经意识到自己的问题,向ucos的易用性学习,在模仿中超越对手。(9) uTenux 终身开源免费,无论是学习、商用、修改再发布,而ucos只有学习时是开源免费的,商用必须付费。综上所述,学习uTenux的意义大于ucos。1.2 嵌入式文件系统简介1.2.1
10、 文件系统概述文件系统是操作系统的重要组成部分,用于控制对数据、文件及设备的存储2。它提供对文件和目录的分层组织形式、数据缓冲以及对文件的存储权限的控制。文件系统必须提供必要的用来创建、删除文件、读文件和写文件等相应的系统调用。文件的存储通过目录完成,所以对目录的操作是文件系统功能的一部分,文件系统应具有以下功能:提供对文件和目录的分层组织形式;建立与删除文件的能力;文件的动态增长和数据保护。硬盘的出现推动了针对桌面操作系统的文件系统的发展,同样,嵌入式存储设备特别是flash的出现,也推动了嵌入式文件系统的发展。1.2.2 嵌入式文件系统一般体系结构在嵌入式文件系统中,嵌入式系统可以针对特殊
11、的目的定制,特别是随着ASOS(为应用定制的嵌入式操作系统)的发展,对嵌入式操作系统的系统功能完整性和可伸缩性提出了更高的要求。所以不得不采取一种灵活的系统体系结构,对于操作系统来说,文件系统是一个独立的子包含的整体,可以灵活的加载和卸载,这一切操作对操作系统内核的功能没有任何影响。嵌入式文件系统系统体系结构从上到下一般有3层,如图1.1所示。图1.1 嵌入式操作系统体系结构最上一层是文件系统的核心,使文件系统实现的核心算法,提供了用户可见的所有API函数,以供用户操作数据,这一层是文件系统功能的集合。第二层是高速缓冲管理,高速缓冲区的大小直接关系到文件系统的处理效率,高效的缓冲区处理算法能大
12、幅提高数据的处理效率;同时它为文件系统提供了与硬件无关的接口,为文件系统的层次性提供了基础。最下面一层是设备驱动程序,涉及到具体的硬件。设备驱动程序的另一个重要任务就是提供统一设备驱动接口。文件系统和操作系统内核的关系主要体现在三方面:实时时钟、信号量和中断管理。用时钟实现外设任务的等待延时;用信号量实现外设的同步和互斥;用中断管理机制管理外设的中断处理程序。1.2.3 文件系统概述目前,嵌入式文件系统解决方案比较多,由于嵌入式设备的多样性,相应文件系统的实现也有针对各种设备的,如只读存储器、可读存储器、Flash存储器等。嵌入式文件系统也是要针对嵌入式操作系统的。1. FatFSFatFS是
13、一个开源免费通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统。FatFs 的编写遵循ANSI C,因此不依赖于硬件平台。它可以嵌入到便宜的微控制器中,如8051、PIC、AVR、SH、Z80、H8、ARM等等。它是window兼容的FAT文件系统,平台依赖性小,易于移植,代码和工作区占用非常小,有多种配置选项。通过配置FatFS可以使得FatFS占用的RAM达到44字节,代码空间的占用可以小到2K-4K,在这样小的空间中它还能支持FAT32,这是以文件的写功能的限制为代价的。 FatFS是标准FAT文件系统的小型嵌入式文件系统,它是一个自由软件,可以用于教育、研究、商业。在使用过程
14、中不用担心被限制。用户可以修改,重新发布以个人的身份。但是必须在源代码中包含这个版权申明。文件分配表FAT(File Allocation Table)用来跟踪硬盘上每个文件的数据库,而FAT表存储关于簇的信息。FAT表示microsoft在FAT文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。FAT分区格式是microsoft最早支持的分区格式,依据FAT表中的每个簇链的所占位数分为FAT12、FAT16、FAT32三种形式,但其基本存
15、储方式是相似的。如图1.2所示。图1.2 FatFs模块结构2. uC/FSuC/FS是uCOS的文件系统,它是由Micrium公司新开发的一个产品,主要应用在使用uCOS内核的嵌入式系统中。uC/FS是一个用于能提供基础访问功能的FAT格式的文件系统,是一个高效率的库,为高速、多功能及内存使用进行优化。它用ANSI C编写,由不同的层次结构组成,包括API层、文件系统层、逻辑区块层、设备驱动和硬件层。总之,在上述的嵌入式文件系统中,FatFS和uC/FS都用于小容量闪存设备,功能都比较齐全。但是uC/FS是属于拥有知识产权的技术,是商业产品,而FatFS则完全是开源免费的,用户可以随时下载所
16、有全代码,更改和再发布。随着NAND FAlsh作为嵌入式系统中大容量存储介质的普及应用,FatFS文件系统作为开源代码的项目,得到芯片产商,项目开发人员的一致好评。所以在本项目中选择FatFS作为目标文件系统。1.3 嵌入式文件系统的必要性嵌入式系统过去主要用于工业控制领域,对效率的比较高,对于数据处理不够重视,引入文件系统不但没有必要而且会降低效率,所以很多嵌入式系统应用都没有加载操作系统。随着嵌入式处理器性能的不断升级,嵌入式系统的功能不断加强,用户的需求也和功能复杂度的增加,许多嵌入式系统都面临着处理大量数据的问题;另外对于应用程序开发人员直接访问内存具有很大的风险性,需要对内存的访问
17、进行封装。综上所述在嵌入式操作系统内核和应用程序之间加一个文件系统成为必然趋势。2 uTenux实时操作系统uTenux实时操作系统的体系结构如图2.1所示。图2.1 uTenux实时操作系统的体系结构Board:为uTenux所支持的处理器有ARM7、ARM9、CortexMx(x为0-4),用到的外设环境有通用输入输出端口(GPIO)、同步串口(SPI)、异步串口(UART)、存储设备(NandFlash/SD)、USB接口等。uT/Kernel:为uTenux的核心部分,主要包括了三个部分uT/OS是操作系统内核,包含了系统调用的所有API函数;uT/SM是终端函数,设备管理函数;uT/
18、DS为调试所需要的函数,主要包括内核状态查询函数;uT/Lib:为操作系统移植相关部分,uT/CPU指的是系统的启动代码,执行CPU的初始化;uT/DEV这的是开发板上一系列外设的的初始化和配置文件;uT/TM指的是串口打印函数,这是为了开发人员方便使用而设置的。Stand C Lib:标准的C语言库,uTenux操作系统支持标准的C语言库。目前支持C99标准库。uT/Subass:是uTenux上的一系列中间件,介于应用程序和操作系统之间。包括GUI图形界面;FatFS文件系统;LWIP网络模块等等;IDE/ICE:分别表示uTenux所支持的开发环境,烧写工具等。3 FatFS文件系统的移
19、植3.1 FAT协议介绍3.1.1 FAT协议概述每个分区(卷)都是一个独立的文件系统;FAT文件系统将分区分为四个区域,保留区、FAT表区、目录区、数据区。FAT表区:FAT(File Allocation Table)是文件分配表的简称,它是FAT文件系统最重要也是最根本的部分。文件分配表记录了一个个链表,记录了每个文件片段的直接后继的地址,从而将一个个的文件片段连接起来,形成一个完整的文件。一个FAT链表记录了一个完整的文件。为了便于对数据的管理,FAT文件系统将目录也抽象为文件,这个目录下的所有文件称为这个目录文件的内容。FAT文件系统存储文件的基本单位是簇,也就是说一个文件片段就是一
20、个簇。簇是文件系统中数据区的概念,一个分区(卷)中簇的多少,决定了这个文件系统中文件分配表中每个一个簇链所占用的位数,根据文件分配表每一个簇项所占用的位数将文件系统分为FAT12、FAT16、FAT32三种形式,但原理基本相同。一个簇包含2的n次幂个扇区,每个扇区是512个字节或者是512的倍数。扇区是在文件系统中可以统一使用的逻辑地址。保留区:保留区位于整个卷的最前面,记录了这个文件系统的一些基本的参数,比如扇区的大小,簇的大小,文件系统的类型,FAT表是否有备份,每张FAT表的大小,目录区的大小等。目录区:如果说FAT表区是记录的每个簇的直接后继的话,那么目录区则记录了这个链表的头结点,以
21、及一些其他的文件属性,每天记录占用32个字节。数据区:用来以簇为单位存放文件内容。一个文件是以链表的形式存放在卷中,数据区的每个簇都是这个链表一个结点的上内容。综上,保留区记录了整个文件系统基本参数,以及剩余簇的数量。FAT表区充当了一个链表的next结点。目录区记录了每一个文件和目录的基本属性,以及每个文件的开始簇号。数据区存放了每一个结点的内容。每次的文件访问,文件系统都会从目录区的第一条(根目录)开始读取,查找链表进入文件或选择指定的文件。3.1.2 FAT 保留区保留区位于分区(卷)的第一个扇区,同时也属于FAT文件系统基本区域的保留区。这个扇区又叫做“启动扇区”、“保留扇区”、“0扇
22、区”。众多的说法都是一个意思,该扇区是FAT卷的第一个扇区。这个区域最重要的就是BPB(BIOS Parameter Block),FAT32的BPB内容和FAT12、FAT16的内容在BPB_Toset32区域以前完全一致,而从偏移36开始它们的内容才有所区别,这么做是为了启动扇区中存放一个完整的FAT12、FAT16或FAT32的BPB内容,以达到最好的兼容性。表3.1 FAT保留区各字段含义名称偏移byte大小byte描述BS_jmpBoot03跳转指令,指向启动代码,有两种形式BS_OEMName38标志字符串,建议值为“MSWIN4.1”BPB_BytsPerSec112每个扇区的字
23、节数,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表所占用的扇区数,对于FAT3
24、2为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.2 FAT12/FAT16的内容名称偏移 (byte)大小(byte)描述BS_DrvNum361用于BIOS中断0x13得到磁盘驱动器参数BS_Reser
25、ved1371保留供NT使用BS_BootSig381扩展引导标记,用于指明后期的3个域可用BS_VolID394卷标序列号,此域往往由日期和时间组成,用于检测磁盘BS_VolLab4311磁盘卷标,此域必须与根目录中11字长的卷标一致BS_FilSysType548文件系统类型标记,此域为实际的字符串FAT32的内容。如下表3.3所示。表3.3 FAT32的内容名称偏移 (byte)大小(byte)描述BPB_FATSz32364一个FAT表所占的扇区数BPB_ExtFlags402Bit0-3:不小于0的活动FAT数目BPB_FSVer422高位为主版本号,低位为此版本号BPB_RootC
26、lus444根目录所在的第一个簇号,通常为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.3 FAT表区FAT表
27、是文件系统一个重要的数据结构,每一个FAT表项绑定一个数据区的簇,即FAT表的表项数目与数据区的簇的数目相等,所以簇的数目决定了FAT表项所占的位数,如占12位则文件系统为FAT12,占16位则为FAT16,占32位则为FAT32,其中不允许出现其他的数字。顺序的第一个FAT表项对应数据区的第一个簇,第二个表项对应数据区的第二个簇。就像每一袋鼠都有一个袋子一样,都可以用来存放自己的后继者。簇的袋子就是对应的FAT表项。FAT表项相当于链表的next结点,那么文件片段簇4的直接后继,就应该读取FAT表中的第4个表项,得到的值则为直接后继的簇号。对于特殊的表项值进行了如下定义。以FAT32为例,如
28、表3.4所示。表3.4 FAT表区各个字段的含义序号FAT表项值含义10x0000 0000表示本表项对应的簇为空簇,为可用簇20x0000 00020xFFFF FFEF以用簇,表示本表项对应的下一个簇的簇号30xFFFF FFF7表示本表项对应的簇为坏簇40xFFFF FFF8置于FAT表的第一个表项,作为磁盘标识符50xFFFF FFFF设置FAT表的第二个表项,表示第一个簇被占用60xFFFF FFF80xFFFF FFFF表示本表项对应的簇为最后一个节点从表3.4可以看出,FAT表的第一和第二表项都有默认值,作为识别使用,所以文件系统没有簇0和簇1,簇的命名是直接从簇2开始的。3.1
29、.4 FAT目录区所有链表的根源都来自于目录区,目录区存放了一条条记录,表示各个目录和文件的基本属性。每条记录占32个字节。对于FAT32,目录区和数据区没有明显的界线,数据和目录是混合在一起的,每次写数据时都是先用最小的空闲簇。每条记录的各个字段的含义如表3.5所示。表3.5 目录区各个字段的含义名称偏移 (byte)大小(byte)描述DIR_Name011短文件名DIR_Attr111文件属性:只读(x01)、隐藏 (0x02)、系统(0x04)、卷标(0x08)、 目录(0x10)、归档(0x20)、长文件名(0x0F)DIR_NTRes121保留给Window NT使用DIR_Crt
30、TimeTenth131文件创建时间的毫秒戳,精度为2毫秒DIR_CrtTime142文件创建时间DIR_CrtDate162文件创建日期DIR_LstAccDate182最后访问日期,只有日期DIR_FstClusHI202该目录或文件的簇号的高位字DIR_WrtTime222最后写的时间,文件被创建被认做写DIR_WrtDate242最后写的日期,文件被创建被认做写DIR_FstClusLO262该目录或文件簇号的低位字DIR_FileSize284文件大小,由32-byte双字组成3.1.5 FAT数据区文件是被分割成一个个的簇大小的片段,保存在数据区的不同地方。簇是文件存储的基本单位,即使是一个只有一个字节的文件也要占用一个簇的空间。3.2 FatFS文件系统的配置FatFS文件系统是高度可裁剪的,可以根据功能的需求,容量的需求,效率的需求,在ffconf.h中配置需要的功能。函数和缓冲区的配置选项有:_FS_TINY、_FS_READONLY、_FS_MINIMIZE、_USE_STRFUNC、_USE_MKFS、_USE_FORWARD、_USE_FASTSEEK。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1