定义大小端模式转换程序。单片机对于字或双字数据的存储多采用大端模式,而绝大多数PC机为小端模式。U盘中的文件管理由于要兼容PC机,存储格式几乎均为小端格式。因此进行U盘数据操作时,如果读写字或双字数据,则必须进行大小端模式转换。
FAT表基本操作,包括查找空簇、读写指定簇内容。可编写子函数来解决查找空簇的问题,设计思路为读取FAT表特定扇区,然后按FAT类型不同分情况讨论。从第2簇开始,将代表特定簇的单元逐个与0比较,若不为0,则偏移地址作相应移动,例如FAT16每次移动2字节,而FAT32为4字节;至于FAT12,由于每12比特表征一簇,必须考虑FAT扇区的“边界问题”(如图4所示),需判断簇的奇偶性、设置边界校验标志,以解决边界问题。对给定簇号以读写FAT表对应单元的问题,也可编写子函数进行解决,该函数需要指定簇号、待写内容,还要给定输出指针变量。执行时根据簇号计算指定簇号所在扇区地址,将其读出,然后另存指定簇的内容,写入新内容,最后将修改后的扇区数据重新写入U盘原位置。为了使程序精简,还可将读指定簇内容的子程序与该函数并成单个子函数,考虑到待写内容即使在FAT32下,其有效值也不会超过0x0fffffff,因此编写程序时,可以均将其定义为双字类型,然后设定某值,例如0xf0000000,若待写内容为此值时,则不写入该簇内容,这样就保证了对FAT表只读不写。
最后,对FDT表进行基本操作及文件的创建、读写。根据文件系统有无根目录区,分情况读取FDT特定扇区。分析扇区数据时,如果待查看文件与待写入文件重名,则要读出文件首簇号及大小,到FAT表找到文件末簇,接着根据文件大小,判断待添加内容在簇中哪个扇区、扇区的哪个位置,读出并修改该扇区内容,然后重新写入,最后修改文件大小。