分享

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

 新用户0118F7lQ 2023-07-18 发布于山东

大家好,今天介绍一款适用于单片机的嵌入式文件系统 -- znFAT。

这款文件系统由嵌入式大佬于振南开发,并在 gitee 开源共享的。

gitee仓库地址为(复制到浏览器打开):

https:///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与作者均不承担任何后果与责任。

资源获取:

(1)自己从 gitee 仓库拉取。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多