單片機
#1樓主:znFAT--單片機上的FAT32文件系統(tǒng) 之研發(fā)手記文章發(fā)表于:2009-12-05 22:04
znFAT--單片機上的FAT32文件系統(tǒng) 之研發(fā)手記
兩年前,我開始學(xué)習(xí)DIY MP3,剛開始我只是直接把MP3文件的數(shù)據(jù)放在單片機的FLASH中,讀取播放。但這樣受限于單片機FLASH的容量,使得根本裝不下整首的MP3數(shù)據(jù),頂多能播放7、8秒鐘。這就需要一種大容量的存儲器,你可能會說:“用大容量的FLASH ROM芯片就可以了”。不錯,用諸如K9F、45DB系列的FLASHROM芯片容量是夠大了,但此時也許你也跟我一樣碰到了一個問題,MP3文件怎么放入到FLASH芯片中?你可能會說“用燒錄器就可以了!”。我要問的話,你見過商場里哪款MP3播放器是需要燒錄器的?基本都是通過USB直接拷的,或者是可以擴(kuò)展存儲卡,如SD卡、CF卡,甚至U盤。要用USB把FLASH芯片作成U盤,可以用PDIUSBD12來實現(xiàn)(如果您對這個感興趣可以看看computer00的USB),對USB有一定了解的,都會知道想把U盤作出來,還是非常復(fù)雜的。所以最簡單的方法就是使用存儲卡,一方面可以使用讀卡器,直接在操作系統(tǒng)中把MP3拷入其中,另一方面單片機驅(qū)動SD卡的相關(guān)資料也比較全,便于研究。
文件系統(tǒng)的引出就由此而生?。栴}是這樣的,將MP3文件拷入到SD卡中以后,下面我們要作的就是用單片機來讀取SD卡上的數(shù)據(jù),以便于播放,拷入的MP3文件數(shù)據(jù)在SD卡的哪里?。康侥膫€扇區(qū)中去讀???我們使用U盤或SD卡等存儲設(shè)備拷貝電影啊,歌曲啊,都是最平常的事情,你想過沒有,這些文件的數(shù)據(jù)存在SD卡上的什么地方嗎?它為什么要存在那個地方?
為了找到SD卡上的MP3數(shù)據(jù),我開始研究相關(guān)內(nèi)容,這些就是FAT32文件系統(tǒng)。研究起來以后,發(fā)現(xiàn)已經(jīng)有很多現(xiàn)成的在單片機上或在ARM等芯片上用的FAT文件系統(tǒng)方案,比如FATFS(這個是最為著名的一個,用得也最多)等等,國內(nèi)也有幾個,比如沁恒的文件系統(tǒng)庫(不過他不開源,是商業(yè)的東西)、ZLG/FS(他提供的還是應(yīng)用于ARM上的,在單片機應(yīng)用的少)等。我也曾經(jīng)向單片機(我剛開始用的是STC89C58,后來開始用STC12C5A60S2,不過這也是今年才開始用)上去移植這些現(xiàn)成的方案,但移植并不順利。最后我打算不再用任何現(xiàn)有方案,自己研究自己寫。
于是我開始動手寫了一個最原始的方案,這個最原始的方案僅僅可以實現(xiàn)讀取根目錄下的某個文件,還非常不成熟,同時我在網(wǎng)上發(fā)了一篇文章《FAT32文件系統(tǒng)的存儲機制及其在單片機上的實現(xiàn)》(感興趣的話可以在網(wǎng)上找一下,不過這篇文章里講的非常膚淺)。我將這個文件系統(tǒng)方案的雛形用于MP3播放實驗,實現(xiàn)了讀SD卡MP3文件播放的功能。與此同時,我錄制了《51單片機實現(xiàn)FAT32文件系統(tǒng)》視頻教程(長達(dá)500分鐘),希望通過通俗全面的講解,讓廣大電子愛好者對文件系統(tǒng)有一個初頻的了解(不過,現(xiàn)在回想起來,錄制視頻教程的時候?qū)ξ募到y(tǒng)的研究仍然還不算深刻)。因為我發(fā)現(xiàn)很多人雖然每天在用電腦,每天在聽MP3,每天在看電子書,但從不知道有文件系統(tǒng)這種東西存在,從來不納悶存在扇區(qū)中的數(shù)據(jù)在我們面前怎么就成為了一個個的文件。
我的SD卡MP3的基本功能雖然實現(xiàn)了,但我又在想:“難道國內(nèi)就不能有一款開源的,好用的FAT32文件系統(tǒng)的方案嗎?”。我在前期研究的基礎(chǔ)上,又開始進(jìn)行更深入的研究。也許你可以在1個月內(nèi),甚至1個星期,把文件系統(tǒng)的相關(guān)技術(shù)手冊通讀N遍,也可能在理論上搞得很明白(當(dāng)然需要較高的悟性),但這離最終的實現(xiàn)還相差甚遠(yuǎn),或者說只是剛剛起步。一些國外的研究文件系統(tǒng)的組織都是很多人一起傾注很大精力在作的,像EFSL(比利時的開源項目)、FATFS(上面已經(jīng)提到,它是從大量的wince源代碼中剝離出的fat文件系統(tǒng)源代碼,微軟的代碼)等。它們會給我們使用,但不會講給我們他們是怎么實現(xiàn)的,更重要的一點是,它們一般用于AVR、ARM等芯片上,如果想要在51單片機上使用,不能說不能用,但因為硬件資源有限,所以用起來會有麻煩。所以,我才打算在RAM僅有1K字節(jié)的STC國產(chǎn)51單片機上真正作一套功能完備,方便移植的,性能較高,完全從0原創(chuàng)的文件系統(tǒng)方案。
應(yīng)用說這項工作工作量很大,主要是我不想僅僅去實現(xiàn)基本的功能,還希望能有功能上的創(chuàng)新。要實現(xiàn)的基本功能有:1、文件系統(tǒng)初始化 2、打開文件 3、讀取數(shù)據(jù) 4、文件重命名 5、復(fù)制文件 6、創(chuàng)建文件 7、添加數(shù)據(jù) 8、創(chuàng)建目錄 9、關(guān)閉文件 10、獲取剩余容量 11、獲取總?cè)萘?nbsp; 獨特具有的功能:我稱之為“多設(shè)備”(所謂的多設(shè)備功能,就是可以在運行的過程中動態(tài)的切換存儲設(shè)備的驅(qū)動,說明了就是文件系統(tǒng)可以穿梭于多種存儲設(shè)備之間,你會問這有什么用?我要說,這里所實現(xiàn)的每一項功能都有非常實際的應(yīng)用,多設(shè)備最典型的應(yīng)用就是可以在多種設(shè)備間進(jìn)行文件的拷貝,如將SD卡上的某一文件拷貝到CF卡、U盤或是另一張SD卡上)
最大的工作量并不在于寫代碼,而在于測試代碼和改代碼。就像讀數(shù)據(jù)的功能,讀從文件里讀1000個字節(jié),沒有問題,讀10000字節(jié)呢?仍然不會出錯嗎?又如打開文件這一功能,如果目錄里有5個文件,要打開其中某個文件沒有問題,那能保證目錄里有10000個文件的時候,打開這個文件仍然沒有問題嗎?能打開根目錄下的文件沒有問題,打開\A\B\C\D\E\F\G\H\IJ\K\K\K\K\L\A.TXT這樣的深層目錄下的文件,也會沒問題嗎?寫入文件數(shù)據(jù)時,寫入1個字節(jié)沒問題,寫入10K的數(shù)據(jù)也照樣沒有問題嗎?............像這種類似的情況有很多。憑我一個人的力量是不夠的,我找了很多網(wǎng)友,給他用我的代碼,并將問題反饋給我,我再加以修改。還有一個很重要的途徑是通過一些公司實際的工程項目,因為他們會有專門測試的環(huán)境,比如頻繁讀數(shù)據(jù)、長時間的運行等等。很多問題會在此期間暴露出來。在修改代碼的過程中,時常還會發(fā)現(xiàn)一些以前沒有看到的FAT32更深層的東西。到現(xiàn)在為止,我的文件系統(tǒng)方案已經(jīng)較為完備,在穩(wěn)定性與正確性上得到了一定的保障。
要著重說明的是所實現(xiàn)的一切功能,僅僅用了大約900字節(jié)的RAM,其中包括512字節(jié)的扇區(qū)數(shù)據(jù)緩沖。
到后期,我的文件系統(tǒng)開始在網(wǎng)上開源,為了讓大家能記住它,我給它起名為znFAT(意為振南的FAT32文件系統(tǒng)方案)。僅僅有znFAT代碼是遠(yuǎn)遠(yuǎn)不夠的,大家感興趣還是使用znFAT來作的一些實驗,比如讀SD卡上的TXT文本文件,作電子書;讀SD卡上的MP3文件作播放器;讀SD卡上的BMP文件,作數(shù)碼相框;在SD卡與CF卡之間進(jìn)行文件的互拷;甚至我自己用51的串口作了一個Shell命令接口,來通超級終端敲入命令來實現(xiàn)相應(yīng)的文件操作(這就是我在網(wǎng)上起名為“仿DOS”的實驗)。令我欣慰的是,現(xiàn)在已經(jīng)有人開始在用znFAT來作一些實驗了,說明znFAT真正被人們用起來了。雖然還沒有像FATFS等方案那樣流行,但它仍然是完全MIC(Made In China)的。
代碼公布出來,并不意味著代碼就很成熟,反而會暴露出一些問題。其實最典型的一個問題就是:我提供的znFAT的代碼是基于51單片機的KEIL工程,但很多網(wǎng)友并不用51,而用像AVR、STM32、DSP、NIOSII等等。反應(yīng)一些功能異常。這是對可移植性的很大考驗,可移植性要求在不同的硬件條件下,在代碼修改量不大的情況下,可以在其上運行,并且功能良好。所以我中途又搞了一陣子STM32(它是一種ARM7核的MCU),最終發(fā)現(xiàn)是不同CPU的差異而造成的,說得更具體一些是因為不同CPU的大小端問題。最終成功移植到STM32上,并將代碼在網(wǎng)上公布出來。與此同時,一個網(wǎng)友用LM的控制器也跑通了znFAT,并應(yīng)用于項目,運行良好。
znFAT從開始作,到現(xiàn)在已有1年多,這期間研究不斷深化,現(xiàn)在的znFAT與當(dāng)初的雛形已有極大的發(fā)展。原來的視頻教程與文檔資料現(xiàn)在已經(jīng)覺得比較膚淺,所以在打算錄制新的視頻教程,以求更多的人知道文件系統(tǒng),知道它的重要。我要說,存儲設(shè)備的扇區(qū)讀寫好實現(xiàn),而建立在扇區(qū)讀寫基礎(chǔ)上的文件系統(tǒng)的實現(xiàn),才是思想真正的升華,對研發(fā)能力最大的考驗。
為了更廣泛的普及文件系統(tǒng)的相關(guān)知識,也為了滿足很多對文件系統(tǒng)的需求和好奇(您難道沒有發(fā)現(xiàn)國內(nèi),乃至國外,還沒有一本專門講在嵌入式中構(gòu)建和使用文件系統(tǒng)的書嗎?),在努力撰寫《振南的znFAT--單片機上的FAT32文件系統(tǒng)》一書。不地寫書過程漫長而辛苦,努力早日出來。
振南贈語
振嚇?biāo)姆讲橹迹?/p>
南極北斗自來朝。
電摯山河獨標(biāo)新,
子聚吾來弄天狼。
原點出發(fā)終有始,
創(chuàng)業(yè)何達(dá)必親為。
無盡峰端難攀登,
限在你我掌當(dāng)中。