这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » [推荐]51 flash文件系统DIY(5)___FAT揭秘

共1条 1/1 1 跳转至

[推荐]51 flash文件系统DIY(5)___FAT揭秘

菜鸟
2002-10-22 22:17:38     打赏
文件系统的资料,容易找到的就是有关FAT文件系统的资料,毕竟FAT文件系统伴随着 DOS,WINDOWS95,WINDOWS98,直到今天有些电脑上还在使用。FAT比起其他文件系统 NTFS,EXT2,FAT32来说要简单多了,也容易实现。 对于计算机的硬盘,因为要引导系统,所以还有BOOT区,分区表等等,这些东西在我们 的单片机上都用不着,咱们把它统统Cut掉,免得自找麻烦。硬盘对空间管理的核心就是文件 分配表(FAT),为了存储不同的文件和目录结构还有一个表也十分重要,就是文件目录表 (FDT)。这两个表一般都保存在硬盘每个分区的开头几个扇区之中。所以啦,我们的flash文 件系统自然也会有这样两张表存放在flash前面的几个扇区。 FAT的原理:学计算机基础的时候讲过,硬盘表面分成了很多磁道(柱面),每条磁道又分为若干 扇区,硬盘的读写就是按扇区进行,一般硬盘每扇区为512字节。 在FAT文件系统中,把硬盘把整个空间划分为很多的逻辑块,每块包含若干扇区,这样 的块叫做簇(叫起来有点别扭)。簇的大小是由硬盘在分区的时候决定的。这样整个硬盘就有 好多好多的簇,每个簇对应有一个簇号,假如簇号用一个16位的整数来表示的话(就是 FAT16),就一共能表示65536个簇。簇是文件存储的最小单位,这我们已经在第一回说过了 就像我们第一回所说的那样。簇当然是越小越好。对于一个80GB的硬盘来讲(这两天硬盘价 格涨飞了,80G由800RMB多涨到1000多,辞了工作去卖硬盘或许是个不错的主意),如果用 FAT16文件系统来管理硬盘,由于FAT16最大只能表示65536簇,所以每簇的空间将为 (80*1024*1024)/65536=1280Kbyte。这样即使有一个文本文件只有几个字(byte),他也将占 据1280Kbyte的空间,那可是将近1.3M哇。所以才有了后来的FAT32,使用FAT32可以节省硬 盘空间,同时FAT32不知道在哪里改进了一下(如何改进的我也没看过资料所以不知道),支持 长文件名。我们的flash文件系统管理的空间可没有那么大,29C040只有区区512K,可以用 FAT12,FAT13,但是这些非整数字节的簇号太难处理,所以咱们的flash文件系统就用FAT16, 程序里用一个int就可以表示了。FAT表又是什么呢? FAT表在这里就像个大的数组,硬盘上 有多少个簇,这个数组的元素就有多少个。数组元素在数组中的位置就是他代表的簇在硬盘 上的位置。 计算机把文件占用的簇的簇号放到FAT中,所以这个表就叫做文件分配表。一开始FAT表 是空的数据全部都是0x0000或者0xffff。 我们来看一下计算机在写文件的时候如何对FAT表操作。计算机要向文件写数据,先要 到FAT表中找到一个空闲的簇,并往里面写数据,写满后,再到FAT表中寻找下一个空闲的 簇,找到之后先把簇号填到刚才写满的那个簇在FAT表中的对应位置,然后继续写,写满之 后再找一个空闲簇,然后再把这次找到的簇的簇号填到我们刚刚写完的那个簇在FAT表中的 对应位置,这样下去直到写完,然后我们把最末尾的簇在FAT表中的对应位置标为0xfff8表 示结束。 而在读文件的时候,只要我们找到了文件的第一簇的簇号,然后就可以在FAT表中的对 应位置找到下一簇的簇号,这样一直下去直到遇到0xfff8。这就好像是一条簇链,一条单向 的簇链表,找到了头,就能顺序找到尾。这就是FAT表管理空间的原理. 从刚才我们的讲述来看要找到头(首簇)才能找到尾.所以我们要保存文件的首簇的簇号, 才能逐簇读取文件的所有数据.你打开你的电脑看看一个文件都有哪些特性呢? 首先,就像我们人一样,每个文件肯定都要有一个名字吧?在FAT16中文件名是8.3格式 的,即最多允许8个字符作为文件名,额外的3个字符作为扩展名. 再有,每个文件都有自己的建立时间和修改时间.当然在我们的flash文件系统中这两个 属性可以不要,我们连时钟芯片都没有,自然时间这个东西就没有办法登记了. 还有就是文件的大小和属性.文件的大小是一个32位的长整形数,所以在FAT16中最大的 文件不能超过4GB,4GB大小对于一般的文件也够用了,但是对于现在的高清晰的影音文件,图 像数据,4GB还是有点小,不知道在FAT32文件系统中文件最大可以有多大。文件的属性有4种, 分别是只读,隐藏,文档,系统。这几种属性的含义也不用说了吧,相信大家都明白。起始 文件还有另一个属性,就是目录属性,如何分辨一个文件到底是“文件”还是“目录”就是由 这个属性决定的。这个属性一般由系统来处理。所有的属性都放在了一个字节当中,占用了 1个bit 最重要的一点,就是我们要记录文件的起始簇,了他是我们访问整个文件的钥匙。 要完全存储一个文件,就还要存储上面我们所列举的这些附加属性。我们用一个结构体来具 体的描述一下文件的这些属性,并用typedef来定义一个描述文件属性的结构类型。这个结构 和DOS下的文件记录描述是一致的。由于我们接下来要编写和FAT系统相关的函数所以我们把 这些结构定义都放到一个叫fat.h的头文件中。 #ifndef _FAT #define _FAT typedef struct { unsigned char filename[8]; /*文件名 */ unsigned char ext[3]; /*扩展名 */ unsigned rdonly : 1; /*只读属性 */ unsigned hide : 1; /*隐含属性 */ unsigned sys : 1; /*系统属性 */ unsigned label : 1; /*卷标标志 */ unsigned dir : 1; /*目录标志 */ unsigned arc : 1; /*存档属性 */ unsigned res : 2; /*保留位 */ unsigned char reserve[5]; /*保留 */ unsigned int modtime; /*文件修改时间 */ unsigned int mdodate; /*文件修改日期 */ unsigned int createtime; /*文件创建时间 */ unsigned int createdate; /*文件创建日期 */ unsigned int startclu; /*起始簇号 */ unsigned long filesize; /*文件大小 */ }FDT_REC; #endif 今天就先讲这么多,明天就是周末了,周六周日不上班,所以我们下周再见! Taowa 2002.10.17 Email:taowa@263.net



关键词: 推荐     flash     文件     系统     揭秘     硬盘     所以         

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]