FatFS檔案系統詳解 附移植建議

2021-06-15 08:29:14 字數 3101 閱讀 3686

最近做的spi flash,本打算弄個檔案系統,由於之前用過了jffs、yaffs和trueffs,**量都相當的大,這次想找款**量不那麼嚇人的,學習一下,聽說配置會相對複雜一些。選來選去,最終選定了fatfs,**量足夠的小,最新的r0.09版本只有1個.c檔案(當然,還有乙個底層的要自己寫,option資料夾裡的無視),老點版本就更小了。而且更新很頻繁,使用者量也夠大,就選定它了。儘管最後由於硬體和專案原因未能實際的移植它到vxworks,但學過的還是要記錄下。

在這裡在做具體修改之前,先大概閱讀下fatfs的源**,可以先讀integer.h,了解所用的資料型別,然後是ff.h,了解檔案系統所用的資料結構和各種函式宣告,再就是diskio.h,了解與介質相關的資料結構和操作函式。ff.c這個檔案相對較大,可以在最後將所實現的函式大致掃瞄一遍,之後根據使用者應用層程式呼叫函式的次序仔細閱讀相關**。各個檔案都可以直接用記事本開啟查閱,非常方便。ff.h中的幾個結構體十分重要,列舉如下,首先是最基礎的檔案系統結構體:

[cpp]view plain

copy

/* file system object structure (fatfs) */

typedef

struct

fatfs;  

然後是與之相關的檔案和資料夾結構體,附上具體注釋:

[cpp]view plain

copy

/* file object structure (fil) */

typedef

struct

fil;  

下面是目錄的:

[cpp]view plain

copy

/* directory object structure (dir) */

typedef

struct

*/#if _use_lfn

wchar

*  lfn;            

/* pointer to the lfn working buffer */

word

lfn_idx;        

/* last matched lfn index number (0xffff:no lfn) */

#endif

} dir;  

其他類似f_mount、f_open等介面api就不細說了,在掛載的時候其實真正起作用的是chk_mounted函式,在這裡才會將掛載分割槽的相關資訊分配到fatfs結構體中;還有乙個get_fat函式,也比較重要,在f_open和許多目錄操作的函式中都有用到,而且fat入口這個表達也十分晦澀,而它又呼叫了乙個move_window的函式,也是十分晦澀難懂,可能是我英語太爛的緣故吧。實際上,move_window的作用是改變檔案系統的當前工作扇區,如果要遷移到的是當前扇區,直接返回,如果不是,就將原扇區寫回,若是fat表,還要寫進備份區。

熟悉了**結構後,現在開始作修改了,首先修改ffconf.h檔案配置與硬體相關的檔案系統特性,然後自己新增一套底層操作即可。先看ffconf.h,裡面定義了很多巨集,可以根據自己需要一一配置:

先看功能配置:

_fs_tiny:檔案系統為標準的還是微型的,預設為標準的(0);

_fs_readonly:檔案系統是否為唯讀,預設為可讀寫(0),若唯讀則f_write、f_sync、 f_unlink、f_mkdir、f_chmod、f_rename、f_truncate和f_getfree不可用;

_fs_minimize:裁剪檔案系統的功能,預設為全部功能(0),若為1、2則會移除大部分鏈結、目錄等功能;

_use_strfunc:是否允許字串操作,預設為不允許(0),這個看個人需求,一般情況下設定為1即可,如果工作在windows下,為保證檔案相容性(如換行符』\n』和回車符』\r』)建議將此項設定為2;

_use_mkfs:是否允許使用f_mkfs函式,預設為0,用於建立資料夾,建議開啟;

_use_forward:用於允許f_forward函式,只有開啟tiny檔案系統時才用到,該函式用於將讀寫的資料立即轉存到資料流中,以節省ram空間;

_use_fastseek:是否開啟快速索引,預設為0,開啟後,會使用fil結構體中的cltbl元素來加快搜尋;

_code_page:指定目標系統使用的oem**頁,預設為日語(932),改為936簡體中文;oem是什麼意思呢?在os編碼中,unicode是一種雙位元組字元編碼,無論中文還是英文,或者其他語言統一到2個位元組,它與現有的任何編碼(ascii,gb等)都不相容。windowsnt(2000)的核心即使用該編碼,所有資料進入核心前轉換成unicode,退出核心後在轉換成版本相關的編碼(通常稱為oem,在簡體中文版下即為gb);

_use_len、_max_len、_lfn_unicode:這三個的意思不是很清楚,但是確定是與長檔名有關的,不建議開啟,否則又要多加函式,麻煩;

_fs_rpath:是否允許相對路徑,讓我選擇就不開啟,否則邏輯變得複雜不說,**量也變多了一些;

再看硬體相關配置:

_volumes:磁碟(flash)邏輯卷數,預設為1,不建議修改;

_max_ss:扇區大小,預設512byte,最大可設定4096byte;

_multi_partition:分割槽選項,預設為0,即乙個分割槽,若想要多分割槽可自行設定;

_use_erase:是否允許扇區擦除,預設為0,若開啟則要在disk_ioctl函式中新增擦除命令**;

最後是檔案系統配置:

_word_access:資料遞進格式,預設為0,即以位元組為單位遞進,相容性更強,若你的系統最新單位為字(2byte),則可設為1;

_fs_reentrant、_fs_timeout、_sync_t:這三個選項與檔案系統是否允許重入有關,所直白點,就是能否被多執行緒同時訪問,像rtos中,一般建議開啟,_sync_t可定義為對應os中的操作物件,windows下為handle,ucos中為os_event,vxworks中為semaphore。另外,開啟後還需要新增ff_req_grant、ff_rel_grant和ff_del_syncobj三個函式,實際上實現的功能就是申請互斥量、釋放互斥量和刪除互斥量的意思,可以定義os封裝即可;

_fs_share:和上面的類似,表示檔案系統最大允許同時開啟多少檔案,預設為0,即只能開啟乙個。

FatFS檔案系統詳解 附移植建議

最近做的spi flash,本打算弄個檔案系統,由於之前用過了jffs yaffs和trueffs,量都相當的大,這次想找款 量不那麼嚇人的,學習一下,聽說配置會相對複雜一些。選來選去,最終選定了fatfs,量足夠的小,最新的r0.09版本只有1個.c檔案 當然,還有乙個底層的要自己寫,option...

fatfs檔案系統

使用stm32cubemx新增fatfs下的user defined,開啟工程,檢視 可以發現 中先呼叫了mx fatfs init 函式,而此函式又呼叫了 fatfs linkdriver 函式,繼續查詢fatfs linkdriver 函式,發現此函式第乙個變數為diskio drvtypede...

FATFS檔案系統

二 修改fatfs 主要修改底層裝置驅動函式 diskio.c 目的 就是把 diskio.c 中的函式介面與spi flash 晶元驅動連線起來。總共有五個函式,分別為裝置狀態獲取 disk status 裝置初始化 disk initialize 扇區讀取 disk read 扇區寫入 disk...