一 文件系統:
文件系統是操作系統用於明確存儲設備(常見的是磁盤,也有基於NAND Flash的固態硬盤)或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。
操作系統中負責管理和存儲文件信息的軟件機構稱為文件管理系統,簡稱文件系統。文件系統由三部分組成:文件系統的接口,對對象操縱和管理的軟件集合,對象及屬性。
從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。具體地說,它負責為用戶建立文件,存入、讀出、修改、轉儲文件,
控制文件的存取,當用戶不再使用時撤銷文件等。
二 fatfs邏輯
FatFs是用於小型嵌入式系統的通用FAT / exFAT文件系統模塊。 FatFs模塊是依據ANSI C(C89)標准編寫的,並且與磁盤I / O層完全分開。 因此,它的運行獨立於平台。
可以將其合並到資源有限的小型微控制器中,例如8051,PIC,AVR,ARM,Z80,RX等。
fatfs寫的特別簡潔,非常適合入門者學習和熟悉文件系統。借着stm32的開發機會,筆者對fatfs做了一個大致的梳理。
stm32中的fatfs文件系統分層一般分成兩層,一層是底層的邏輯,這部分主要是通過配置內存卡的寄存器來實現數據的讀寫。另外一層是應用邏輯,這部分負責把函數封裝成可以調用的文件。
讓用戶能清晰的操作文件。
三 文件系統的底層邏輯
DSTATUS SD_disk_initialize(BYTE drv)
這個主要是初始化的內存設備,很多存儲卡的設備都是標准的,不過,也不排除有些設備的兼容性問題是否可以。這個初始化的時候,一定要對准手冊,看一下內存卡命令接口信息。
從sd卡中讀取信息:
DRESULT SD_disk_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count)
往sd卡中寫信息,
DRESULT SD_disk_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count)
對齊和復位存儲設備
DRESULT SD_disk_ioctl(BYTE drv, BYTE ctrl, void *buff)
四 文件系統的應用邏輯
文件系統的應用邏輯非常簡單,就是讓用戶可以自由簡單的操作文件。
這部分應用函數主要有以下部分構成:
文件系統的遍歷,通過該遍歷,可以知道設備下有多少文件以及文件名
FRESULT mf_scan_files(const TCHAR* path)
掛載文件,就是把一個文件掛帶到驅動中
FRESULT f_mount (
FATFS* fs, /* Pointer to the file system object (NULL:unmount)*/
const TCHAR* path, /* Logical drive number to be mounted/unmounted */
BYTE opt /* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */
)
創建或者打開文件
/*-----------------------------------------------------------------------*/
/* Open or Create a File */
/*-----------------------------------------------------------------------*/
FRESULT f_open (
FIL* fp, /* Pointer to the blank file object */
const TCHAR* path, /* Pointer to the file name */
BYTE mode /* Access mode and file open mode flags */
)
讀取文件
FRESULT f_read (
FIL* fp, /* Pointer to the file object */
void* buff, /* Pointer to data buffer */
UINT btr, /* Number of bytes to read */
UINT* br /* Pointer to number of bytes read */
)
寫文件
FRESULT f_write (
FIL* fp, /* Pointer to the file object */
const void* buff, /* Pointer to the data to be written */
UINT btw, /* Number of bytes to write */
UINT* bw /* Pointer to number of bytes written */
)
同步文件
FRESULT f_sync (
FIL* fp /* Pointer to the file object */
)
關閉文件
FRESULT f_close (
FIL* fp /* Pointer to the file object to be closed */
)
這里還有目錄級別的操作,比如,打開文件目錄,遍歷文件目錄,這就不一一贅述了。
五 后記
文件系統在計算機中是一個重要的部分,是一個計算機系統中的地圖,它可以讓存儲的信息分成一個個小單元,達到使用者容易辨識的境地。