Transcript Document

文件的使用实验
(另可参考学习情境三之详述)
电信学院 嵌入式技术与应用专业
实验提纲
1 实验目的
2 实验内容
3 预备知识
4 实验设备
5 实验原理
6 实验思考
嵌入式技术与应用专业教学资源库
实验目的
学习使用文件相关的API函数,了解在
uCOS-II操作系统上扩展文件系统的情况。
嵌入式技术与应用专业教学资源库
实验内容
通过使用开发平台提供的API函数,打开一
个保存在FLASH海量存储器中的英文文本
文件,将其文件内容输出显示在液晶屏上。
嵌入式技术与应用专业教学资源库
预备知识
1、用ARM ADS1.2集成开发环境,编写和
调试程序的基本过程。
2、基于uCOS-II操作系统的应用程序的框
架结构。
3、操作系统原理中有关文件系统的知识,
了解文本文件以及字符串的处理方法。
4、使用LCD_printf向液晶屏输出字符。
嵌入式技术与应用专业教学资源库
实验设备及工具(包括软件调试工具)
硬件:ARM嵌入式开发平台、用于
ARM920T的JTAG仿真器、PC机
Pentium100以上。
软件:PC机操作系统Win2000或WinXP、
ARM ADS1.2集成开发环境、仿真器驱动程
序、超级终端通讯程序、SourceInsight。
嵌入式技术与应用专业教学资源库
基础知识
 uCOS-II操作系统本身并没有文件系统。在将uCOS-II操作
系统移植到UP-TECH2410嵌入式开发平台时参考
YAFFS(yet another Flash File System)为该系统扩展了一
个简单的文件系统,从而使该操作系统功能更强大,也符
合实际嵌入式产品开发的需要。开发平台的硬件中有一片
容量为64M的NAND FLASH存储芯片作为嵌入式设备的
固态数据存储器,或称为电子硬盘。该存储器由文件系统
管理,在文件系统的功能函数与FLASH芯片之间有相关驱
动程序实现高层系统功能和底层具体硬件的数据交换。
 而对UP-TECH3000。在将uCOS-II 操作系统移植到ARM
嵌入式开发平台时参考FAT16 为该系统扩展了一个简单的
文件系统,从而使该操作系统功能更强大,也符合实际嵌
入式产品开发的需要。开发平台的硬件中有一片容量为
16M 的NAND FLASH 存储芯片作为嵌入式设备的固态数
据存储器,或称为电子硬盘。
嵌入式技术与应用专业教学资源库
Flash存储器及文件系统介绍
 1、Flash存储器
Flash文件系统,顾名思义就是采用Flash作为外存储器
实现的文件系统。因此,Flash文件系统地实现就必须考
虑Flash存储器的特点。
Flash存储器由于具有存储容量大、掉电数据不丢失以
及可多次擦写等许多优点,正逐步取代其它半导体存储
器件而广泛应用于移动电话、PDA以及数码相机等移
动电子产品中。其作为存储数据和应用程序的存储体,
可以将大量数据方便、快捷地移动和交换。
Flash内部分为多个存储单元块(block),每个存储单
元块又由多个页(page)组成。存储单元块是可擦除
的最小单位,页是写入数据的最小单位。
嵌入式技术与应用专业教学资源库
Flash存储器及文件系统介绍
Flash存储器读取数据与一般的存储器类似,可以实现随
机读取,读出的速度也很快。而Flash存储器的写操作则
和一般的存储器有所不同,Flash的写操作必须先按存储
块擦除(写入0xff到要擦除的存储单元块中),再按页顺
序写入。由于Flash存储器擦除耗时较长,所以Flash存
储器写入的时间主要在于Flash存储器内部的擦除操作
等。
Flash存储器第一块一定是有效块,而其它块可能会在使
用前就是坏块或者在使用过程中变成坏块(invalid
block)。Flash存储器对内部坏块的判定是,根据其每
一个单元存储块中的第3区中的第6 Cloumn内容是否为
0xff来定。虽然Flash存储器内容会有坏块,但是由于每
一块的内部结构都是相互独立的,所以只要对其状态加
以识别,坏块并不影响系统对有效块的操作。
嵌入式技术与应用专业教学资源库
Flash存储器及文件系统介绍
2 flash文件系统介绍
有了Flash存储器,相应的应该有对应的系统来
管理,于是有了Flash文件系统的出现。和常规
的文件系统类似,我认为Flash文件系统的提出,
至少需要实现以下几个特点:
统一管理Flash存储器存储空间,实施存储空间的分
配与回收
实现文件的按名存取,使用方便,直观
向用户提供一个方便使用的接口(提供对文件系统
操作命令,以及提供对文件的操作命令
优化存储速度和空间利用屏蔽物理因素的影响,如对
于坏损单元,采用透明的坏损管理
嵌入式技术与应用专业教学资源库
Flash存储器及文件系统介绍
 3 Flash FAT文件系统设计
FAT文件系统设计应该分为两个层次:
最一层,直接和物理硬件接触,管理Flash物理存储器;
第二层,在基层之上,实现文件管理,如实现FAT
3.1第一层
(1)物理地址到逻辑地址的映射
– 为了在Flash物理地址和FAT操作的逻辑地址之间建立一个好的
映射关系,须对Flash的存储空间在逻辑上进行了重新定义。结合
Flash特点,将每个存储单元块内部分成若干物理扇区。具体实现
时,每个物理扇区可以分为 基本的数据区 和 其它信息保留区(如
安全性)。确定好扇区的结构和大小之后,物理地址到逻辑地址
的映射也就确定了。
(2)可靠性设计
– 一个完善的文件系统需要有良好的可靠性。 笼统的讲,可靠性的
实现,需要存储器信息的支持,扇区的信息保留区就可以利用起来。
嵌入式技术与应用专业教学资源库
Flash存储器及文件系统介绍
 3 Flash FAT文件系统设计
FAT文件系统设计应该分为两个层次:
最一层,直接和物理硬件接触,管理Flash物理存储器;
第二层,在基层之上,实现文件管理,如实现FAT
3.1第一层
(1)物理地址到逻辑地址的映射
– 为了在Flash物理地址和FAT操作的逻辑地址之间建立一个好的
映射关系,须对Flash的存储空间在逻辑上进行了重新定义。结合
Flash特点,将每个存储单元块内部分成若干物理扇区。具体实现
时,每个物理扇区可以分为 基本的数据区 和 其它信息保留区(如
安全性)。确定好扇区的结构和大小之后,物理地址到逻辑地址
的映射也就确定了。
(2)可靠性设计
– 一个完善的文件系统需要有良好的可靠性。 笼统的讲,可靠性的
实现,需要存储器信息的支持,扇区的信息保留区就可以利用起来。
嵌入式技术与应用专业教学资源库
Flash存储器及文件系统介绍
(3)坏块管理
– 由于Flash内部会有坏块,因此Flash存储管理系统需要对Flash进
行坏块管理。而且,坏块单元对用户应用应该是完全透明的。
一般坏块的管理分以下两种情况:
– ① 初始坏块处理。Flash存储器在使用前可能会有坏块,而且这些
坏块是随机分布的。所以,Flash文件管理系统在系统执行读写操
作之前先建立一个坏块表,然后对Flash存储器进行初始化扫描以
发现坏块,并将坏块标记为不可用,加入到坏块表中。
– ② 操作过程中坏块处理。在擦除或者编程过程中发生错误
时,Flash文件管理系统将该块中其它页的数据重新拷贝到一个新
的空块中,然后再将该块标记为坏块,加入到坏块表中。在这个处
理过程中,由于对Flash的擦除或者编程操作都会使得Flash存储单
元块的内容改变,所以Flash文件管理系统一旦发现Flash存储器的
存储单元块成为坏块后便不再对该块进行擦除或编程操作,以免
将坏块标志位数据清除掉,而是将该块标记为坏块,并将其加入坏
块表中。
嵌入式技术与应用专业教学资源库
Flash存储器及文件系统介绍
(4)均衡擦写次数
– 由于Flash有一定的使用寿命,一般可擦除的次数为10~
100万次,所以随着使用次数的增加,会有一些单元逐渐变得
不稳定或失败。因此,要尽量避免频繁地对同一块地址操作,
以免造成局部单元提前损坏;同时,由于擦除操作耗时较多,
也应减少擦除操作,应该尽量达到擦写次数均衡。为此,有
必要设计Flash更新算法和磨损程度检测算法。
– Flash更新算法可以是将Flash中要更新的数据直接写入一
个空块中,降低由于Flash先擦除后写入的特性带来的对块
的频繁擦除;同时,也提高了Flash的使用效率,加快了操作速
度。
– 磨损程度检测算法是在对Flash进行写入前必须先对Flash
进行坏块扫描,以确保不会将数据写入坏块从而此起数据的
丢失。
嵌入式技术与应用专业教学资源库
Flash存储器及文件系统介绍
 3.2 FAT设计
在Flash文件管理系统的基础上,还建立了FAT文件系统来对文件操作
进行管理。将FAT文件系统具体分为以下四部分:
(1)FAT的引导区
– 该引导区存放代码所需的信息及最重要的文件系统信息。这些信息包括
了Flash存储器的类型、容量以及划分成多少个簇;每个簇包含多少扇区、
FAT表数目、保留扇区数、根目录的首簇号及根目录入口数、版本信息
等等。引导扇区是在格式化Flash时生成的。
(2)FAT的文件分配表
– 文件分配表存放文件所占用的存储空间族链以及Flash存储器的占用和空
闲空间的情况,非常重要。
– 为了防止文件分配表损坏而引起文件的丢失,可以在系统中保存两个相同
的文件分配表FAT1和FAT2,以改善其安全性。在文件系统的操作中,程序
对FAT表结构的两个备份进行顺次修改,以此确保Flash存储器上总是存有
一整套完好的文件分配表。
– 系统对FAT表的访问原理如下:访问文件时先从要目录中找到该文件的
目录项,从中读出首簇号。然后,目录中找到该文件的目录项,从中读出首
簇号。然后在FAT中找到从该首簇号开始的簇链,簇链上的簇号即为文件
在逻辑扇区中占用的扇区号链,这样便可以进行数据读写了。
嵌入式技术与应用专业教学资源库
Flash存储器及文件系统介绍
(3)FAT的根目录区
– FAT的根目录区是固定大小的紧跟在FAT表后的区域。本
文将从FAT区之后紧跟的32个扇区作为根目录区,可以保存
512个目录项。每个目录项记录了该文件的文件名、文件
属性、文件大小、文件创建的日期和时间以及文件在数据
区中所占的首簇号,即该文件在FAT表中的入口等数据。
(4)FAT的数据区
– 数据区存在文件的数据内容。文件系统对数据区的存储空
间是按簇进行划分和管理的。
嵌入式技术与应用专业教学资源库
Flash存储器及文件系统介绍
 4 YAFFS文件系统
YAFFS,Yet Another Flash File System,是一种类似于
JFFS/JFFS2的专门为Flash设计的嵌入式文件系统。与JFFS相比,
它减少了一些功能,因此速度更快、占用内存更少。YAFFS和JFFS
都提供了写均衡,垃圾收集等底层操作。
它们的不同之处在于:
 (1)、JFFS是一种日志文件系统,通过日志机制保证文件系统的稳定性。
YAFFS仅仅借鉴了日志系统的思想,不提供日志机能,所以稳定性不如
JAFFS,但是资源占用少。
 (2)、JFFS中使用多级链表管理需要回收的脏块,并且使用系统生成伪
随机变量决定要回收的块,通过这种方法能提供较好的写均衡,在
YAFFS中是从头到尾对块搜索,所以在垃圾收集上JFFS的速度慢,但是
能延长NAND的寿命。
 (3)、JFFS支持文件压缩,适合存储容量较小的系统;YAFFS不支持
压缩,更适合存储容量大的系统。
YAFFS还带有NAND芯片驱动,并为嵌入式系统提供了直接访问文件系统的API,
用户可以不使用Linux中的MTD和VFS,直接对文件进行操作。NAND Flash大多
采用MTD+YAFFS的模式。MTD( Memory Technology Devices,内存技术设备)
是对Flash操作的接口,提供了一系列的标准函数,将硬件驱动设计和系统程序设
计分开。
嵌入式技术与应用专业教学资源库
开发平台文件系统介绍
 1、在UP-TECH2410开发平台中,用到的对yaffs文件系统操作的函
数有下面几个,fopen ()函数以指定模式打开文件;fRead ()函数读取
已打开文件数据到指定缓冲区;fWrite()函数将指定缓冲区的数据写入
到文件;readline ()函数读取文本文件的一行字符;fClose()函数关闭
文件,释放文件缓冲区。
UP-TECH2410文件系统相关操作函数:
 文件的打开(fopen函数)
 fopen函数用来打开一个文件,其调用的一般形式为:
文件指针名=fopen(文件名,使用文件方式);
其中, “文件指针名”必须是被说明为FILE 类型的指针变量;
“文件名”是被打开文件的文件名;
“使用文件方式”是指文件的类型和操作要求。
“文件名”是字符串常量或字符串数组。
 使用文件的方式共有12种,下面给出了它们的符号和意义。
– “rt” 只读打开一个文本文件,只允许读数据
“wt” 只写打开或建立一个文本文件,只允许写数据
“at” 追加打开一个文本文件,并在文件末尾写数据
“rb” 只读打开一个二进制文件,只允许读数据
“wb” 只写打开或建立一个二进制文件,只允许写数据
“ab” 追加打开一个二进制文件,并在文件末尾写数据
嵌入式技术与应用专业教学资源库
开发平台文件系统介绍
 另外6种,其符号和意义如下。
– “rt+” 读写打开一个文本文件,允许读和写
“wt+” 读写打开或建立一个文本文件,允许读写
“at+” 读写打开一个文本文件,允许读,或在文件末追加数据
“rb+” 读写打开一个二进制文件,允许读和写
“wb+” 读写打开或建立一个二进制文件,允许读和写
“ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据
嵌入式技术与应用专业教学资源库
开发平台文件系统介绍
 文件关闭函数(fclose函数)
文件一旦使用完毕,应用关闭文件函数把文件关闭,以避免文件的数据
丢失等错误。 fclose函数调用的一般形式是:fclose(文件指针);
 读字符函数fgetc
fgetc函数的功能是从指定的文件中读一个字符,字符读写函数是以字符
(字节)为单位的,函数调用的形式为: 字符变量=fgetc(文件指针);
 写字符函数fputc
fputc函数的功能是把一个字符写入指定的文件中,字符读写函数是以字
符(字节)为单位的,函数调用的形式为: fputc(字符量,文件指针);
嵌入式技术与应用专业教学资源库
开发平台文件系统介绍
 数据块读写函数fread和fwtrite
C语言还提供了用于整块数据的读写函数。可用来读写一组数据,如一
个数组元素,一个结构变量的值等。
 读数据块函数调用的一般形式为: fread(buffer,size,count,fp);
 写数据块函数调用的一般形式为: fwrite(buffer,size,count,fp);
其中:
– buffer 是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数
中,它表示存放输出数据的首地址。
– size 表示数据块的字节数。
– count 表示要读写的数据块块数。
– fp 表示文件指针。
嵌入式技术与应用专业教学资源库
开发平台文件系统介绍
 2、在UP-TECH3000平台,使用文件系统之前必须通过initOSFile()函
数初始化文件系统,为文件缓冲区分配存储空间。FILE 是一个文件
相关的结构体,定义如下:
typedef struct{
U8 Buffer[Block_Size];
//文件缓冲区32*1024
U32 fileCluster;
//文件当前的簇的位置
U32 filemode;
//打开文件的模式
U32 filebufnum;
//文件缓冲区中已经读取/写入的字节数
U32 fileCurpos;
//读写的当前位置
U32 filesize;
//文件的大小
}FILE;
嵌入式技术与应用专业教学资源库
文件系统使用
流程图:
嵌入式技术与应用专业教学资源库