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;
嵌入式技术与应用专业教学资源库
文件系统使用
流程图:
嵌入式技术与应用专业教学资源库