良许Linux教程网 干货合集 一款适用于单片机的国产嵌入式文件系统

一款适用于单片机的国产嵌入式文件系统

今天我想向大家介绍一款专为单片机设计的嵌入式文件系统——znFAT

这个文件系统是由嵌入式领域的专家于振南开发的,并且已经在 gitee 上进行了开源分享。

你可以通过访问以下 gitee 仓库地址来获取更多关于这个文件系统的信息(请复制链接到浏览器中打开):

https://gitee.com/dbembed/znfat
image-20240403230554663
image-20240403230554663

一、介绍

znFAT 并非一个标新立异的东西,它绝大部分与现行的微软 FAT32 文件系统高度兼容。这意味着,它可实现与Windows、Linux等主流操作系统之间的文件无界互通。

znFAT 因其独特的嵌入式应用背景与功能需求,在设计与实现上都引入了大量的创新思想与技术,其中所流露出来的各种开发技巧,对于广大工程师更是一笔巨大的精神与知识财富。

代码目录文件:

image-20240403230550498
image-20240403230550498

其中 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单片机为例,类型重定义如下:

image-20240403230545236
image-20240403230545236

2、存储设备物理扇区读/写驱动

znFAT 的整体结构分为3层:物理层、实现层、应用层。

image-20240403230541821
image-20240403230541821

物理层是整个 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”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部