嵌入式文件系统znFAT介绍

嵌入式技术

1332人已加入

描述

今天给大家介绍一款适用于单片机的嵌入式文件系统——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与作者均不承担任何后果与责任。

 

  审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分