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

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

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


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

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

source這個文件夾下面存放的是FatFs源碼:
? diskio.c/.h:IO層的實(shí)現(xiàn)。
? ff.c/.h:FatFs核心文件,文件管理的實(shí)現(xiàn)方法。該文件獨(dú)立于底層介質(zhì)操作文件的函數(shù),利用這些函數(shù)實(shí)現(xiàn)文件的讀寫。
? ffconf.h:這個頭文件包含了對FatFs功能配置的宏定義,通過修改這些宏定義就可以裁剪FatFs的功能。
? ffsystem.c:操作系統(tǒng)相關(guān)。
? ffunicode.c:unicode編碼相關(guān)。FF_USE_LFN !=0時必須包含此文件。
? 00history.txt:介紹了FatFs的版本更新情況。
? 00readme.txt:說明了當(dāng)前目錄下各個文件的功能。
24.3.2
長文件名
FatFs模塊支持FAT文件系統(tǒ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的長度最多可以為255個字符,因此FF_MAX_LFN也應(yīng)設(shè)置為255。

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

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