注解目录
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 平台上各种工作模式下的数据写入速度表现