单片机
#1楼主:znFAT--单片机上的FAT32文件系统 之研发手记文章发表于:2009-12-05 22:04
znFAT--单片机上的FAT32文件系统 之研发手记
两年前,我开始学习DIY MP3,刚开始我只是直接把MP3文件的数据放在单片机的FLASH中,读取播放。但这样受限于单片机FLASH的容量,使得根本装不下整首的MP3数据,顶多能播放7、8秒钟。这就需要一种大容量的存储器,你可能会说:“用大容量的FLASH ROM芯片就可以了”。不错,用诸如K9F、45DB系列的FLASHROM芯片容量是够大了,但此时也许你也跟我一样碰到了一个问题,MP3文件怎么放入到FLASH芯片中?你可能会说“用烧录器就可以了!”。我要问的话,你见过商场里哪款MP3播放器是需要烧录器的?基本都是通过USB直接拷的,或者是可以扩展存储卡,如SD卡、CF卡,甚至U盘。要用USB把FLASH芯片作成U盘,可以用PDIUSBD12来实现(如果您对这个感兴趣可以看看computer00的USB),对USB有一定了解的,都会知道想把U盘作出来,还是非常复杂的。所以最简单的方法就是使用存储卡,一方面可以使用读卡器,直接在操作系统中把MP3拷入其中,另一方面单片机驱动SD卡的相关资料也比较全,便于研究。
文件系统的引出就由此而生!!问题是这样的,将MP3文件拷入到SD卡中以后,下面我们要作的就是用单片机来读取SD卡上的数据,以便于播放,拷入的MP3文件数据在SD卡的哪里啊?到哪个扇区中去读啊?我们使用U盘或SD卡等存储设备拷贝电影啊,歌曲啊,都是最平常的事情,你想过没有,这些文件的数据存在SD卡上的什么地方吗?它为什么要存在那个地方?
为了找到SD卡上的MP3数据,我开始研究相关内容,这些就是FAT32文件系统。研究起来以后,发现已经有很多现成的在单片机上或在ARM等芯片上用的FAT文件系统方案,比如FATFS(这个是最为著名的一个,用得也最多)等等,国内也有几个,比如沁恒的文件系统库(不过他不开源,是商业的东西)、ZLG/FS(他提供的还是应用于ARM上的,在单片机应用的少)等。我也曾经向单片机(我刚开始用的是STC89C58,后来开始用STC12C5A60S2,不过这也是今年才开始用)上去移植这些现成的方案,但移植并不顺利。最后我打算不再用任何现有方案,自己研究自己写。
于是我开始动手写了一个最原始的方案,这个最原始的方案仅仅可以实现读取根目录下的某个文件,还非常不成熟,同时我在网上发了一篇文章《FAT32文件系统的存储机制及其在单片机上的实现》(感兴趣的话可以在网上找一下,不过这篇文章里讲的非常肤浅)。我将这个文件系统方案的雏形用于MP3播放实验,实现了读SD卡MP3文件播放的功能。与此同时,我录制了《51单片机实现FAT32文件系统》视频教程(长达500分钟),希望通过通俗全面的讲解,让广大电子爱好者对文件系统有一个初频的了解(不过,现在回想起来,录制视频教程的时候对文件系统的研究仍然还不算深刻)。因为我发现很多人虽然每天在用电脑,每天在听MP3,每天在看电子书,但从不知道有文件系统这种东西存在,从来不纳闷存在扇区中的数据在我们面前怎么就成为了一个个的文件。
我的SD卡MP3的基本功能虽然实现了,但我又在想:“难道国内就不能有一款开源的,好用的FAT32文件系统的方案吗?”。我在前期研究的基础上,又开始进行更深入的研究。也许你可以在1个月内,甚至1个星期,把文件系统的相关技术手册通读N遍,也可能在理论上搞得很明白(当然需要较高的悟性),但这离最终的实现还相差甚远,或者说只是刚刚起步。一些国外的研究文件系统的组织都是很多人一起倾注很大精力在作的,像EFSL(比利时的开源项目)、FATFS(上面已经提到,它是从大量的wince源代码中剥离出的fat文件系统源代码,微软的代码)等。它们会给我们使用,但不会讲给我们他们是怎么实现的,更重要的一点是,它们一般用于AVR、ARM等芯片上,如果想要在51单片机上使用,不能说不能用,但因为硬件资源有限,所以用起来会有麻烦。所以,我才打算在RAM仅有1K字节的STC国产51单片机上真正作一套功能完备,方便移植的,性能较高,完全从0原创的文件系统方案。
应用说这项工作工作量很大,主要是我不想仅仅去实现基本的功能,还希望能有功能上的创新。要实现的基本功能有:1、文件系统初始化 2、打开文件 3、读取数据 4、文件重命名 5、复制文件 6、创建文件 7、添加数据 8、创建目录 9、关闭文件 10、获取剩余容量 11、获取总容量 独特具有的功能:我称之为“多设备”(所谓的多设备功能,就是可以在运行的过程中动态的切换存储设备的驱动,说明了就是文件系统可以穿梭于多种存储设备之间,你会问这有什么用?我要说,这里所实现的每一项功能都有非常实际的应用,多设备最典型的应用就是可以在多种设备间进行文件的拷贝,如将SD卡上的某一文件拷贝到CF卡、U盘或是另一张SD卡上)
最大的工作量并不在于写代码,而在于测试代码和改代码。就像读数据的功能,读从文件里读1000个字节,没有问题,读10000字节呢?仍然不会出错吗?又如打开文件这一功能,如果目录里有5个文件,要打开其中某个文件没有问题,那能保证目录里有10000个文件的时候,打开这个文件仍然没有问题吗?能打开根目录下的文件没有问题,打开\A\B\C\D\E\F\G\H\IJ\K\K\K\K\L\A.TXT这样的深层目录下的文件,也会没问题吗?写入文件数据时,写入1个字节没问题,写入10K的数据也照样没有问题吗?............像这种类似的情况有很多。凭我一个人的力量是不够的,我找了很多网友,给他用我的代码,并将问题反馈给我,我再加以修改。还有一个很重要的途径是通过一些公司实际的工程项目,因为他们会有专门测试的环境,比如频繁读数据、长时间的运行等等。很多问题会在此期间暴露出来。在修改代码的过程中,时常还会发现一些以前没有看到的FAT32更深层的东西。到现在为止,我的文件系统方案已经较为完备,在稳定性与正确性上得到了一定的保障。
要着重说明的是所实现的一切功能,仅仅用了大约900字节的RAM,其中包括512字节的扇区数据缓冲。
到后期,我的文件系统开始在网上开源,为了让大家能记住它,我给它起名为znFAT(意为振南的FAT32文件系统方案)。仅仅有znFAT代码是远远不够的,大家感兴趣还是使用znFAT来作的一些实验,比如读SD卡上的TXT文本文件,作电子书;读SD卡上的MP3文件作播放器;读SD卡上的BMP文件,作数码相框;在SD卡与CF卡之间进行文件的互拷;甚至我自己用51的串口作了一个Shell命令接口,来通超级终端敲入命令来实现相应的文件操作(这就是我在网上起名为“仿DOS”的实验)。令我欣慰的是,现在已经有人开始在用znFAT来作一些实验了,说明znFAT真正被人们用起来了。虽然还没有像FATFS等方案那样流行,但它仍然是完全MIC(Made In China)的。
代码公布出来,并不意味着代码就很成熟,反而会暴露出一些问题。其实最典型的一个问题就是:我提供的znFAT的代码是基于51单片机的KEIL工程,但很多网友并不用51,而用像AVR、STM32、DSP、NIOSII等等。反应一些功能异常。这是对可移植性的很大考验,可移植性要求在不同的硬件条件下,在代码修改量不大的情况下,可以在其上运行,并且功能良好。所以我中途又搞了一阵子STM32(它是一种ARM7核的MCU),最终发现是不同CPU的差异而造成的,说得更具体一些是因为不同CPU的大小端问题。最终成功移植到STM32上,并将代码在网上公布出来。与此同时,一个网友用LM的控制器也跑通了znFAT,并应用于项目,运行良好。
znFAT从开始作,到现在已有1年多,这期间研究不断深化,现在的znFAT与当初的雏形已有极大的发展。原来的视频教程与文档资料现在已经觉得比较肤浅,所以在打算录制新的视频教程,以求更多的人知道文件系统,知道它的重要。我要说,存储设备的扇区读写好实现,而建立在扇区读写基础上的文件系统的实现,才是思想真正的升华,对研发能力最大的考验。
为了更广泛的普及文件系统的相关知识,也为了满足很多对文件系统的需求和好奇(您难道没有发现国内,乃至国外,还没有一本专门讲在嵌入式中构建和使用文件系统的书吗?),在努力撰写《振南的znFAT--单片机上的FAT32文件系统》一书。不地写书过程漫长而辛苦,努力早日出来。
振南赠语
振吓四方博为旨,
南极北斗自来朝。
电挚山河独标新,
子聚吾来弄天狼。
原点出发终有始,
创业何达必亲为。
无尽峰端难攀登,
限在你我掌当中。