振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(3)

news2024/11/26 10:18:25

注解目录

1、znFAT 的起源

1.1 源于论坛

(那是一个论坛文化兴盛的年代。网友 DIY SDMP3 播放器激起了我的兴趣。)

1.2 硬盘 MP3 推了我一把

(“坤哥”的硬盘 MP3 播放器,让我深陷 FAT 文件系统不能自拔。)

1.3 我的导师-- 顾国昌教授

(哈军工时期的老教授,德高望重的人生导师。)

1.4 我的母校-- 哈工程

(隐藏牛校哈工程,网络名嘴张雪峰所言非虚。振南给你讲讲母校历史:哈军工、

工程学院、哈船院、哈工程。)

1.5 那场严重超时的答辩会

(20 分钟的答辩超时 1 小时,老师表示赞叹。现场承诺要把文件系统写成书。)

1.6 时隔多年的谢师会

(承诺必须兑现,5 年之后的谢师会,我擎书谢师。不要轻易作出承诺,除非你真

得能作到!)

2、高手如云 认清对手

2.1 国外 FAT 方案简介

1 )FATFS

2 )EFSL

3 )UCFS

4 )TFFS

5 )DOSFS

(列举那些主流 FAT 文件系统方案,并进行详细介绍。)

2.2 国内 FAT 方案简介

1 )ZLG/FS

2 )沁恒 FAT

(国内尚无成型开源的 FAT 文件系统方案。但是我们要支持国货。)

3、硬刚高手 挑战自己

3.1 与高手竞速

3.2 挑战自己

(这一节我写了一个月。环比各大知名方案,看看到底谁更快!最终,挑战了自我。)

4、znFAT 精彩应用大赏

4.1 振南的精彩实验

4.1.1 SD 卡 卡 WAV 音频播放器

4.1.2 SD 卡电子滚动屏

4.1.3 SD 卡 卡 MP3 播放器

4.1.4 AT89S51 离线下载器

4.1.5 数据采集导入 EXCEL

4.1.6 串口文件窃取器

4.1.7 录音笔于 (基于 VS1003B) )

4.1.8 文件无线传输实验

4.1.9 嵌入式脚本程序解释器

4.1.10 绘图板实验(基于 STM32F4 ,屏幕截图存为 BMP 图片)

4.1.11 MEMS 声音传感器“ 硅麦” 录音实验

(znFAT 的最大亮点在于各种精彩的应用,希望振南的这些实验可以让你眼前一亮。)

4.2 精彩的第三方项目应用

4.2.1 仿 仿 Metro UI 系统应用实验

4.2.2 通过 U 盘对产品进行升级

4.2.3 嵌入式网页服务器

4.2.4 STM32+LD3320 作声控音频播放器

4.2.5 BMP 图片浏览

4.2.6 VGA 显示 SD 卡中的图片(基于 FPGA) )

4.2.7 汉字电子书(基于 STM8) )

4.2.8 文本语音合成实验(TTS ,基于 NUC120) )

4.2.9 《跳跃小猫》动画播放(基于 FPGA NIOSII)

高手如云 认清对手

在经历了后期的深度迭代之后,znFAT 的整体性能已今非昔比。振南创造了一些算法比如CCCB(压缩簇链缓冲)和 EXB(交换缓冲)等。有兴趣?赶紧去看《嵌入式FAT32 文件系统设计与实现--基于振南 znFAT》一书。

我曾经被频繁问到一个问题:“znFAT 的性能到底怎么样?”

正所谓“有图有真相”没有比较就没有真相。于是我做了一个“环比大测试”。(就是将znFAT 与各大知名方案进行较量,看看到底谁更快。)

要做较量,我们先要了解一下对手。现在比较有名的优秀方案有 FATFSEFSL、UCFSTFFS、DOSFS、ZLG/FS沁恒 FAT 等。其实很多人都对 FAT 很感兴趣,这些兴趣可能来自于对 FAT 及其相关算法、思想、编程技巧的好奇,或者是项目和产品的需求。其中一些高手也写出了自己的 FAT 方案,比如在 amoBBS(原 OurAVR)上用 AVR 单片机 DIY MP3的BoZai,再比如许乐达同学作的 xldFAT,还有号称中国第一的 cnFAT 等。对于这些方案我们首先进行一个简介。

2.1 国外 FAT 方案简介


1.FATFS

这里直接引用 chaN(FATFS 的作者,身在日本)在其网站上对 FATFS 的简介:FATFS是一个通用的文件系统模块,用于在小型嵌入式系统中实现 FAT 文件系统。FATFS 的编写遵循 ANSIC,因此不依赖于硬件平台。它可以嵌入到各种价格低廉的微控制器中,如 8051,PIC,AVR,SH,Z80,H8,ARM 等,而不需要做任何修改。

对于 FATFS 我要说:它确实很牛!无论在功能的完善程度上,还是在代码的运行效率上,以及可移植性上都可称得上是众多现有优秀方案中的佼佼者(到底有多优秀,大家到后面就能看到了)。FATFS 一度是振南研发和推广 nFAT 道路上的最大劲敌(其实现在也是,估计未来也还是。我们不能一味地偏祖自己,要正视与别人的差距)。

起初,我认为 FATFS 的作者是个绝顶聪明的人。但是,在看了他代码中的研发编年史之后,我改变了这种想法:他在把 FAT 当作毕生事业来做,一辈子就做这一件事。FATFS 的研发始于 2006 年,一直到现在还在不断更新和改进。真可谓十年磨一剑了! 但是,经过对FATFS 的深入研究之后,我发现它并非像想象中的那么完美,仍然存在着很多问题,其中有一些可谓“硬伤”。

(1)它最低需要 1.3KB 左右的内存,导致在一些低端处理器上无法使用(其根源在于其数据缓冲的实现策略);

(2)它没有实时模式,始终会有数据暂存于内存之中,如果突然断电或 CPU 死机,必然造成数据丢失;

(3)物理层接口比较复杂,而且必须由使用者提供多扇区读/写驱动的实现;

(4)代码可读性不强,使用者很难了解其内部实现,导致一旦出现 Bug,很难立即解决;

(5) 纯开源软件,因此缺乏原作者的相关技术支持与指导,只能靠使用者自行领悟。

2.EFSL

EFSL的全称是 Embeded File System Library,即嵌入式文件系统库。它是来自 sourceforge 上的由比利时的一个研究小组发起的开源项目,此项目正在持续更新,源码中也有很多注释,研读起来比较容易,潜力不错。EFSL 兼容 FAT32,支持多设备及多文件操作。每个设备的驱动程序,只需要提供扇区写和扇区读两个函数即可。

据说,EFSL 的效率是非常高的。但是它的物理层接口只支持单扇区读/写,并没有多扇区的接口。(所谓多扇区,是指存储设备可以一次性读写连续的多个扇区的能力,这比单独一个个扇区去读写速度要快得多,而在文件读/写时,很多时候数据基本都是连续的。)所以,我很纳闷它的效率再高能高到哪去?同时,还要看它所占用的内存量。就算它的效率确实很高,但是以较高的内存消耗为代价的,我认为也不足为取。不过,一切还是要以实测结果为准

3.UCFS

UCFS 可能有些人并不太熟悉,但是提起 ,C/OS 大家一定有所耳闻,它们都来自于 Micrium 公司。出身名门,其代码质量、稳定性及可移植性自然无可挑剔。不过它并非开源项目,而是商用软件。想要用它,拿银子来!从性能和执行效率上来说,我并不认为 UCFS 会有多好,因为它的物理层驱动接口也只支持单扇区读/写,而无多扇区驱动。

4.TFFS

可能很多人对于 TFFS 连听都没听说过。但是如果提起 VxWorks,大家就会耳熟能详TFFS 就是专门服务于 VxWorks 的文件系统,全称为 True Flash File System。TFFS 可以在Flash 存储设备上构建一个基于 DOS 的文件系统(即 FAT),用于存放操作系统镜像以及应用程序,以便于程序的更新和升级。因为我本人长期从事 VxWorks 的相关研发工作,因此对于TFFS 所带来的便捷深有感触。不过,TFFS 基本上是与 VxWorks 绑定的想要把它从中提取出来为我们所用,难度较大。而且,它也不是免费软件,我们不能私自使用。

5.DOSFS

DOSFS 是由美国一个叫 Lewin A.R.W.Edwards 的人研发的。(这个人好像还出了一本书叫《嵌入式工程师必知必会》,大家有兴趣可以看看,见图 18.6。)从它的名字上可以看出来,Lewin 是想在嵌入式微处理器上实现一个类似 DOS 的系统,其实质就是 FAT 文件系统。从它的代码来看,也只是一个雏形,功能还比较少,配套的 文档资料也不够齐全。关于



图 18.6 Lewin A.R.W.Edwards 的《嵌入式工程师必知必会》一书

DOSFS ,我没有实际用过,不过我见过有人把它用在了产品里,似乎还比较稳定

2.2 国内 FAT 方案简介


上面介绍了几种比较流行而知名的嵌入式 FAT 文件系统方案,它们均来自国外。我们不禁要问:“国货在哪里?”别着急,国货必须有,请看下文。(国内的文件系统方案其实也不是没有,但是真正开源而且成型的很少。

1.ZLG/FS

ZLG/FS,顾名思义,就是周立功公司研发的文件系统方案,说得更准确一些应该是周立功公司的 ARM 研发小组的成果。它是以 uC/OS 入式操作系统的一个中间件方式出现的,也就是说它可以与pC/OS 很好地进行协同工作。它也是一个开源的软件,在国内嵌入式平台上,尤其在 ARM 平台上得到了较为广泛的应用。但是,ZLG/FS 的数据读/写速度实在让人堪忧。仔细研读它的源代码,我们就会发现它在实现上所使用的一些策略导致了它的效率低下。也许,这样的文件系统方案,只能供我们学习之用,要真正应用于实际工程项目还有一定的差距。

2.沁恒 FAT

南京沁恒公司的 FAT 方案做得不错。提起沁恒,似乎有点耳闻。那我再提醒你一下:CH375 芯片。对,它是专门用于读/写U 盘等USB 存储设备的控制器芯片,沁恒 FAT 文件系统就是与这个芯片配套绑定的,用于实现 U 盘上的文件操作。

CH375 已经算是一个经典芯片,凡是有 U 盘读/写需求的中低端项目我估计有一半以上都在用这个芯片。可以说,沁恒 FAT 是嵌入式 FAT 文件系统商业化的一个典范。不过遗憾的是,沁恒 FAT 是纯商业软件,我们是看不到半点源代码的。我感觉,FAT 文件系统业已成为沁恒公司的一大产品和技术支柱,这也揭示了嵌人式 FAT 文件系统在功能需求以及市场价值上的巨大潜力。

总体来说,国内在嵌入式文件系统方面的研究仍然起步较晚,而且在原创开源与创新意识上远远落后于国外。国内的很多开发者一直秉承着“拿来主义”,但是这样我们不会有任何发展。好好想想,我们平时使用的芯片、软件操作系统等,有多少是国产的? 我们所说的“自主”研发,有很多只不过是在仿制、引用或者汉化而已。让我们真正的动起来,做出属于我们自己的东西!

支持国货,支持中国芯片,相信中国半导体产业和自主软件生态能强劲崛起

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1260027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】【选择排序及其优化】

选择排序是指:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾&#xff0…

Golang 设置运行的cpu数与channel管道

介绍:为了充分了利用多cpu的优势,在Golang程序中,设置运行的cpu数目。 func main() {//获取系统当前cpu的数量num : runtime.NumCPU()//这里根据需求来设置整个go程序去使用几个cpuruntime.GOMAXPROCS(num)fmt.Println("num ", nu…

csgo/steam搬砖项目还能不能做,分享玩法思路

饰品市场持续下跌,CSGO搬砖还有搞头吗? CSGO是最具竞争力的第一人称射击游戏。玩这款游戏离不开里面的炫酷配件。Steam搬砖项目是基于CSGO游戏中的配件运动。蒸汽拆砖项目的原理是使用国外Steam平台的充值卡购买国际服务器的配件和设备,然后转…

quasar杂记

Windows下的奇怪错误 Unknown network error occurred 管理员运行powershell,运行: net stop winnat net start winnat

图书管理系统源码,图书管理系统开发,图书借阅系统源码四TuShuManager应用程序MVC控制器Controllers

Asp.net web应用程序MVC之Controllers控制器 Controller在ASP.NET MVC中负责控制所有客户端与服务器端的交互,并且负责协调Model与View之间的数据传递,是ASP.NET MVC的核心。 撰写Controller的基本要求: 1、Controller必须为公开类别; 2、Controller名称必须以Controller结…

如何在VS2022上的MFC项目中操作Excel(VS2010、VS2012、VS2015、VS2017、VS2019使用方法一样)

先决条件 本机安装office2003、2007、2010、2016及以后版本,总之必须安装office导入Excel库文件,导入方式可参考: 如何在vs2017及以前版本(vs2010、vs2015)上添加 添加类型库中的MFC类如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控…

【TinyALSA全解析(四)】扩展篇-从TinyALSA到底层音频驱动的全流程分析

扩展篇-从TinyALSA到底层音频驱动的全流程分析 第一节 本文说明第二节 声卡驱动统一入口进行ops替换过程2.1 tinyalsa到Linux kernel2.2 Linux Kernel中,由主设备号ops分流到次设备号ops 第三节 次设备中file_operations的open函数3.1 本节主要内容3.2 为何次设备的…

Python生成exe文件

Python如何生成exe文件 在终端执行 pip install pyinstaller 在终端执行pyinstaller E:\fund_data\GetFund.py,运行结束后会在D:\Python\Python311\Scripts\dist\目录下生成GetFund.exe文件 3.双击exe文件运行,如果未出现预期结果,可以把e…

深度学习之图像分类(十五)DINAT: Dilated Neighborhood Attention Transformer详解(一)

Dilated Neighborhood Attention Transformer Abstract Transformers 迅速成为跨模态、领域和任务中应用最广泛的深度学习架构之一。在视觉领域,除了对普通Transformer的持续努力外,分层Transformer也因其性能和易于集成到现有框架中而受到重视。这些模…

NAS-DIP: Learning Deep Image Prior with Neural Architecture Search

NAS-DIP: 用神经结构搜索学习深度图像先验 论文链接:https://arxiv.org/abs/2008.11713 项目链接:https://github.com/YunChunChen/NAS-DIP-pytorch Abstract 最近的研究表明,深度卷积神经网络的结构可以用作解决各种逆图像恢复任务的结构…

CGAN原理讲解与源码

1.CGAN原理 生成器,输入的是c和z,z是随机噪声,c是条件,对应MNIST数据集,要求规定生成数字是几。 输出是生成的虚假图片。 判别器的输入是 1.生成器输出的虚假图片x; 2.对应图片的标签c 来自真实数据集,且…

大模型下交互式数据挖掘的探索与发现

在这个数据驱动的时代,数据挖掘已成为解锁信息宝库的关键。过去,我们依赖传统的拖拉拽方式来建模,这种方式在早期的数据探索中起到了作用,但随着数据量的激增和需求的多样化,它的局限性逐渐显露。 >>>> 首…

selenium已知一个元素定位同级别的另一个元素

1.需求与实际情况 看下图来举例 (1)需求 想点击test22(即序号-第9行)这一行中右边的“复制”这一按钮 (2)实际情况 只能通过id或者class定位到文件名这一列的元素,而操作这一列的元素是不…

知识变现的未来:解析知识付费系统的核心

随着数字时代的发展,知识付费系统作为一种新兴的学习和知识分享模式,正逐渐引领着知识变现的未来。本文将深入解析知识付费系统的核心技术,揭示其在知识经济时代的重要性和潜力。 1. 知识付费系统的基本架构 知识付费系统的核心在于其灵活…

为什么要用 Redis 而不用 map/guava 做缓存? Redis为什么这么快 Redis有哪些数据类型 Redis的应用场景

文章目录 为什么要用 Redis 而不用 map/guava 做缓存?Redis为什么这么快Redis有哪些数据类型Redis的应用场景总结一计数器缓存会话缓存全页缓存(FPC)查找表消息队列(发布/订阅功能)分布式锁实现 总结二 简单的聊聊Redis常见的一些疑问点:具体…

预算削减与经济动荡:2024 年明智且经济地创新

如何在经济衰退周期中保持创新?这篇创新研究提供了实用建议。在经济下行压力下领导者往往会试图降低成本和维持生存。然而,这种二元对立的压力往往会导致领导者做出不够理想的决策,更多地关注生存而不是未来投资。本文提供了一系列实用的建议…

蓝桥杯-平方和(599)

【题目】平方和 【通过测试】代码 import java.util.Scanner; import java.util.ArrayList; import java.util.List; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在…

MATLAB中FFT频谱分析使用详解

文章目录 语法说明语法一:Y fft(X)fft(X)返回X长度的傅里叶变换 语法二:Y fft(X,N)如果 X的长度小于 N,则为 X补上尾零以达到长度 N(FFT插值)双边谱转换为单边谱 如果 X 的长度大于 N,则对 X 进行截断以达到长度 N。 语法三&…

根据密码构成规则检测密码字符串

从键盘输入密码字符串,程序根据给定密码构成规则检测并给出对应提示。 (笔记模板由python脚本于2023年11月27日 19:27:47创建,本篇笔记适合熟悉Python字符串str对象的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.…

ViLT 论文精读【论文精读】

ViLT 论文精读【论文精读】_哔哩哔哩_bilibili 目录 ViLT 论文精读【论文精读】_哔哩哔哩_bilibili 1 地位 2 ViLT做了什么能让它成为这种里程碑式的工作? 3 ViLT到底把模型简化到了什么程度?到底能加速到什么程度? 2.1 过去的方法是怎…