free性丰满hd毛多多,久久综合给合久久狠狠狠97色69 ,欧美成人乱码一区二区三区,国产美女久久久亚洲综合,7777久久亚洲中文字幕

0
問答首頁 最新問題 熱門問題 等待回答標(biāo)簽廣場
我要提問

單片機

振南的znFAT-單片機上的FAT32文件系統(tǒng) 研發(fā)手記

#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)中。

提問者:36切53 地點:- 瀏覽次數(shù):12375 提問時間:10-22 16:55
我有更好的答案
提 交
18條回答
chunlan83768 08-04 18:37
呵呵,我用在MP3播放的文件系統(tǒng)參考了很多沁恒公司的思想,只需512字節(jié)的扇區(qū)數(shù)據(jù)緩沖區(qū),我覺得51單片機最好用FAT16文件系統(tǒng),FAT32用在8位的51上面,速度慢.只需低速讀寫的應(yīng)用另當(dāng)別論.
陜西友航電子科技有限公司 07-28 13:01
znFAT的應(yīng)用絕不僅限于51
blueshine 08-03 07:31
很多系統(tǒng)的核心是文件系統(tǒng),文件系統(tǒng)作好,很多東西就可以作了
60user159 07-26 22:00
您好,振南先生,我現(xiàn)在在DSP2812上使用您的znFAT文件系統(tǒng),效果很好,可是有一個問題,我不能像操作Word一樣隨意的修改或刪除文件中的一部分,我現(xiàn)在是做數(shù)據(jù)采集,和存儲,每次存儲2048字節(jié)數(shù)據(jù),當(dāng)達(dá)到一定容量后再自動刪除文件頭部分的2048字節(jié),可是2048字節(jié)小于一個簇4096字節(jié),為了減少運行時間,我就直接修改的FAT文件表,讓首簇變?yōu)樵瓉硎状氐南乱粋€簇,相當(dāng)于進(jìn)行了刪簇操作來減少4096字節(jié),可是這樣不是長久的解決辦法啊,我能不能刪除隨意大小隨意位置的數(shù)據(jù)吶?
recoltd 08-02 01:17
謝謝對znFAT的支持
你的意思是把文件數(shù)據(jù)整體向前移動2048字節(jié)嗎?
據(jù)我所知現(xiàn)有的所有文件系統(tǒng)方案都不能完成這一功能
如果你刪除了文件某個位置的數(shù)據(jù),那個位置就會出現(xiàn)空余,要把后面的數(shù)據(jù)向前移動,這是比較費時間的。
你所用的方法也比較好,只是你多刪了2048字節(jié)
你可以用Disk Ginius這個軟件把你的SD卡格式化為簇大小為2048,這樣你用你的這種方法就可以實現(xiàn)了

你修改了FAT以后,有幾點要注意
1、要把原來的首簇設(shè)置為0x0000,即空簇
2、在文件的文件項中首簇更新為當(dāng)前的首簇
3、更改文件項中的文件大小
4、更改FSINFO中的空閑簇數(shù)
5、更改FSINFO中的空簇參考值
糊涂忠1 08-04 03:09
你好,謝謝振南先生的回答,您的意思是我無法像Word一樣操作,那Word里的文件操作,比如說刪除一段后點關(guān)閉保存時怎樣的操作吶?是吧文件內(nèi)容完全讀進(jìn)內(nèi)存,修改完后然后再完全重新寫進(jìn)去嗎?相當(dāng)于向文件添加全部數(shù)據(jù),文件其實偏移量為0?是嗎
zhan81411 07-26 22:03
有時我還想隨意刪除文件頭部的任意長度的數(shù)據(jù),您看有沒有好的方法啊,其實我現(xiàn)在是每采集8192點數(shù)據(jù)進(jìn)行存儲,每個點數(shù)是16位整形,這樣8192點共占16384字節(jié),就是4個簇的空間,在文件長度達(dá)到85M時自動刪除文件頭部的4個簇。這種方法我也實現(xiàn)了,現(xiàn)在是要在這8192點數(shù)據(jù)前加上時間信息,也就是說每一次存儲的數(shù)據(jù)正好比16384多一點,我想到文件達(dá)到85M是自動刪減這堆比16384多點的數(shù)據(jù),讓每一次能在文件的開頭處看到時間信息,這樣能實現(xiàn)嗎
60user20 08-01 17:41
在嵌入式中的文件操作,是不可能像在PC上那樣的,你如果要在文件頭上添加數(shù)據(jù),就會造成后面數(shù)據(jù)大批的后移,效率極低。
你所說的WORD中,確實是在RAM中進(jìn)行操作,最后再存入文件的,znFAT可以讓你自由向文件追加數(shù)據(jù),可以定位到文件的某個位置,直接去修改數(shù)據(jù),但你想實現(xiàn)在文件任意位置添加數(shù)據(jù),就比較難,而且效率也很低。你可以預(yù)先把你要添加的數(shù)據(jù)預(yù)先留出來,以后可以到文件這個位置來改。
hzp_bbs1 08-05 00:14
還有,不要叫我振南先生,我本身現(xiàn)在還是學(xué)生,叫我振南就好,或者叫ZN
凈小空空 07-29 10:12
你好,振南,聽了你的解說,我清楚了,昨天仔細(xì)看了一下你說的這五點,前三項我是做了的,就是第四、五項,我沒有找見關(guān)于FSINFO的相關(guān)代碼,還不會做
1、要把原來的首簇設(shè)置為0x0000,即空簇
2、在文件的文件項中首簇更新為當(dāng)前的首簇
3、更改文件項中的文件大小
4、更改FSINFO中的空閑簇數(shù)
5、更改FSINFO中的空簇參考值
這是我的程序,按找刪除文件的函數(shù)改寫的,沒有涉及到FSINFO???
void DeletData(struct FileInfoStruct *pfi)
{long Cluster1,Cluster2,Cluster3,Cluster_New_Start;
struct direntry *prec;
FAT32_ReadSector(pfi->Rec_Sec,FAT32_Buffer);//獲取頭四個簇,然后將其清空
prec=(struct direntry *)(FAT32_Buffer+pfi->nRec);
Cluster1=FAT32_GetNextCluster(pfi->FileStartCluster);
Cluster2=FAT32_GetNextCluster(Cluster1);
Cluster3=FAT32_GetNextCluster(Cluster2);
Cluster_New_Start=FAT32_GetNextCluster(Cluster3);//找尋到新的首簇 Cluster_New_Start
FAT32_Modify_FAT(pfi->FileStartCluster,0x00000000);
FAT32_Modify_FAT(Cluster1,0x00000000);
FAT32_Modify_FAT(Cluster2,0x00000000);
FAT32_Modify_FAT(Cluster3,0x00000000);

pfi->FileStartCluster=Cluster_New_Start; //更改文件首簇到Cluster_New_Start
pfi->FileSize=pfi->FileCurOffset-16384;//更改改文件大小
pfi->FileCurSector=SOC(pfi->FileCurCluster);
pfi->FileCurOffset=pfi->FileCurOffset-16384;
FAT32_ReadSector(pfi->Rec_Sec,FAT32_Buffer);//修改FAT表首簇號
(prec->deHighClust)[0]=(Cluster_New_Start&0x00ff0000)>>16;
(prec->deHighClust)[1]=(Cluster_New_Start&0xff000000)>>24;
(prec->deLowCluster)[0]=(Cluster_New_Start&0x000000ff);
(prec->deLowCluster)[1]=(Cluster_New_Start&0x0000ff00)>>8;
? ?FAT32_WriteSector(pfi->Rec_Sec,FAT32_Buffer);

??FAT32_ReadSector(pfi->Rec_Sec,FAT32_Buffer);//修改文件大小
??(((struct direntry *)(FAT32_Buffer+pfi->nRec))->deFileSize)[0]=((pfi->FileCurOffset)&0x000000ff);
??(((struct direntry *)(FAT32_Buffer+pfi->nRec))->deFileSize)[1]=((pfi->FileCurOffset)&0x0000ff00)>>8;
??(((struct direntry *)(FAT32_Buffer+pfi->nRec))->deFileSize)[2]=((pfi->FileCurOffset)&0x00ff0000)>>16;
??(((struct direntry *)(FAT32_Buffer+pfi->nRec))->deFileSize)[3]=((pfi->FileCurOffset)&0xff000000)>>24;
??FAT32_WriteSector(pfi->Rec_Sec,FAT32_Buffer);
}
riverdj 07-28 15:52
FAT32與FAT16不同點之一就是FAT32有FSINFO,其中就可以直接讀出來磁盤剩余容量和下一個可以用的空閑簇,當(dāng)然FSINFO也需要程序來進(jìn)行維護(hù)。

也許你有這種經(jīng)歷,使用CH375配套的沁恒文件系統(tǒng)庫時,在獲取U盤的剩余容量時,F(xiàn)AT32可以馬上得到結(jié)果,而FAT16就要等一段時間才能得到結(jié)果。就是因為FAT16沒有FSINFO,所以程序要由FAT表來統(tǒng)計容量,這時間就長了。

FSINFO是我研發(fā)文件系統(tǒng)后期才發(fā)現(xiàn)的一個區(qū)域。它的位置在DBR的后一個扇區(qū)
gwerwfe 08-01 22:50
呵呵,等你的書出了在看看先,??我看過你那個文件系統(tǒng),? ?一團(tuán)亂碼,? ?或許是我功力不夠吧,
朱振振振 08-01 10:50
由于文件系統(tǒng)本身的復(fù)雜性,如果沒有基礎(chǔ),看起來確實就是一團(tuán)亂碼
正是由于文件系統(tǒng)代碼有些龐雜,所以才有了出書的念頭,讓帶讀者一起來剖析
我盡力讓代碼條理清晰一些,方便大家的學(xué)習(xí)和使用
謝謝
qwer38 07-26 10:08
標(biāo)記一下有時間好好研究一下
limisy 07-31 01:27
如果要做商業(yè)應(yīng)用,可能更多人會選擇大公司開發(fā)的,比如ZLG,MICROCHIP,這是我了解到的。
wmc55555 07-28 12:11
如果你不打算把這個FAT做到中國知名以及于知名度匹配的完善,以便有更多的人能用于商業(yè)應(yīng)用,把這個時間抽出來做其它,你可以得到更全面的提高。
技術(shù)員都有玩技術(shù)的傾向,但是做產(chǎn)品開發(fā),卻最怕技術(shù)員玩技術(shù)。而技術(shù)員如果太喜歡玩技術(shù),而不是更多考慮產(chǎn)品和自己的發(fā)展,也是不大好。不過趁著還是學(xué)生,多玩一下技術(shù)是好的,畢業(yè)了,就沒那么多時間了。加油。
ywujwerwx 07-27 04:17
znFAT剛開始源于興趣,已經(jīng)作了1年多,中間經(jīng)歷無數(shù)次測試,包括多次在工程上的應(yīng)用。也暴露出無數(shù)的問題,都在發(fā)現(xiàn)后得到我改進(jìn)和修復(fù)。從而保證其正確性與穩(wěn)定性。
znFAT的研發(fā)初衷在于解決實際的問題,滿足實現(xiàn)的需求。是希望它能被更多人知道,更多人用起來,我把代碼全部開源的原因也就在于此。
不光用起來,還讓有興趣的人可以有機會來研究學(xué)習(xí)。這就是要出教程與書的原因了。

學(xué)生確實是喜歡玩技術(shù),把技術(shù)當(dāng)成是玩具來找樂趣。本身我現(xiàn)在是研三的學(xué)生,現(xiàn)在的時間確實不多了。
盡力把自己研究的東西作到完善。
當(dāng)然希望有更多的人來用我的znFAT,來感覺它到底怎么樣。
在EDNCHINA那邊有小組我已經(jīng)發(fā)了10個應(yīng)用實例,大家可以過去看看。
http://group.znmcu.cn/
loujie39 07-29 21:07
FATFS ZLGFS UCFS固然好,但它不會配上教程,配上書,告訴你它是怎么實現(xiàn)的,內(nèi)部技術(shù)有哪些,細(xì)節(jié)是怎樣的,如果要自己寫文件系統(tǒng)方案,應(yīng)該怎么作。這是我研究文件系統(tǒng)的初衷。
撰寫答案
提 交
1 / 3
1 / 3
相關(guān)單片機
具有音調(diào)控制的單片機立體聲前置放大器
用于單片機與電子裝置中的開關(guān)電源
單片機軟硬件復(fù)位的條件都有啥
電動機的單片機控制
單片機應(yīng)用系統(tǒng)開發(fā)實例導(dǎo)航