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

注解目录

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)

3

硬刚高手 挑战自己

列举了这么多的方案,是不是感觉 nFAT 其实很渺小。尽管如此,nFAT 还是要向它们发起挑战。也许,它可以像《兵临城下》中的瓦西里一样将敌人个个秒杀。你看到战火硝烟了吗?

3.1 与高手竞速


下面我们就从诸多方案中选取两个最具代表性的方案(FATFS 与 EFSL)来与 nFAT 进行较量,同时还要兼顾它们在空间方面(ROM 与 RAM)的占用情况。

在这场较量之中,我们会让各个方案都运行在各自最高速的极限状态下。谁能做到既省内存,速度又快,谁就是真正的胜者

测试方法很简单,我们用它们向文件中写入相同长度的数据,看看它们分别会花费多少时间。在具体测试方法的细节上,分为以下 4 种情况。

(1)向文件写入 10 000 次数据,每次数据量 512 字节;

(2)向文件写入 10 000 次数据,每次数据量 578 字节;

(3)向文件写入 1 000 次数据每次数据量 5678 字节(不使用硬件多扇区驱动)(4)向文件写入1000 次数据,每次数据量 5678 字节(使用硬件多扇区动)。

有人可能会问:“为什么要分这 4 种情况?它们各有什么用意呢?”前两项可以测出小数据量频繁写入时的效率表现,(2)比(1)多出了 55 个字节的不足扇区数据(很多时候这个数据尾巴是造成效率不高的原因);后两项则可以用于测试在频繁大数据量写人时,文件系统方案的效率表现,尤其是使用软硬两种多扇区实现方式的情况下(可以看到 nFAT 中振南所创造的算法能起到多大的作用)。

表 18.1 列出了在 ZN—X 开发板( 51 平台)上所测出的上述 4 种情况下各方案的实际结果。

表 18.1 znFAT 、 FATFS 与 EFSL 与在 51 平台的数据写入效率比较


从表 18.1中我们可以看到,在以整扇区或者以较大数据量进行数据写入时,数据的平均写人速度已经逼近物理层直接写单扇区的速度。我们要明白一点,文件系统层面上的数据写人速度再快也不可能比物理层快,顶多与之持平。(因为文件系统是基于物理驱动的。)所以说znFAT的数据写入效率已经达到极限。

另一方面,在使用硬件多扇区驱动的情况下,znFAT 把数据写入速度从 126KB/s 提升到了162 KB/s,而FATFS从 123 KB/s提升到了 150 KB/s,分别提升了36 和27 个单位。很显然,znFAT 对硬件多扇区优势的利用更加充分。说白了就是 nFAT 比 FATFS找到了更多的连续扇区。这背后就是振南创造的算法在起作用,它使得 znFAT 更加优越,更加强劲。最后,大家不要忽略更重要的一点:znFAT 比FATFS 还少用了 500 多字节的内存资源

曾经有人指着上面的测试结果,向我质疑:“我觉得你这个测试实验还不太具有代表性,也许FATFS 在 51 平台上确实表现不力,但这并不能说明它在其他 CPU 平台上也不敌 nFAT!”确实是这么回事,不过振南要说:水涨船高,随着 CPU 性能的提升,nFAT 的效率表现也会更加出色。为了证明这一点,振南把 nFAT 移植到了很多其他的 CPU 上来进行测试包括 Cortex-M3、ColdFire、AVR,MSP430 等,实际测试结果请看表 18.2~18.4。

表 18.2 FATFS 、 EFSL 与 znFAT 在 Cortex M3 平台上的数据写入速率比较


我相信上面的这些测试数据已经足够说明问题了。说实话,为了得到上面的这些表格中的测试数据,振南花了将近 1个月的时间,有人说不就是几个表格吗?为什么要花这么多时间?其主要原因在于:

(1) 测试中涉及的 CPU 平台比较多,很多芯片振南也是第一次使用,所以基本都是现学现用。当然,这里面也有一些网友和爱好者的协助:(限于篇幅很多 CPU上的测试结果并没有列举出来。)

(2)将 znFAT 移植到这些 CPU 上也要花费大量的时间和精力。

“对哦?znFAT 具体该如何移植呢?怎么应用?能不能详细全面地介绍一下?”

你猜得到振南要说什么,对!请去看《嵌入式 FAT32 文件系统设计与实现一-基于振南znFAT》一书

表 18.3 FATFS 、 EFSL 与 znFAT 在 AVR 平台上的数据写入速率比较


表 18.4 FATFS 、 EFSL 与 znFAT 在 ColdFile V2 平台上的数据写入速率比较


3.2 挑战自己


“你一直在跟别人比,你有没有和自己比过?”

“我没太明白!怎么个比法?”

我看了 znFAT 的代码了,也看了书了,它不是有多种模式嘛,各种模式在不同的 CPU平台上数据读/写性能怎么样,可以比较一下!好让我们使用者心里有个数。”

OK ,明白了。说比就比,如表 18.5~18.8 所列。

表 18.5 znFAT 在 51 平台上各种工作模式下的数据写入速度表现


表 18.6 znFAT 在 Cortex M3 平台上各种工作模式下的数据写入速度表现


如果说 znFAT 与FATFSEFSL 的较量是“横向较量”那上面我所做的就是针对 nFAT自身各种工作模式之间的“纵向较量”

我们可以看到,在各种 CPU 平台上,实时+无缓冲模式(即最原始的全实时模式,没有任何优化与加速机制)所占用的内存资源是最少的,但是它的数据写入速度也是最低的(下降到了全速模式下速度的 10%~30%)。这再一次印证了“时空平衡”的基本原理。其他模式对资源占用量与数据写人速度也都有不同程度的影响,希望可以为大家的实际应用提供参考。

另外,我们还留意到:znFAT 的内存使用量可以最低降到 819 字节这个水平。即使是把CCCB 用上(振南创造的一种算法),也只不过是 867 字节而已。(仅仅多占用了几十个字节但是数据的写人速度却提升了 20%~30%,基本已达到全速的一半,这也充分说明了 CCCB确实是一种很好的算法,它是巧妙而实用的,感兴趣了?买书去看看 CCCB 到底精妙在哪?)这也许是一项突破,它象征着 znFAT 可以应用到像 51 AVRPIC 这种内存资源相对较少的单片机上,而且速度也不会有太多损失(FATFS 最少需要 1300 字节左右的内存资源,虽然它有精简的 Tiny 版,但在功能和速度上有较大程度的裁减和损失)。

表 18.7 znFAT 在 AVR 平台上各种工作模式下的数据写入速度表现


表 18.8 znFAT 在 ColdFile V2 平台上各种工作模式下的数据写入速度表现

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端入门(三)Vue生命周期、组件原理、脚手架、插槽插件、存储、组件事件、动画、跨域与代理

文章目录 Vue生命周期Vue 组件化编程 - .vue文件非单文件组件组件的注意点组件嵌套Vue实例对象和VueComponent实例对象Js对象原型与原型链Vue与VueComponent的重要内置关系 应用单文件组件构建 Vue脚手架 - vue.cli项目文件结构组件相关高级属性引用名 - ref数据接入 - props混…

起猛了!自动驾驶可以聊天了

公众号:算法一只狗 一直以来,深度学习模型对于研究者来说是一种“黑盒”模型,我们一般很难分析模型的到底学习到了什么东西,只知道它能够应用于特定的领域。 对比于自动驾驶领域来看,一个黑盒状态的模型,是…

听说你把 ChatGPT 当成搜索引擎用了?

未经作者(微信ID:Byte-Flow)允许,禁止转载 文章首发于公众号:字节流动 看到一些读者朋友把 ChatGPT 当成搜索引擎使用了,当然这样使用也没有问题,只是并不能发挥出 ChatGPT 背后大型语言模型&am…

​ 云计算的尽头是轻量应用服务器?带你了解亚马逊Lightsail的卓越优势

很多小伙伴可能都在好奇,轻量应用服务器有什么特点?为什么相较于普通的云服务器,很多用户现在都更青睐于轻量应用服务器?这个“轻”就是它独特的优势所在。轻量应用服务器以其“开箱即用、应用优质、轻松上手、投入划算、运维便捷和稳定可靠…

School training competition ( Second )

A. Medium Number 链接 : Problem - 1760A - Codeforces 就是求三个数的中位数 : #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std; typedef long long LL; const int N 2e510;inline void …

name 属性:提高 Vue 应用可维护性的关键

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

JavaSE 知识点总结

路在脚下&#xff0c;行则将至 目录 1. 初始Java 1.1 Java之父——高斯林 1.2 一次编译&#xff0c;到处运行 1.3 注释 2. 数据结构与变量 2.1 数据类型 2.2 变量 2.3 常量 3. 运算符 3.1 逻辑与 && 3.2 逻辑 || 3.3 逻辑非 ! 3.4 特殊的位运算符(C语言没有)…

javascript 运算符

javascript 运算符 目录 javascript 运算符 一、算术运算符 1、自增运算符 2、自减运算符 二、比较运算符 三、赋值运算符 四、逻辑运算符 五、条件运算符 疑难解答&#xff1a; 这一节&#xff0c;我们来介绍JavaScript的运算符。运算符是完成一系列操作的符号&…

基于HTML+CSS+JavaScript的登录注册界面设计

一、界面效果: 二、HTML代码: 登录注册html: 登录成功html: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <h1>登录成功!</h1> </body> <…

线程基本方法

1。设置线程名 继承Thread类的线程&#xff0c;可以直接使用.setName()方法&#xff0c;设置线程名。也可以使用构造方法&#xff0c;需要注意java默认不继承构造方法&#xff0c;所以需要自己调用下父类的构造方法。 public class Demo {public static void main(String[…

powershell获取微软o365 21v日志

0x00 背景 o365 21v为o365的大陆版本&#xff0c;主要给国内用户使用。微软提供了powershell工具和接口获取云上日志。微软o365国内的代理目前是世纪互联。本文介绍如何用powershell和配置证书拉取云上日志。 0x01 实践 第一步&#xff0c;ip权限开通&#xff1a; 由世纪互联…

CGAN原理讲解与源码

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