今天给大家介绍一款适用于单片机的嵌入式文件系统——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与作者均不承担任何后果与责任。
科技圈大佬“两会”提案新鲜出炉:科技创新仍是重中之重
多模多频通讯需求剧增 SDR系统开发平台市场看涨
CO2传感器在日常生活的应用
2005中国(广州)国际绝缘材料展览及会议
哪些因素影响阻抗控制?网格铜的妙用
嵌入式文件系统znFAT介绍
FPC的组成材料有哪些?FPC基本结构材料介绍
rk3566和骁龙810参数对比
如何使用卡西欧f-91w运动手表
CAN总线镍氢电池管理解决方案
金属探测仪的工作原理
6月2日见!华为鸿蒙首批升级机型名单曝光
MSPM0L1306之迁移工程
各大厂商都相继发布了新款手机,这些新机都有什么新亮点呢?
光敏电阻器浓度测量仪电路
探讨军用雷达发展史和新体制雷达发展方向
药企从医潮后 2016年从械潮会来吗?
联合创新,芯瞳携手旌宇打造国产化首个多屏显卡产品矩阵
优化用于实时语音和视频的SD-WAN
教育部提出“三步走” 推动高校聚焦“新一代人工智能”研究