基于uTenux的fatfs文件系统移植本科毕业论文设计.doc_第1页
基于uTenux的fatfs文件系统移植本科毕业论文设计.doc_第2页
基于uTenux的fatfs文件系统移植本科毕业论文设计.doc_第3页
基于uTenux的fatfs文件系统移植本科毕业论文设计.doc_第4页
基于uTenux的fatfs文件系统移植本科毕业论文设计.doc_第5页
免费预览已结束,剩余29页可下载查看

下载本文档

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

文档简介

本科毕业论文(设计)题目: 基于utenux操作系统的 fatfs文件系统移植 学院: 数学与计算机科学学院 完成日期: 2013 年 6 月 2 日基于utenux操作系统的 fatfs文件系统移植摘要:随着嵌入式技术的发展,尤其是arm技术的不断更新,推出了cortex系列芯片,使得嵌入式设备的功能日益壮大,逐渐由单片机的时代过渡到微控制器的时代,对数据的访问量有了显著提高,这就要求数据操作层次清晰、透明度提高、可维护性、接口的标准化、移植性、灵活的操作和数据存储的可靠性等都提出了越来越高的要求,所以有必要引入文件系统来完成数据存储和管理的功能,为用户提供按名存取数据的接口,从而可以避免由程序开发人员直接访问内存所带来的不安全性。本论文基于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 嵌入式文件系统的必要性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/stdio193.5.2 构建移植环境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.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. fatfsfatfs是一个开源免费通用的文件系统模块,用于在小型嵌入式系统中实现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/fsuc/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_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.2 fat12/fat16的内容名称偏移 (byte)大小(byte)描述bs_drvnum361用于bios中断0x13得到磁盘驱动器参数bs_reserved1371保留供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_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.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表项值含义10x0000 0000表示本表项对应的簇为空簇,为可用簇20x0000 00020xffff ffef以用簇,表示本表项对应的下一个簇的簇号30xffff fff7表示本表项对应的簇为坏簇40xffff fff8置于fat表的第一个表项,作为磁盘标识符50xffff ffff设置fat表的第二个表项,表示第一个簇被占用60xffff fff80xffff ffff表示本表项对应的簇为最后一个节点从表3.4可以看出,fat表的第一和第二表项都有默认值,作为识别使用,所以文件系统没有簇0和簇1,簇的命名是直接从簇2开始的。3.1.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_crttimetenth131文件创建时间的毫秒戳,精度为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。本地命名空间的配置选项有:_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_tiny0:为正常模式(默认),1:为微型模式。当_fs_tiny被设置为1时,fatfs使用扇区缓冲来代替正常模式的下文件中的私有缓冲区。这样可以为每一个文件结构类型减少512个字节的空间开销。并且还会移除一些功能函数。2. _fs_readonly0:可读可写(默认),1:只读。设置_fs_readonly为1时,将会移除关于写的函数,f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,f_truncate and useless f_getfree3. _fs_minimize可设置为03 。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_strfunc0:禁止(默认) 12:使能。通过设置_use_strfunc来使能和禁止字符串函数功能。5. _use_mkfs0:禁止(默认)1:使能。通过_use_mkfs来使能f_mkfs(格式化)函数。此时_user_mkfs需要设置为1,并且_fs_readonly需要设置为0。6. _use_forward0:禁止(默认)1:使能。通过设置_user_forward来使能f_forward函数,需要设置_user_forward为1:,并且_fs_tiny设置为17. _use_fastseek0:禁止(默认)1:使能。使能快速定位功能,需要设置_use_fastseek为1。8. _code_page936:为简体中文,0为ascii。这个选项精确的规定了可以使用的oem字符集,不正确的设置将会使文件打开失败。9. _use_lfn03可以用来设置,默认为0。_use_lfn用来选择支持长文件名的方式。此处配置为1。0:禁止使用长文件名,_max_lfn和_lfn_unicode将不起作用。1:使能长文件名功能,使用bss段的静态缓冲区。重入功能将不能被使用。2:使能长文件名功能,使用动态的栈缓冲区。3:使能长文件名功能,使用动态的堆缓冲区。10. _max_lfn12255可以被设置,用来表示最大长文件名的长度。长文件名的工作缓冲区占用(_max_lfn+1)*2字节。如果使能了长文件名,unicode操作函数ff_convert()和ff_wtoupper()必须被添加。如果使用了是堆缓冲区,那么内存控制函数ff_memalloc()和ff_memfree()必须被添加。11. _lfn_unicode0:ansi/oem(默认),1:unicode。fatfs api要切换字符编码形式为union时,将len和lfn_unicode为1。12. _fs_rpath02可以被设置,默认为0。_fs_rpah用来配置相对路径的特性。0:禁止使用相对路径,移除相关的函数。1:使能相对路径特性,可以使用f_chdirve()和f_chdir()两个函数。2:在1的基础上增加了f_getcwd()函数。注意:读取路径函数f_readdir()将会受到这个选项的影响。13. _volumes默认为1。整个文件系统有几个逻辑驱动器(分区)。14. _max_ss512(默认)、1024、2048、4096。扇区被设置的最大字节数。在硬盘上将会一直被设置为512,但是一个大的分区可能会要求,比如在板上flash、软盘、光盘。如果_max_ss大于512,那么disk_ioctl中的get_sector_size必须生效。15. _multi_partition0:单分区,每个分区都会被绑定到一个屋里驱动号上。而且只能挂载第一个分区。1/2:使能多分区功能,每一个分区都会去试图分开在voltopart中。16. _use_erase0:禁止(默认),1:使能。使能扇区擦除功能,需要设置_use_erase为1,且必须使disk_ioctl()函数中的ctrl_earse_sector命令生效。17. _word_access01可以被设置,0为默认值。_word_access选项定义了选择哪一种存储方式在fat分区(卷)中来处理字操作。0为字节存储,能够兼容所有的平台。1为字存储。当字节顺序为大端或者没有字对齐时,必须使用字节存储。18. _fs_reentrant0:禁止(默认),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_share0:禁止(默认),大于0:一个文件所允许打开的次数。使能文件共享特性,需要设置_fs_share为大于等于1的数。这个值将是所允许同时打开的文件数目。3.3 fatfs文件系统结构分析3.3.1 fatfs模块结构fatfs文件系统由上下两层组成,上层是文件系统的核心,通过实现文件系统的操作接口实现了文件系统的fat原理。底层是文件系统的基础,主要定义了一些底层扇区的读写、及控制函数。如图3.1所示。应用程序文件系统层文件操作功能函数(ff.c)文件操作底层接口函数(diskio.c)操作系统时间管理信号量操作stdiogpiouartrtc芯片、外设及其对应的外设库图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 文件系统的挂载id8) 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 此文件系统挂载的id3) flag 文件状态标志4) padl5) fptr 文件读写指针,0:表示文件刚打开6) fsize 此文件的大小7) sclust 文件的起始簇号,当文件大小为0时,起始簇号也为08) clust 当前所在的簇9) desct 当前的所在扇区号10) dir_sect 扇区包含的目录入口,只有在读写模式下才有效11) dir_ptr 在win缓冲区中指向目录入口的指针,只有在读写模式下才有效12) cltbl 指向簇链接表的指针,当文件打开时为null,只有在使能快速查找功能时才有效13) lockid 文件锁定号(在信号量表中的索引)14) buf 文件的读写缓冲区3. dir目录结构体定义了目录的一些基本信息1) fs 指向自身所在的文件系统的指针2) id 此文件系统挂载的id3) 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线上串行传送。响应响应是从寻址卡或所有连接的卡(同步)发送给主机用来响应接受到的命令的标记。命令在cmd线上串行传送。响应标记(token)根据内容不同具有四种格式,标记长度。长度为48位或136位。数据块的crc算法采用16位的ccitt多项式。数据数据可以通过数据线在卡和主机间双向传送。 3.4.2 sd命令sd卡的命令长度为48位,命令格式如下表3.6所示。表3.6 命令结构01bit5.bit0bit31bit0bit6bit01起始位host命令编号参数crc7结束位sd卡命令集分为基本命令、读块命令、写块命令、擦除命令、写保护命令、锁命令、应用命令7类,每个类支持一个卡功能集合操作。用的命令如表3.7所示。表3.7 常用的sd卡命令命令索引类型参数响应缩写描述cmd0bc-go_idle_state重置所有卡到空闲状态cmd8bcr31:12保留 11:8电压7:0模式r7send_if_cond发送sd卡的接口环境acmd41bcr31:1ocrr3sd_app_op_cond请求条件寄存器ocrcmd2bcr31:0数据位r2all_send_cid请求标识寄存器cidcmd3bcr31:0数据位r6seng_elative_addr要求提供新的地址rcacmd7ac31:16rca15:0数据位r1bselec/deselect_card选择或者取消卡3.5 fatfs文件系统的移植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/studio1 v3.1上进行开发编译的。在微控制器的开发过程中,大学生和小企业因为成本原因,不能购买商业软件,这时可以使用悠龙软件的开源免费的开发环境工具-ut/studio 工具链,其中包含了eclipse 集成开发环境、arm 公司针对微控制器优化的gnu 编译器及其二进制工具集、msys 最小posix系统工具集。推荐使用的仿真器是j-link ice v8,其中包括了flashrom 的烧写工具和在线调试工具等。下载相关代码:(1)从 http:/www.uloong.cc/cn/develop/tenux.htm下载ut/studio v3.1安装包,并参照软件包中的ut-studio_v3.0.00_cut-studio_editionmanual手册进行ut/studio安装。(2)从http:/www.uloong.cc/cn/index.htm 下载utenux v1.500r160 源代码。(3)从/fsw/ff/00index_e.html 下载fatfs r0.09源代码。(4)从意法半导体(st)官网下载sd卡库。3.5.2 构建移植环境将utenux v1.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替换为#include”ts_basic.h”;将option*.c 中#incliude“./ff.h”替换

温馨提示

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

评论

0/150

提交评论