今天我想向大家介绍一款专为单片机设计的嵌入式文件系统——znFAT。
这个文件系统是由嵌入式领域的专家于振南开发的,并且已经在 gitee 上进行了开源分享。
你可以通过访问以下 gitee 仓库地址来获取更多关于这个文件系统的信息(请复制链接到浏览器中打开):
https://gitee.com/dbembed/znfat
一、介绍
znFAT 并非一个标新立异的东西,它绝大部分与现行的微软 FAT32 文件系统高度兼容。这意味着,它可实现与Windows、Linux等主流操作系统之间的文件无界互通。
znFAT 因其独特的嵌入式应用背景与功能需求,在设计与实现上都引入了大量的创新思想与技术,其中所流露出来的各种开发技巧,对于广大工程师更是一笔巨大的精神与知识财富。
代码目录文件:
其中 znFAT.c 与 znFAT.h 是 znFAT 的主体。前者是对各种功能函数的具体实现,后者对相关数据结构、宏进行定义。
-
mytype.h 对数据类型进行重定义; -
deviceio.c 通过一些底层函数接口与存储设备扇区读写驱动进行对接; -
congfig.h 可以对 znFAT 进行相关的配置。
相关的头文件是 znFAT 在实现过程中要使用的一些代码资源,比如汉字码表、功能扇区模板数据等。
二、关键代码解析
znFAT_Init
函数(在znFAT.c文件中)功能:
文件系统初始化函数,将完成文件系统初始化参数集合的装入,为以后的文件操作作好准备。
1、定位 DBR 扇区(主要是找到 BPB 所在扇区)
读取物理 0 扇区通过判断是否是MBR扇区,若是 MBR 则从中提取B PB 扇区号,若不是 MBR 而是DBR则BPB扇区号为0;
判断是否是 MBR 的依据是前三个字节是否是:
DBR_MARK {0XEB,0X58,0X90} //DBR的标志码
2、得到BPB所在扇区号后,通过读取 BPB 扇区得到文件系统的信息
首先,判断此文件系统的类型是否是 FAT32 文件系统,若是FAT32文件系统则依据读出BPB来填充全局结构体。
UINT32 BPB_Sector_No; //DBR(BPB)所在扇区号
UINT32 BytesPerSector; //每个扇区的字节数
UINT32 FATsectors; //FAT表所占扇区数
UINT32 SectorsPerClust; //每簇的扇区数
UINT32 FirstFATSector; //第一个FAT表所在扇区
UINT32 FirstDirSector; //第一个目录所在扇区
UINT32 Total_SizeKB; //磁盘的总容量,单位为KB
然后查找 FSINFO 信息,若找到FSINFO扇区则依据读出的内容填充结构体。
UINT32 FSINFO_Sec; //FSINFO扇区所在的扇区
UINT32 Free_nCluster; //空闲簇的个数
UINT32 Next_Free_Cluster; //下一空簇
如果一个磁盘格式化后没有卷标,则其存储空间就没有一点占用,此时FSINFO记录的剩余空簇数为 XFFFFFFFF。
三、znFAT的移植
移植过程比较简单,主要有两步:
-
数据类型重定义与ROM数据读取函数的实现; -
存储设备物理扇区读/写驱动。
1、数据类型重定义与ROM数据读取函数的实现
根据目标平台实际的数据类型对 mytype.h 中的类型进行重新定义,包括无符号整型、有符号整型与ROM数据类型。
存储在芯片 ROM 中的数据,比如汉字编码表,就是ROM数据类型。
以STM32单片机为例,类型重定义如下:
2、存储设备物理扇区读/写驱动
znFAT 的整体结构分为3层:物理层、实现层、应用层。
物理层是整个 znFAT 的根基,znFAT 通过它来操作存储设备,为其正常运转提供扇区读/写服务。
移植工作主要在实现和调试物理层,只要物理层没问题,那么后续工作就很简单了。
znFAT在物理层只留出一个设备驱动接口,不关心实际是什么存储设备,也不关心驱动程序实现的具体细节,它只认识扇区地址与标准的 512 字节的扇区数据。
四、常见问题
1、znFAT的稳定性、正确性等指标是如何保证的?
znFAT 自发布之后基本没有出现过问题。在实际工程项目中的应用也有很多,经历了诸如大数据量、长时间、频率读/写等严峻的尝试,最终表面它是没有问题,且是稳定的。
2、znFAT能否应用于FlashROM或U盘,还是只能用于SD卡?
znFAT 对物理存储设备进行了抽象,它根本不关心具体存储设备是什么,只关心是否能够通过连续的地址正确读/写它的扇区。
3、znFAT编译之后,超出了的单片机的ROM和RAM容量怎么办?
znFAT 本身占用的 RAM 资源最小可达到 900 字节,最多 1300 字节左右;ROM资源占用一般为 20~60KB。
影响他们的主要原因为:znFAT 的不同工作模式;目标芯片CPU与编译器的差异。
4、znFAT是否支持长文件名?
znFAT 对长文件名的支持非常全面,使用者可以对长文件名的最大长度进行配置,以面用于存储长文件名的缓冲区占用过多内存。
另外,该文件系统还设计了长文件名功能的总开关,关闭之后将不再支持长文件名功能。
5、znFAT是否允许进行商业应用?
znFAT是完全免费、自由而且长期有人维护与改进的开源项目。但是对于商业应用,znFAT与作者均不承担任何后果与责任。
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !