第24章
基于FLASH的FatFs文件系統(tǒng)移植
24.1
文件系統(tǒng)
即使讀者可能不了解文件系統(tǒng),讀者也一定對(duì)“文件”這個(gè)概念十分熟悉。數(shù)據(jù)在PC上是以文件的形式儲(chǔ)存在磁盤中的,這些數(shù)據(jù)的形式一般為ASCII 碼或二進(jìn)制形式。在上一章我們已經(jīng)寫好了串行 Flash芯片的驅(qū)動(dòng)函數(shù),我們可以非常方便的在串行Flash芯片上讀寫數(shù)據(jù)。如需要記錄文字,可以把這些文字轉(zhuǎn)化成相應(yīng)編碼的字符串,存儲(chǔ)在數(shù)組中,然后調(diào)用串行FLASH的寫函數(shù),把數(shù)組內(nèi)容寫入到串行Flash芯片的指定地址上,在需要的時(shí)候從該地址把數(shù)據(jù)讀取出來(lái),再對(duì)讀出來(lái)的數(shù)據(jù)以相應(yīng)編碼的格式進(jìn)行解讀。
但是,這樣直接存儲(chǔ)數(shù)據(jù)會(huì)帶來(lái)極大的不便,如難以記錄有效數(shù)據(jù)的位置,難以確定存儲(chǔ)介質(zhì)的剩余空間,以及應(yīng)以何種格式來(lái)解讀數(shù)據(jù)。就如同一個(gè)巨大的圖書館無(wú)人管理,雜亂無(wú)章地存放著各種書籍,難以查找所需的文檔。想象一下圖書館的采購(gòu)人員購(gòu)書后,把書籍往館內(nèi)一扔,拍拍屁股走人,當(dāng)有人來(lái)借閱某本書的時(shí)候,就不得不一本本地查找。這樣直接存儲(chǔ)數(shù)據(jù)的方式對(duì)于小容量的存儲(chǔ)介質(zhì)如EEPROM還可以接受,但對(duì)于大容量Flash芯片或者SD卡之類的大容量設(shè)備,我們需要一種高效的方式來(lái)管理它的存儲(chǔ)內(nèi)容。
這些管理方式即為文件系統(tǒng),它是為了存儲(chǔ)和管理數(shù)據(jù),而在存儲(chǔ)介質(zhì)建立的一種組織結(jié)構(gòu),這些結(jié)構(gòu)包括操作系統(tǒng)引導(dǎo)區(qū)、目錄和文件。常見(jiàn)的windows下的文件系統(tǒng)格式包括FAT32、NTFS、exFAT。在使用文件系統(tǒng)前,要先對(duì)存儲(chǔ)介質(zhì)進(jìn)行格式化。格式化先擦除原來(lái)內(nèi)容,在存儲(chǔ)介質(zhì)上新建一個(gè)文件分配表和目錄。這樣,文件系統(tǒng)就可以記錄數(shù)據(jù)存放的物理地址、剩余空間。
使用文件系統(tǒng)時(shí),數(shù)據(jù)都以文件的形式存儲(chǔ)。寫入新文件時(shí),先在目錄中創(chuàng)建一個(gè)文件索引,它指示了文件存放的物理地址,再把數(shù)據(jù)存儲(chǔ)到該地址中。當(dāng)需要讀取數(shù)據(jù)時(shí),可以從目錄中找到該文件的索引,進(jìn)而在相應(yīng)的地址中讀取出數(shù)據(jù)。具體還涉及到邏輯地址、簇大小、不連續(xù)存儲(chǔ)等一系列輔助結(jié)構(gòu)或處理過(guò)程。
文件系統(tǒng)的存在使我們?cè)诖嫒?shù)據(jù)時(shí),不再是簡(jiǎn)單地向某物理地址直接讀寫,而是要遵循它的讀寫格式。如經(jīng)過(guò)邏輯轉(zhuǎn)換,一個(gè)完整的文件可能被分開(kāi)成多段存儲(chǔ)到不連續(xù)的物理地址,使用目錄或鏈表的方式來(lái)獲知下一段的位置。
上一章的串行Flash芯片驅(qū)動(dòng)只完成了向物理地址寫入數(shù)據(jù)的工作,而根據(jù)文件系統(tǒng)格式的邏輯轉(zhuǎn)換部分則需要額外的代碼來(lái)完成。實(shí)質(zhì)上,這個(gè)邏輯轉(zhuǎn)換部分可以理解為當(dāng)我們需要寫入一段數(shù)據(jù)時(shí),由它來(lái)求解向什么物理地址寫入數(shù)據(jù)、以什么格式寫入及寫入一些原始數(shù)據(jù)以外的信息(如目錄)。這個(gè)邏輯轉(zhuǎn)換部分代碼我們也習(xí)慣稱之為文件系統(tǒng)。
24.2
FatFs文件系統(tǒng)介紹
上面提到的邏輯轉(zhuǎn)換部分代碼(文件系統(tǒng))即為本章的要點(diǎn),文件系統(tǒng)龐大而復(fù)雜,它需要根據(jù)應(yīng)用的文件系統(tǒng)格式而編寫,而且一般與驅(qū)動(dòng)層分離開(kāi)來(lái),很方便移植,所以工程應(yīng)用中一般是移植現(xiàn)成的文件系統(tǒng)源碼。
FatFs是面向小型嵌入式系統(tǒng)的一種通用的FAT文件系統(tǒng)。它完全是由ANSI C語(yǔ)言編寫并且完全獨(dú)立于底層的I/O介質(zhì)。因此它可以很容易地不加修改地移植到其他的處理器當(dāng)中,如8051、PIC、AVR、SH、Z80、H8、ARM等。FatFs支持FAT12、FAT16、FAT32等格式,所以我們利用前面寫好的串行Flash芯片驅(qū)動(dòng),把FatFs文件系統(tǒng)代碼移植到工程之中,就可以利用文件系統(tǒng)的各種函數(shù),對(duì)串行Flash芯片以“文件”格式進(jìn)行讀寫操作了。
FatFs文件系統(tǒng)的源碼可以從FatFs官網(wǎng)下載:
FatFs官網(wǎng)
http://elm-chan.org/fsw/ff/00index_e.html
FatFs源碼下載連接
http://elm-chan.org/fsw/ff/archives.html
24.2.1
FatFs特性
DOS/Windows兼容的FAT/exFAT文件系統(tǒng)。
與平臺(tái)無(wú)關(guān),易于移植。
程序代碼和工作區(qū)的占用空間非常小。
支持以下各種配置選項(xiàng):
ANSI/OEM或Unicode中的長(zhǎng)文件名。
exFAT文件系統(tǒng),64位LBA和GPT可存儲(chǔ)大量數(shù)據(jù)。
RTOS的線程。
多個(gè)卷(物理驅(qū)動(dòng)器和分區(qū),最多10個(gè)卷)。
可變扇區(qū)大小。
多個(gè)代碼頁(yè),包括DBCS。
只讀,可選API,I/O緩沖區(qū)等…
24.2.2
FatFs層級(jí)結(jié)構(gòu)
FatFs層級(jí)結(jié)構(gòu)如下:

應(yīng)用層調(diào)用FatFs模塊接口,F(xiàn)atFs調(diào)用底層接口,實(shí)現(xiàn)對(duì)USB、SD卡等存儲(chǔ)設(shè)備的操作(需提供RTC時(shí)鐘給FatFs模塊)。
24.3
源碼下載

FatFs和Petit FatFs:
PetitFatFs是用于小型8位微控制器的FatFs模塊的子集。它是按照ANSI C編寫的,并且與磁盤I/O層完全分開(kāi)。即使RAM大小小于扇區(qū)大小,也可以將其合并到內(nèi)存有限的微型微控制器中。我們這里選擇完整版的FatFs。
24.3.1
源碼結(jié)構(gòu)
在移植FatFs文件系統(tǒng)到開(kāi)發(fā)板之前,我們先要到 FatFs的官網(wǎng)獲取源碼,官網(wǎng)有對(duì)FatFs做詳細(xì)的介紹,有興趣可以了解。解壓之后可看到里面有 documents和source這兩個(gè)文件夾和LICENSE.txt文件,見(jiàn)圖FatFs文件目錄。documents文件夾里面是一些使用幫助文檔;source才是FatFs文件系統(tǒng)的源碼。而LICENSE.txt則是使用FatFs所需遵循的許可證。
FatFs 0.15版本的源碼結(jié)構(gòu)如下:


24.3.1.1
FatFs幫助文檔
打開(kāi)documents文件夾,可看到如圖documents文件夾的文件目錄:

documents這個(gè)文件夾下面存放的是FatFs模塊文檔:
? 其中doc文件夾里面是編譯好的html文檔,講的是FatFs里面各個(gè)函數(shù)的使用方法,這些函數(shù)都是封裝好的函數(shù),利用這些函數(shù)我們就可以操作串行Flash芯片。
? res文件夾包含doc文件夾下文件需要用到的圖片,還有四個(gè)名為app.c文件,內(nèi)容都是FatFs具體應(yīng)用例程。
? 00index_e.html相當(dāng)于FatFs的主頁(yè)。
? updates.txt記錄了各個(gè)版本的更新。
24.3.1.2
FatFs源碼
打開(kāi)src文件夾,可看到如圖source文件夾的文件目錄:

source這個(gè)文件夾下面存放的是FatFs源碼:
? diskio.c/.h:IO層的實(shí)現(xiàn)。
? ff.c/.h:FatFs核心文件,文件管理的實(shí)現(xiàn)方法。該文件獨(dú)立于底層介質(zhì)操作文件的函數(shù),利用這些函數(shù)實(shí)現(xiàn)文件的讀寫。
? ffconf.h:這個(gè)頭文件包含了對(duì)FatFs功能配置的宏定義,通過(guò)修改這些宏定義就可以裁剪FatFs的功能。
? ffsystem.c:操作系統(tǒng)相關(guān)。
? ffunicode.c:unicode編碼相關(guān)。FF_USE_LFN !=0時(shí)必須包含此文件。
? 00history.txt:介紹了FatFs的版本更新情況。
? 00readme.txt:說(shuō)明了當(dāng)前目錄下各個(gè)文件的功能。
24.3.2
長(zhǎng)文件名
FatFs模塊支持FAT文件系統(tǒng)的長(zhǎng)文件名(LFN)擴(kuò)展名。默認(rèn)情況下,禁用LFN。如果要啟用LFN,要將FF_USE_LFN設(shè)置為1、2或3,并將ffunicode.c文件添加到項(xiàng)目中。LFN功能需要一定的工作緩沖區(qū)。緩沖區(qū)大小可由FF_MAX_LFN根據(jù)可用內(nèi)存配置。LFN的長(zhǎng)度最多可以為255個(gè)字符,因此FF_MAX_LFN也應(yīng)設(shè)置為255。

24.3.3
FatFs限制
文件系統(tǒng)類型:FAT、FAT32(rev0.0)和exFAT(rev1.0)。
打開(kāi)的文件數(shù)量:無(wú)限制。(取決于可用內(nèi)存)
卷數(shù):最多10個(gè)。
扇區(qū)大?。?12、1024、2048和4096字節(jié)。
最小卷大?。?28個(gè)扇區(qū)。
最大卷大?。?2位LBA中的2^32-1扇區(qū),在帶有exFAT的64位LBA中幾乎不受限制。
最大文件大小:FAT卷上為2^32-1字節(jié),exFAT卷上幾乎不受限制。
群集大?。篎AT卷上最多128個(gè)扇區(qū),exFAT 卷上最多16MB。
24.3.4
FatFs的已知問(wèn)題
掃描下方二維碼或復(fù)制鏈接到瀏覽器查看:記錄著有關(guān)Fatfs最新版本的已知問(wèn)題以及問(wèn)題的解決方法或補(bǔ)丁。
下載鏈接
http://elm-chan.org/fsw/ff/patches.html

網(wǎng)址上會(huì)公布已發(fā)現(xiàn)并解決的BUG,以補(bǔ)丁形式發(fā)布。以R0.14b版本為例,目前該版本有2個(gè)補(bǔ)丁。
有需要的話可以按照官方提供的方法對(duì)源碼進(jìn)行修改,由于我們這里使用的都是一些比較基礎(chǔ)的功能,這些功能是沒(méi)有問(wèn)題的,所以就不進(jìn)行修改了。
-
FlaSh
+關(guān)注
關(guān)注
10文章
1758瀏覽量
155854 -
文件系統(tǒng)
+關(guān)注
關(guān)注
0文章
305瀏覽量
21033 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4421瀏覽量
67813 -
FATFS
+關(guān)注
關(guān)注
0文章
46瀏覽量
19597
原文標(biāo)題:基于FLASH的FatFs文件系統(tǒng)移植——瑞薩RA系列FSP庫(kù)開(kāi)發(fā)實(shí)戰(zhàn)指南(85)
文章出處:【微信號(hào):瑞薩嵌入式小百科,微信公眾號(hào):瑞薩嵌入式小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
瑞薩RA系列FSP庫(kù)開(kāi)發(fā)實(shí)戰(zhàn)指南之I2C讀寫EEPROM實(shí)驗(yàn)
瑞薩RA系列FSP庫(kù)開(kāi)發(fā)實(shí)戰(zhàn)指南之基于FLASH的FatFs文件系統(tǒng)移植實(shí)驗(yàn)
瑞薩e2studio(1)----瑞薩芯片之搭建FSP環(huán)境
【瑞薩RA2L1入門學(xué)習(xí)】RA2L1開(kāi)發(fā)環(huán)境搭建
【瑞薩RA6E2地奇星開(kāi)發(fā)板試用】介紹、環(huán)境搭建、工程測(cè)試
【瑞薩RA4系列開(kāi)發(fā)板體驗(yàn)】開(kāi)發(fā)環(huán)境搭建和新手點(diǎn)燈指南
【瑞薩RA4系列開(kāi)發(fā)板體驗(yàn)】體驗(yàn)過(guò)程
【野火啟明6M5開(kāi)發(fā)板體驗(yàn)】開(kāi)箱+認(rèn)識(shí)開(kāi)發(fā)板+資料
Fatfs(文件系統(tǒng)的移植)
瑞薩e2studio(1)----瑞薩芯片之搭建FSP環(huán)境
瑞薩RA系列FSP庫(kù)開(kāi)發(fā)實(shí)戰(zhàn)指南之FatFs文件系統(tǒng)介紹
評(píng)論