fatfs學習-stm32零玩轉

21.1 文件系統簡介:

使用SPI FLASH直接存儲數據:

      當需要記錄字符“STM32-F429 SPI FLASH” 時。 可以把這些文字轉化成ASCII碼,存儲在數組中,然後調用SPI_FLASH_BufferWrite函數,把數組內容寫入到SPI Flash芯片的指定地址上,在需要的時候從該地址把數據讀取出來,再對讀出來的數據以ASCII碼的格式進行解讀。


• 難以記錄有效數據的位置
• 難以確定存儲介質的剩餘空間
• 不明確應以何種格式來解讀數據


Windows上的文件系統:

文件系統,就是對數據進行管理的方式。使用文件系統可有效地管理存儲介質。
文件系統在計算機中的表現形式:


磁盤的物理結構:

       使用文件系統時, 它爲了存儲和管理數據,在存儲介質建立了一些組織結構,這些結構包括操作系統引導區、目錄和文件
常見的windows下的文件系統格式包括FAT32、 NTFS、 exFAT。
       在使用文件系統前,要先對存儲介質進行格式化。 格式化時會在存儲介質上新建一個文件分配表和目錄。這樣,文件系統就可以記錄數據存放的物理地址,剩餘空間

磁盤分區表:


       Windows操作系統爲了便於用戶對磁盤的管理。加入了磁盤分區的概念,即將一塊磁盤邏輯劃分爲幾塊,它會把磁盤的分區信息記錄到硬盤分區表中。
       在硬盤分區表中,描述了各個邏輯分區的屬性,如分區開始和結束位置所在的物理地址(柱面號、扇區號),空間大小等信息。

        文件系統的存在使存取數據時,不再是簡單地向某物理地址直接讀寫,而是要遵循它的讀寫格式。如經過邏輯轉換,一個完整的文件可能被分開成多段存儲到不連續的物理地址,使用目錄或鏈表的方式來獲知下一段的位置
        使用文件系統時,數據都以文件的形式存儲。寫入新文件時,先在目錄中創建一個文件索引, 它指示了文件存放的物理地址,再把數據存儲到該地址中。當需要讀取數據時,可以從目錄中找到該文件的索引,進而在相應的地址中讀取出數據。具體還涉及到邏輯地址、簇大小、不連續存儲等一系列輔助結構或處理過程


文件系統的結構與特性

文件系統的空間示意圖


存儲了A.TXT,B.TXT, C.TXT文件

目錄示意圖


記錄了文件的開始位置、大小等信息
文件分配表


        文件 a.txt 我們根據目錄項中指定的 a.txt 的首簇爲 2,然後找到文件分配表的第 2 簇記錄,上面登記 的是 3,就能確定下一簇是 3。找到文件分配表的第 3 簇記錄,上面登記的 是 4,就能確定下一簇是 4......直到指到第 11 簇,發現下一個指向是 FF,就是結束。文件便讀取完畢。

文件系統的空間示意圖


刪除B.TXT文件,創建D.TXT文件後的空間示意圖


原目錄示意圖

刪除B.TXT文件,創建D.TXT文件後的目錄示意圖

原文件分配表示意圖

刪除B.TXT文件,創建D.TXT文件後的文件分配表示意圖

21.2 FatFs文件系統簡介:

一、C語言中的文件操作

文件的打開操作

fopen 打開一個文件

文件的關閉操作

fclose 關閉一個文件

文件的讀寫操作

fgetc 從文件中讀取一個字符
fputc 寫一個字符到文件中去
fgets 從文件中讀取一個字符串
fputs 寫一個字符串到文件中去
fprintf 往文件中寫格式化數據
fscanf 格式化讀取文件中數據
fread 以二進制形式讀取文件中的數據
fwrite 以二進制形式寫數據到文件中去
getw 以二進制形式讀取一個整數
putw 以二進制形式存貯一個整數

文件狀態檢查函數

feof 文件結束
ferror 文件讀/寫出錯
clearerr 清除文件錯誤標誌
ftell 瞭解文件指針的當前位置

文件定位函數

rewind 反繞
fseek 隨機定位

二、FATFS文件系統簡介:

       FatFs是面向小型嵌入式系統的一種通用的FAT文件系統。它完全是由AISI C語言編寫並且完全獨立於底層的I/O介質。因此它可以很容易地不加修改地移植到其他的處理器當中,如8051、 PIC、 AVR、 SH、 Z80、H8、 ARM等。 FatFs支持FAT12、 FAT16、 FAT32等格式。
        FatFs文件系統的源碼可以從fatfs官網下載:
http://elm-chan.org/fsw/ff/00index_e.html
        利用前面寫好的SPI Flash芯片驅動,把FatFs文件系統代碼移植到工程之中,就可以利用文件系統的各種函數,對SPI Flash芯片以“文件”格式進行讀寫操作了

三、FatFs的目錄結構:

         下載FatFs源碼包解壓後,在doc 文件夾裏面是一些使用幫助文檔;在src 是FatFs文件系統的源代碼

四、FatFs幫助文檔:

       其中 en 和 ja 這兩個文件夾裏面是編譯好的html文檔,講的是FATFS裏面各個函數的使用方法。 00index_e.html和00index_j.html是一些關於FATFS的簡介。 

21.3 FATFS源碼:


• integer.h:文件中包含了一些數值類型定義。
• diskio.c:包含底層存儲介質的操作函數,這些函數需要用戶自己實現,主要添加底層驅動函數。
• ff.c: FatFs核心文件,文件管理的實現方法。該文件獨立於底層介質操作文件的函數,利用這些函數實現文件的讀寫。
• cc936.c:本文件在option目錄下,是簡體中文支持所需要添加的文件,包含了簡體中文的GBK和Unicode相互轉換功能函數。
• ffconf.h:這個頭文件包含了對FatFs功能配置的宏定義,通過修改這些宏定義就可以裁剪FatFs的功能。如需要支持簡體中文,需要把ffconf.h中的_CODE_PAGE 的宏改成936並把上面的cc936.c文件加入到工程之中。
        建議閱讀這些源碼的順序爲: integer.h --> diskio.c --> ff.c 。閱讀文件系統源碼ff.c文件需要一定的功底, 建議先閱讀FAT32的文件格式,再去分析ff.c文件。若僅爲了使用文件系統,則只需要理解integer.h及diskio.c文件並會調用ff.c文件中的函數就可以了。


FatFs在程序中的關係網絡:


• 用戶應用程序需要由用戶編寫,想實現什麼功能就編寫什麼的程序,一般我們只用到f_mount()、 f_open()、 f_write()、 f_read()就可以實現文件的讀寫操作。 這些應用層函數使用方法與標準C的文件操作函數類似。
• FatFs組件是FatFs的主體,文件都在源碼src文件夾中,其中ff.c、 ff.h、integer.h以及diskio.h四個文件我們不需要改動只需要修改ffconf.h和diskio.c兩個文件。
• 底層設備輸入輸出要求實現存儲設備的讀寫操作函數、存儲設備信息獲取函數等等。


FatFs移植需要用戶支持函數:

————————————————
版權聲明:本文爲CSDN博主「Sumjess」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章