收藏 分销(赏)

基于utenux的fatfs文件系统移植学位论文.doc

上传人:鼓*** 文档编号:9896920 上传时间:2025-04-12 格式:DOC 页数:33 大小:753.50KB
下载 相关 举报
基于utenux的fatfs文件系统移植学位论文.doc_第1页
第1页 / 共33页
基于utenux的fatfs文件系统移植学位论文.doc_第2页
第2页 / 共33页
点击查看更多>>
资源描述
本科毕业论文(设计) 题目: 基于uTenux操作系统的 FatFs文件系统移植 学院: 数学与计算机科学学院 完成日期: 2013 年 6 月 2 日 基于uTenux操作系统的 FatFs文件系统移植 摘要:随着嵌入式技术的发展,尤其是ARM技术的不断更新,推出了cortex系列芯片,使得嵌入式设备的功能日益壮大,逐渐由单片机的时代过渡到微控制器的时代,对数据的访问量有了显著提高,这就要求数据操作层次清晰、透明度提高、可维护性、接口的标准化、移植性、灵活的操作和数据存储的可靠性等都提出了越来越高的要求,所以有必要引入文件系统来完成数据存储和管理的功能,为用户提供按名存取数据的接口,从而可以避免由程序开发人员直接访问内存所带来的不安全性。本论文基于uTenux操作系统移植FatFS文件系统,详细论述了文件系统的实现原理,通过移植使得FatFS能在uTenux操作系统上运行。实现文件和目录创建、打开、读取、写入、关闭等功能。 关键字:微控制器;uTenux;FatFS;ARM 目录 1 绪论 1 1.1 实时操作系统简介 1 1.1.1 实时操作系统的概念 1 1.1.2 常见的实时微控制器操作系统及其对比 1 1.2 嵌入式文件系统简介 2 1.2.1 文件系统概述 2 1.2.2 嵌入式文件系统一般体系结构 3 1.2.3 文件系统概述 4 1.3 嵌入式文件系统的必要性 5 2 uTenux实时操作系统 6 3 FatFS文件系统的移植 7 3.1 FAT协议介绍 7 3.1.1 FAT协议概述 7 3.1.2 FAT 保留区 8 3.1.3 FAT表区 10 3.1.4 FAT目录区 10 3.1.5 FAT数据区 11 3.2 FatFS文件系统的配置 11 3.3 FatFS文件系统结构分析 14 3.3.1 FatFS模块结构 14 3.3.2 FatFS定义的结构体 15 3.4 SD卡接口 17 3.4.1 SD协议 17 3.4.2 SD命令 18 3.5 FatFS文件系统的移植 19 3.5.1 开发环境uT/Stdio 19 3.5.2 构建移植环境 20 3.5.3 初始化 21 3.5.4 读写函数 23 4 移植结果的测试 24 5 总结与展望 26 参考文献 28 致谢 29 1 绪论 1.1 实时操作系统简介 1.1.1 实时操作系统的概念 实时操作系统(Real-time Operation System,RTOS):系统能够及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致的运行的嵌入式操作系统。 在工业控制、航空航天、实时检测等流程控制要求非常精确的领域,必须要在指定的时间内做出指定的响应,这时就需要实时操作系统来控制。我们常常说的嵌入式操作系统都是嵌入式实时操作系统,比如uTenux、uC/OS-II。 1.1.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,具有丰富紧凑的中间件,比如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运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。为了提供最好的移植性能,uC/OS II最大程度上使用ANSI C语言进行开发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU (包括DSP)。uC/OS II可以简单的视为一个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。内核属于抢占式,最多可以管理60个任务。从1992年开始,由于高度可靠性、鲁棒性和安全性,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) uTenux的任务、信号量等系统对象采用ID方式实现,用户看不到内部的数据结构,对于安全性比较好,使用也方便;而ucos是用户定义每个系统对象的变量。 (7) uTenux的任务间通信机制比ucos多了好几种,比如集合点端口等,而且每个通信机制都支持任务队列和消息队列。 (8) uTenux V1.5的易用性没有ucos的强,幸好uTenux已经意识到自己的问题,向ucos的易用性学习,在模仿中超越对手。 (9) uTenux 终身开源免费,无论是学习、商用、修改再发布,而ucos只有学习时是开源免费的,商用必须付费。 综上所述,学习uTenux的意义大于ucos。 1.2 嵌入式文件系统简介 1.2.1 文件系统概述 文件系统是操作系统的重要组成部分,用于控制对数据、文件及设备的存储[2]。它提供对文件和目录的分层组织形式、数据缓冲以及对文件的存储权限的控制。 文件系统必须提供必要的用来创建、删除文件、读文件和写文件等相应的系统调用。文件的存储通过目录完成,所以对目录的操作是文件系统功能的一部分,,文件系统应具有以下功能:⑴提供对文件和目录的分层组织形式;⑵建立与删除文件的能力;⑶文件的动态增长和数据保护。 硬盘的出现推动了针对桌面操作系统的文件系统的发展,同样,嵌入式存储设备特别是flash的出现,也推动了嵌入式文件系统的发展。 1.2.2 嵌入式文件系统一般体系结构 在嵌入式文件系统中,嵌入式系统可以针对特殊的目的定制,特别是随着ASOS(为应用定制的嵌入式操作系统)的发展,对嵌入式操作系统的系统功能完整性和可伸缩性提出了更高的要求。所以不得不采取一种灵活的系统体系结构,对于操作系统来说,文件系统是一个独立的子包含的整体,可以灵活的加载和卸载,这一切操作对操作系统内核的功能没有任何影响。 嵌入式文件系统系统体系结构从上到下一般有3层,如图1.1所示。 图1.1 嵌入式操作系统体系结构 最上一层是文件系统的核心,使文件系统实现的核心算法,提供了用户可见的所有API函数,以供用户操作数据,这一层是文件系统功能的集合。 第二层是高速缓冲管理,高速缓冲区的大小直接关系到文件系统的处理效率,高效的缓冲区处理算法能大幅提高数据的处理效率;同时它为文件系统提供了与硬件无关的接口,为文件系统的层次性提供了基础。 最下面一层是设备驱动程序,涉及到具体的硬件。设备驱动程序的另一个重要任务就是提供统一设备驱动接口。 文件系统和操作系统内核的关系主要体现在三方面:实时时钟、信号量和中断管理。用时钟实现外设任务的等待延时;用信号量实现外设的同步和互斥;用中断管理机制管理外设的中断处理程序。 1.2.3 文件系统概述 目前,嵌入式文件系统解决方案比较多,由于嵌入式设备的多样性,相应文件系统的实现也有针对各种设备的,如只读存储器、可读存储器、Flash存储器等。嵌入式文件系统也是要针对嵌入式操作系统的。 1. FatFS FatFS是一个开源免费通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统。FatFs 的编写遵循ANSI C,因此不依赖于硬件平台。它可以嵌入到便宜的微控制器中,如8051、PIC、AVR、SH、Z80、H8、ARM等等。它是window兼容的FAT文件系统,平台依赖性小,易于移植,代码和工作区占用非常小,有多种配置选项。通过配置FatFS可以使得FatFS占用的RAM达到44字节,代码空间的占用可以小到2K-4K,在这样小的空间中它还能支持FAT32,这是以文件的写功能的限制为代价的。 FatFS是标准FAT文件系统的小型嵌入式文件系统,它是一个自由软件,可以用于教育、研究、商业。在使用过程中不用担心被限制。用户可以修改,重新发布以个人的身份。但是必须在源代码中包含这个版权申明。 文件分配表FAT(File Allocation Table)用来跟踪硬盘上每个文件的数据库,而FAT表存储关于簇的信息。FAT表示microsoft在FAT文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。FAT分区格式是microsoft最早支持的分区格式,依据FAT表中的每个簇链的所占位数分为FAT12、FAT16、FAT32三种形式,但其基本存储方式是相似的。如图1.2所示。 图1.2 FatFs模块结构 2. uC/FS uC/FS是uCOS的文件系统,它是由Micrium公司新开发的一个产品,主要应用在使用uCOS内核的嵌入式系统中。uC/FS是一个用于能提供基础访问功能的FAT格式的文件系统,是一个高效率的库,为高速、多功能及内存使用进行优化。它用ANSI C编写,由不同的层次结构组成,包括API层、文件系统层、逻辑区块层、设备驱动和硬件层。 总之,在上述的嵌入式文件系统中,FatFS和uC/FS都用于小容量闪存设备,功能都比较齐全。但是uC/FS是属于拥有知识产权的技术,是商业产品,而FatFS则完全是开源免费的,用户可以随时下载所有全代码,更改和再发布。随着NAND FAlsh作为嵌入式系统中大容量存储介质的普及应用,FatFS文件系统作为开源代码的项目,得到芯片产商,项目开发人员的一致好评。所以在本项目中选择FatFS作为目标文件系统。 1.3 嵌入式文件系统的必要性 嵌入式系统过去主要用于工业控制领域,对效率的比较高,对于数据处理不够重视,引入文件系统不但没有必要而且会降低效率,所以很多嵌入式系统应用都没有加载操作系统。随着嵌入式处理器性能的不断升级,嵌入式系统的功能不断加强,用户的需求也和功能复杂度的增加,许多嵌入式系统都面临着处理大量数据的问题;另外对于应用程序开发人员直接访问内存具有很大的风险性,需要对内存的访问进行封装。综上所述在嵌入式操作系统内核和应用程序之间加一个文件系统成为必然趋势。 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/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文件系统的移植 3.1 FAT协议介绍 3.1.1 FAT协议概述 每个分区(卷)都是一个独立的文件系统;FAT文件系统将分区分为四个区域,保留区、FAT表区、目录区、数据区。 FAT表区:FAT(File Allocation Table)是文件分配表的简称,它是FAT文件系统最重要也是最根本的部分。文件分配表记录了一个个链表,记录了每个文件片段的直接后继的地址,从而将一个个的文件片段连接起来,形成一个完整的文件。一个FAT链表记录了一个完整的文件。为了便于对数据的管理,FAT文件系统将目录也抽象为文件,这个目录下的所有文件称为这个目录文件的内容。 FAT文件系统存储文件的基本单位是簇,也就是说一个文件片段就是一个簇。簇是文件系统中数据区的概念,一个分区(卷)中簇的多少,决定了这个文件系统中文件分配表中每个一个簇链所占用的位数,根据文件分配表每一个簇项所占用的位数将文件系统分为FAT12、FAT16、FAT32三种形式,但原理基本相同。 一个簇包含2的n次幂个扇区,每个扇区是512个字节或者是512的倍数。扇区是在文件系统中可以统一使用的逻辑地址。 保留区:保留区位于整个卷的最前面,记录了这个文件系统的一些基本的参数,比如扇区的大小,簇的大小,文件系统的类型,FAT表是否有备份,每张FAT表的大小,目录区的大小等。 目录区:如果说FAT表区是记录的每个簇的直接后继的话,那么目录区则记录了这个链表的头结点,以及一些其他的文件属性,每天记录占用32个字节。 数据区:用来以簇为单位存放文件内容。一个文件是以链表的形式存放在卷中,数据区的每个簇都是这个链表一个结点的上内容。 综上,保留区记录了整个文件系统基本参数,以及剩余簇的数量。FAT表区充当了一个链表的next结点。目录区记录了每一个文件和目录的基本属性,以及每个文件的开始簇号。数据区存放了每一个结点的内容。每次的文件访问,文件系统都会从目录区的第一条(根目录)开始读取,查找链表进入文件或选择指定的文件。 3.1.2 FAT 保留区 保留区位于分区(卷)的第一个扇区,同时也属于FAT文件系统基本区域的保留区。这个扇区又叫做“启动扇区”、“保留扇区”、“0扇区”。众多的说法都是一个意思,该扇区是FAT卷的第一个扇区。 这个区域最重要的就是BPB(BIOS Parameter Block),FAT32的BPB内容和FAT12、FAT16的内容在BPB_Toset32区域以前完全一致,而从偏移36开始它们的内容才有所区别,这么做是为了启动扇区中存放一个完整的FAT12、FAT16或FAT32的BPB内容,以达到最好的兼容性。 表3.1 FAT保留区各字段含义 名称 偏移byte 大小byte 描述 BS_jmpBoot 0 3 跳转指令,指向启动代码,有两种形式 BS_OEMName 3 8 标志字符串,建议值为“MSWIN4.1” BPB_BytsPerSec 11 2 每个扇区的字节数,512取得最好兼容性 BPB_SecPerClus 13 1 每个簇的扇区数,必须为2的n次幂,簇大小必须小于32k BPB_RsvdSecCnt 14 2 保留区中扇区的数目,FAT12/16为1,FAT32为32 BPB_NumFATs 16 1 FAT表的份数。建议为2,这样就会有一个备份FAT表 BPB_RootEntCnt 17 2 在此卷中总共目录的项数,乘以32必须是512的倍数 BPB_TotSec16 19 2 此卷中扇区总数,若为0那么BPB_Tot32必须为非0 BPB_Media 21 1 存储介质的类型,固定存储介质0xF8,移动的为0xF0 BPB_FATSz16 22 2 一个FAT表所占用的扇区数,对于FAT32为0 BPB_SecPerTrk 24 2 每磁道的扇区数,用于BIOS的0x13中断 BPB_NumHeads 26 2 磁头数,用于BIOS的0x13中断 BPB_HiddSec 28 4 在卷之前的扇区数,用于BIOS的0x13中断 BPB_TotSec32 32 4 对于FAT32类型,为此卷的扇区总数 结束标志1 510 1 0x55 结束标志2 511 1 0xAA 从偏移36开始FAT12/FAT16的内容开始不同于FAT32,表3.2为FAT12/FAT16的内容: 表3.2 FAT12/FAT16的内容 名称 偏移 (byte) 大小 (byte) 描述 BS_DrvNum 36 1 用于BIOS中断0x13得到磁盘驱动器参数 BS_Reserved1 37 1 保留——供NT使用 BS_BootSig 38 1 扩展引导标记,用于指明后期的3个域可用 BS_VolID 39 4 卷标序列号,此域往往由日期和时间组成,用于检测磁盘 BS_VolLab 43 11 磁盘卷标,此域必须与根目录中11字长的卷标一致 BS_FilSysType 54 8 文件系统类型标记,此域为实际的字符串 FAT32的内容。如下表3.3所示。 表3.3 FAT32的内容 名称 偏移 (byte) 大小 (byte) 描述 BPB_FATSz32 36 4 一个FAT表所占的扇区数 BPB_ExtFlags 40 2 Bit0-3:不小于0的活动FAT数目 BPB_FSVer 42 2 高位为主版本号,低位为此版本号 BPB_RootClus 44 4 根目录所在的第一个簇号,通常为2 BPB_FSInfo 48 2 保留区中FAT32卷FSINFO结构所占扇区数,通常为1 BPB_BkBootSec 50 2 保留区中引导记录的备份数据所占的扇区数,通常为1 BPB_Reserved 52 12 保留 BS_DrvNum 64 1 同FAT12/16的定义 BS_Reserved1 65 1 同FAT12/16的定义 BS_BootSig 66 1 同FAT12/16的定义 BS_VolID 67 4 同FAT12/16的定义 BS_VolLab 71 11 同FAT12/16的定义 BS_FilSysType 82 8 同FAT12/16的定义,通常设为“FAT32” 3.1.3 FAT表区 FAT表是文件系统一个重要的数据结构,每一个FAT表项绑定一个数据区的簇,即FAT表的表项数目与数据区的簇的数目相等,所以簇的数目决定了FAT表项所占的位数,如占12位则文件系统为FAT12,占16位则为FAT16,占32位则为FAT32,其中不允许出现其他的数字。顺序的第一个FAT表项对应数据区的第一个簇,第二个表项对应数据区的第二个簇……。就像每一袋鼠都有一个袋子一样,都可以用来存放自己的后继者。簇的袋子就是对应的FAT表项。FAT表项相当于链表的next结点,那么文件片段簇4的直接后继,就应该读取FAT表中的第4个表项,得到的值则为直接后继的簇号。对于特殊的表项值进行了如下定义。以FAT32为例,如表3.4所示。 表3.4 FAT表区各个字段的含义 序号 FAT表项值 含义 1 0x0000 0000 表示本表项对应的簇为空簇,为可用簇 2 0x0000 0002 ~0xFFFF FFEF 以用簇,表示本表项对应的下一个簇的簇号 3 0xFFFF FFF7 表示本表项对应的簇为坏簇 4 0xFFFF FFF8 置于FAT表的第一个表项,作为磁盘标识符 5 0xFFFF FFFF 设置FAT表的第二个表项,表示第一个簇被占用 6 0xFFFF FFF8 ~0xFFFF FFFF 表示本表项对应的簇为最后一个节点 从表3.4可以看出,FAT表的第一和第二表项都有默认值,作为识别使用,所以文件系统没有簇0和簇1,簇的命名是直接从簇2开始的。 3.1.4 FAT目录区 所有链表的根源都来自于目录区,目录区存放了一条条记录,表示各个目录和文件的基本属性。每条记录占32个字节。对于FAT32,目录区和数据区没有明显的界线,数据和目录是混合在一起的,每次写数据时都是先用最小的空闲簇。每条记录的各个字段的含义如表3.5所示。 表3.5 目录区各个字段的含义 名称 偏移 (byte) 大小 (byte) 描述 DIR_Name 0 11 短文件名 DIR_Attr 11 1 文件属性:只读(x01)、隐藏 (0x02)、系统(0x04)、卷标(0x08)、 目录(0x10)、归档(0x20)、长文件名(0x0F) DIR_NTRes 12 1 保留给Window NT使用 DIR_CrtTimeTenth 13 1 文件创建时间的毫秒戳,精度为2毫秒 DIR_CrtTime 14 2 文件创建时间 DIR_CrtDate 16 2 文件创建日期 DIR_LstAccDate 18 2 最后访问日期,只有日期 DIR_FstClusHI 20 2 该目录或文件的簇号的高位字 DIR_WrtTime 22 2 最后写的时间,文件被创建被认做写 DIR_WrtDate 24 2 最后写的日期,文件被创建被认做写 DIR_FstClusLO 26 2 该目录或文件簇号的低位字 DIR_FileSize 28 4 文件大小,由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。 本地命名空间的配置选项有:_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。 1. _FS_TINY 0:为正常模式(默认),1:为微型模式。当_FS_TINY被设置为1时,FatFs使用扇区缓冲来代替正常模式的下文件中的私有缓冲区。这样可以为每一个文件结构类型减少512个字节的空间开销。并且还会移除一些功能函数。 2. _FS_READONLY 0:可读可写(默认),1:只读。设置_FS_READONLY为1时,将会移除关于写的函数,f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,f_truncate and useless f_getfree 3. _FS_MINIMIZE 可设置为0~3 。0为默认值。_FS_MINIMIZE选项定义了文件系统的最小级别。通过移除一些函数,将文件系统分为四个级别。 0:支持所有功能 1:f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename are removed。 2:f_opendir and f_readdir are removed in addition to 1。 3:f_lseek is removed in addition to 2。 4. _USE_STRFUNC 0:禁止(默认) 1~2:使能。通过设置_USE_STRFUNC来使能和禁止字符串函数功能。 5. _USE_MKFS 0:禁止(默认)1:使能。通过_USE_MKFS来使能f_mkfs(格式化)函数。此时_USER_MKFS需要设置为1,并且_FS_READONLY需要设置为0。 6. _USE_FORWARD 0:禁止(默认)1:使能。通过设置_USER_FORWARD来使能f_forward函数,需要设置_USER_FORWARD为1:,并且_FS_TINY设置为1 7. _USE_FASTSEEK 0:禁止(默认)1:使能。使能快速定位功能,需要设置_USE_FASTSEEK为1。 8. _CODE_PAGE 936:为简体中文,0为ASCII。这个选项精确的规定了可以使用的OEM字符集,不正确的设置将会使文件打开失败。 9. _USE_LFN 0~3可以用来设置,默认为0。_USE_LFN用来选择支持长文件名的方式。此处配置为1。 0:禁止使用长文件名,_MAX_LFN和_LFN_UNICODE将不起作用。 1:使能长文件名功能,使用BSS段的静态缓冲区。重入功能将不能被使用。 2:使能长文件名功能,使用动态的栈缓冲区。 3:使能长文件名功能,使用动态的堆缓冲区。 10. _MAX_LFN 12~255可以被设置,用来表示最大长文件名的长度。长文件名的工作缓冲区占用(_MAX_LFN+1)*2字节。如果使能了长文件名,unicode操作函数ff_convert()和ff_wtoupper()必须被添加。如果使用了是堆缓冲区,那么内存控制函数ff_memalloc()和ff_memfree()必须被添加。 11. _LFN_UNICODE 0:ANSI/OEM(默认),1:unicode。FatFs API要切换字符编码形式为Union时,将LEN和LFN_UNICODE为1。 12. _FS_RPATH 0~2可以被设置,默认为0。_FS_RPAH用来配置相对路径的特性。 0:禁止使用相对路径,移除相关的函数。 1:使能相对路径特性,可以使用f_chdirve()和f_chdir()两个函数。 2:在1的基础上增加了f_getcwd()函数。 注意:读取路径函数f_readdir()将会受到这个选项的影响。 13. _VOLUMES 默认为1。整个文件系统有几个逻辑驱动器(分区)。 14. _MAX_SS 512(默认)、1024、2048、4096。扇区被设置的最大字节数。在硬盘上将会一直被设置为512,但是一个大的分区可能会要求,比如在板上flash、软盘、光盘。如果_MAX_SS大于512,那么disk_ioctl中的GET_SECTOR_SIZE必须生效。 15. _MULTI_PARTITION 0:单分区,每个分区都会被绑定到一个屋里驱动号上。而且只能挂载第一个分区。 1/2:使能多分区功能,每一个分区都会去试图分开在VolToPart[]中。 16. _USE_ERASE 0:禁止(默认),1:使能。使能扇区擦除功能,需要设置_USE_ERASE为1,且必须使disk_ioctl()函数中的CTRL_EARSE_SECTOR命令生效。 17. _WORD_ACCESS 0~1可以被设置,0为默认值。_WORD_ACCESS选项定义了选择哪一种存储方式在FAT分区(卷)中来处理字操作。 0为字节存储,能够兼容所有的平台。1为字存储。当字节顺序为大端或者没有字对齐时,必须使用字节存储。 18. _FS_REENTRANT 0:禁止(默认),1:使能。_FS_REENTRANT选项用来配置FatFs的重入(线程安全访问)功能模块。 0:禁止重入,_SYNC_t和_FS_TMEOUT失去作用。 1:使能重入,用户可以提供同步操作,ff_req_grant,ff_rel_grant,ff_del_syncobj函数必须被提供。 19. _FS_TIMEOUT 设置操作最大所允许的响应时间,在_FS_TIMEOUT个滴答周期后,发送timeout信号。 20. _SYNC_t 操作系统依所依赖的关于同步操作的结构,比如有:HANDLE,OS_EVENT*,ID等等。 21. _FS_SHARE 0:禁止(默认),大于0:一个文件所允许打开的次数。使能文件共享特性,需要设置_FS_SHARE为大于等于1的数。这个值将是所允许同时打开的文件数目。 3.3 FatFS文件系统结构分析 3.3.1 FatFS模块结构 FatFS文件系统由上下两层组成,上层是文件系统的核心,通过实现文件系统的操作接口实现了文件系统的FAT原理。底层是文件系统的基础,主要定义了一些底层扇区的读写、及控制函数。如图3.1所示。 应用程序 文件系统层 文件操作功能函数(ff.c) 文件操作底层接口函数(diskio.c) 操作系统 时间管理 信号量操作 STDIO GPIO UART RTC 芯片、外设及其对应的外设库 图3.1 FatFS模块结构 3.3.2 FatFS定义的结构体 FatFS文件系统用到了基本的四个结构体类型,分别为FATFS、FIL、DIR、FILINFO。 1. FATFS定义了文件系统的一些基本属性,主要是文件系统保留区的的信息。 1) fs_type 0表示没有挂载 2) drv 物理驱动器号 3) csize 每个簇的扇区数 4) n_fats 本文件系统共有几个fat表 5) wflag 缓冲win[]写满标识,如果为1的话必须回写 6) fsi_flag fsinfo结构写满标识,如果为1的话必须回写 7) id 文件系统的挂载ID 8) n_rootdir根目录下的入口个数 9) ssize 每个扇区的字节数,仅在_MAX_SS不等于512时有效 10) _SYNC_t在多线程中实现同步操作的结构,只有在使能重入配置时才有效 11) last_clust 最后一个存储的簇号,在只读模式下无效 12) free_clust 空闲簇的数目,在文件系统中有专门的扇区来存放空闲的簇的数目,在只读模式下无效 13) fsi_sector fsinfo结构的扇区,在只读模式下无效 14) cdir 用来记录当前文件的起始簇号,在使能相对路径时才有效 15) n_fatnet 最大的簇号 16) fsize 一张fat表所占用的扇区数 17) fatbase fat表区的起始扇区号 18) dirbase 目录区的起始扇区号 19) database 数据区的起始扇区号 20) winsect 当前在win[]缓冲区中存放的扇区号 21) win[] 磁盘存储窗口,微型文文件系统没有这个缓冲区 2. FIL定义了文件的读写信息,包括读写指针的位置,当前所在簇,当前扇区,文件的大小等。 1) fs 指向自身所在的文件系统的指针 2) id 此文件系统挂载的ID 3) flag 文件状态标志 4) padl 5) fptr 文件读写指针,0:表示文件刚打开 6) fsize 此文件的大小 7) sclust 文件的起始簇号,当文件大小为0时,起始簇号也为0 8) clust 当前所在的簇 9) desct 当前的所在扇区号 10) dir_sect 扇区包含的目录入口,只有在读写模式下才有效 11) dir_ptr 在win[]缓冲区中指向目录入口的指针,只有在读写模式下才有效 12) cltbl 指向簇链接表的指针,当文件打开时为null,只有在使能快速查找功能时才有效 13) lockid 文件锁定号(在信号量表中的索引) 14) buf[] 文件的读写缓冲区 3. DIR目录结构体定义了目录的一些基本信息 1) fs 指向自身所在的文件系统的指针 2) id 此文件系统挂载的ID 3) index 当前读写索引号 4) sclust 起始簇号 5) clust 当前所在簇的粗豪 6) sect 当前扇区号 7) dir 在win[]缓冲区中指向短文件名得起始地址 8) fn 指向SFN的指针,指向短文件名 9) lfn 指向长文件名得工作缓冲区,只有在使能长文件名的时候才可以使用 10) lfn_idx 最后一个匹配的长文件名索引号,0xFFFF:表示没有长文件名,只有在使能长文件名得时候才能使用 4. FILINFO文件的属性结构体,定义了文件的基本属性,创建日期,修改日期,访问日期等等 1) fsize 文件的大小 2) fdate 文件的修改日期 3) ftime 文件的修改时间 4) fattrib 文件的基本属性 5) fname[] 短文件名 6) lfname 指向长文件名得指针 7) lfsize 记录长文件名得长度 3.4 SD卡接口 3.4.1 SD协议 SD卡是基于flash的存储卡。SD卡和MMC卡的区别在于初始化的过程不同。SD卡的通信协议包括SD和SPI两类。SD卡使用卡内智能控制模块进行FALSH操作控制,包括协议、安全算法、数据存储、ECC算法、缺陷处理和分析、电源管理、时钟管理。SD卡结构如图3.2所示。 SD卡 Flash模块 SD卡控制芯片 数据输入/输出 SD总线/SPI总线接口 控制 图3.2 SD卡接口图 SD总线协议是基于命令和数据位流的方式的,有一个起始位开始,以一个停止位结束。 命令——命令是开始操作的标记。命令从主机发送一个卡(寻址命令)或所有连接的卡(广播命令)。命令在CMD线上串行传送。 响应——响应是从寻址卡或所有
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 学术论文 > 毕业论文/毕业设计

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服