殷杰波
(江蘇自動化研究所,連云港222061)
在以DSP為核心的嵌入式系統中,尤其在需要處理和存儲大量數據的應用領域,提供必要的文件管理功能顯得尤為重要,但大多基于DSP的嵌入式系統一般不提供文件管理功能。目前,以DSP為核心的嵌入式系統中文件的存儲一般采用FLASH存儲器,而FLASH存儲器都有自己的容量限制,不可能無限制地將所有采集到的數據全部記錄到存儲器中。針對上述問題,本文設計并實現了一種基于DSP的可循環讀寫的文件系統。其中DSP采用TI公司的TMS320C6678,存儲載體采用16片三星公司的FLASH 芯片 K9WAG08U1M,單片容量2 GB,共32 GB。該文件系統具有以下幾個特點:
①統一管理FLASH存儲器存儲空間,實施存儲空間的分配與回收;
②實現文件的按名存取,使用方便、直觀;
③向用戶提供方便使用的接口,提供對文件系統以及文件的操作命令。
文件系統中的FLASH以塊為單位組織,讀寫的最小單位是頁,每塊512頁,每頁8 192字節,按塊擦除。該文件系統參考FAT文件系統設計,FLASH開始部分4個數據塊為系統數據區,用來存儲文件系統信息。
存儲器操作的時間瓶頸不在于數據傳遞,而是FLASH存儲器內部的擦除和寫操作等待。FLASH存儲器讀出的速度和DSP處理數據的速度都很快,因此雖然將頁面作為讀寫操作的基本容量單位,但額外增加的操作時間很短。
為了使文件系統的結構更加清晰,同時便于文件系統的維護、升級和移植,將文件系統劃分為三層[1]:文件管理層、文件邏輯層和驅動層。各層的主要功能如下:
①文件管理層對整個文件系統進行封裝,為應用層提供統一的、標準的API接口,將用戶對文件操作的請求提交給文件邏輯層進行處理。為了增強文件系統在不同存儲器上的移植能力,選取幾個最基本的操作作為文件系統與FLASH存儲器設備的應用接口。本文件系統提供的基本API函數見表1。
②文件邏輯層為文件管理層提供服務,把文件管理層對文件的操作轉換為物理邏輯上的操作,并提交給驅動層處理。
③驅動層實現對存儲設備的物理操作,包括壞塊管理、區塊擦除、頁面寫入、頁面讀出等功能。

表1 文件系統API函數
本文件系統的存儲結構類似于MS-DOS的FAT文件系統結構,分別由系統記錄、文件登記表、文件分配表和文件數據區域等組成[2],其基本結構如圖1所示。
(1)系統記錄(SR)
系統記錄(SR)存放存儲器物理信息和文件系統分區信息。存儲器物理信息包括存儲器的類型、容量、劃分成多少個區塊、每區塊包含多少個頁面等。文件系統分區信息包括分區的起始塊和結束塊、分區的起始頁和結束頁、分區大小、可用空間等信息。系統記錄占用256字節,其中前48字節為存儲器物理信息,有效數據40字節;后208字節為文件系統分區信息,有效數據168字節。具體的存儲定義見表2、表3。
(2)文件登記表(FRT)
文件登記表(FRT)存放文件系統中每一個文件的文件代號、文件長度、文件屬性以及該文件的存儲鏈在文件分配表中的入口??紤]到嵌入式系統的應用范圍,本文件系統不支持子目錄結構。文件登記表占用15.75 KB,每個文件節點占用32字節,因此,該文件系統可管理15.75 KB/32 B=504個文件。文件登記表數據結構見表4。

圖1 文件系統存儲結構圖

表2 存儲器物理信息數據結構

表3 系統分區信息數據結構

表4 文件登記表數據結構
(3)文件分配表(FAT)
文件分配表(FAT)是整個文件系統的核心,存放著存儲器上所有區塊的占用與空閑情況以及每個文件的存儲鏈接結構。考慮到在嵌入式處理器上實現的方便性并權衡文件系統應用的規模,選擇將文件分配表固定為16字節的FAT標識,16 KB可標識8K個塊,每塊占用2字節,共可管理32 GB的FLASH。
(4)數據區域(Data Aera)
數據區域(Data Aera)用于存放文件的數據內容。本文件系統中,數據分配的最小單位是存儲器的一個基本擦除單位,即一個物理區塊,大小為4 MB。也就是說,文件所占用的存儲空間必須為一個物理區塊的整數倍,即使文件只有1字節,也要占用一個物理區塊的存儲空間。
當文件系統被加載時,系統首先掃描整個存儲介質。將存儲在介質中的系統信息表、文件登記表、文件分配表從存儲介質中讀取到內存,建立臨時系統信息表和臨時文件列表,創建一個臨時文件分配表。這樣,文件系統對文件登記表和文件分配表的操作轉換成對內存中兩個臨時表的操作。因為內存的讀寫效率遠遠高于FLASH,因此可以大幅提高文件系統的操作效率。文件系統初始化流程圖如圖2所示。

圖2 文件系統初始化流程圖
基于DSP的FLASH文件系統的資源消耗[3],主要包括程序代碼開銷、處理器占用時間、運行時內存開銷以及額外的FLASH存儲器消耗。其中,運行時內存開銷很大程度上限制了FLASH文件系統的應用;而設計結構的改善與運行時內存開銷直接相關,因此針對資源消耗的結構優化主要著重于減小運行時的內存開銷。
FLASH存儲器的擦除單位是區塊,這是本文件系統中數據存儲分配的最小單元。如果不采用任何措施,運行時內存開銷中將至少包括備份一個完整區塊數據的緩沖區;而一個FLASH存儲器的區塊可能很大,這在很多嵌入式系統中都是過大的資源[4]。
為此,采用交換緩沖區(Swap Buffer)技術來解決這個困難。當需要向某一個區塊寫入數據時,并不直接向該區塊寫入,而是首先擦除用于做交換緩沖區的區塊,然后逐步向交換緩沖區填入目的數據內容。此時任何有用數據內容都未被破壞,所以運行內存中的緩沖就較小。當交換緩沖區填寫完成后,再擦除目的區塊,拷貝交換緩沖區內容到目的區塊。
采用交換緩沖區后,對內存中的緩沖區大小沒有特別要求,考慮到FLASH存儲器的操作特性,選取FLASH存儲器的頁面容量作為內存緩沖區大小。在結構上做了上述改進后,可大幅降低文件系統在運行時的內存消耗。在一般的FLASH存儲器中都有一個特別制作的區塊,該區塊保證不會損壞,適用于做交換緩沖區。這樣可以省去中間交換緩沖過程的數據完整性檢驗,加快寫操作的速度。
由于FLASH具有讀寫速度較快而擦除較慢的特點[5],寫入過程中,當系統存儲空間不足需要擦除數據時,將出現擦除過程尚未結束而再次申請寫入的情況,導致數據寫入錯誤。為了避免這一錯誤,在該文件系統中設計了一個擦除隊列,并保留一定的存儲空間。當檢測到系統的剩余存儲空間小于保留空間的大小時,把舊的數據塊放入待擦除隊列,在寫入數據的間隙擦除數據,同時緩存待寫入數據,擦除完成后繼續寫入過程。文件系統的循環讀寫流程圖如圖3所示。

圖3 循環讀寫流程圖
在多數嵌入式文件系統中,僅僅對數據區域提供壞損管理,而對于系統記錄、文件分配表和文件登記表這3個極重要的文件系統數據結構卻未做任何保護。一旦這些區域的內容失效,必然將導致文件數據的大量損失。
針對FLASH存儲器的寫操作異常終止問題(如非正常關電),本文件系統中將系統記錄、文件分配表和文件登記表這3個文件系統重要數據結構采用冗余存儲的方法進行處理。這樣可以避免因它們的操作異常,而導致的整個文件系統失效。
具體做法是:將本次對文件操作所對應的系統信息記錄標記為最新,以此類推,則上次所做操作對應的系統記錄為次新記錄。對系統記錄定義4個系統記錄保留區塊,將系統記錄、文件分配表和文件登記表順序存放在這個區域 內,確切 的 位置 在文 件 系統 初 始化 時通 過 掃描找到最新的系統記錄。
如此可確保FLASH存儲器上總是存有一整套完好的較新的系統記錄表、文件分配表和文件登記表。在系統啟動運行時,文件系統首先確定每一張表備份的合法性和時效性,判斷出上次系統關閉時是否存在操作異常終止并及時更正。通過這樣的設計,即使文件系統在使用中出現了寫操作異常終止的情況,錯誤也只涉及當時被操作的文件數據,不會擴散給FLASH文件系統中的其他文件,更不會因此損壞3個文件系統表結構而造成整個文件系統的癱瘓。
本文介紹了一種在DSP環境下開發文件系統的方法,并最終在項目中實現了該文件系統。經實際應用,很好地滿足了項目在數據存儲和文件管理方面的需求。
本系統軟件主體代碼以C語言寫成,使用一個非常小的存儲器設備驅動接口,具有較好的可擴展及可移植能力。另外,本文件系統針對FLASH本身的特性,采用冗余存儲和三層結構設計,提高了文件系統的可靠性和操作效率,并具有良好的可維護性。
[1]郁玉蘭.基于DSP平臺的嵌入式文件系統的研究與設計[D].上海:上海交通大學,2005.
[2]高永占.基于SD卡的嵌入式文件系統的設計與實現[D].北京:北京交通大學,2010.
[3]Tanenbaum A S.操作系統設計與實現[M].王鵬,尤晉元,朱鵬,等譯.北京:電子工業出版社,1998.
[4]張堯學.計算機操作系統教程[M].北京:清華大學出版社,1994.
[5]董明.適宜于嵌入式多媒體應用的Flash文件系統[J].電子技術應用,2002(9):24-27.