陳超鑫 肖林松 陳崗 周學成
(威勝信息技術股份有限公司 湖南省長沙市 410205)
由于小型嵌入式文件系統不支持磨損均衡、掉電保護、自動檢測、自動恢復功能,在使用過程中會出現各種問題,給開發人員帶來各種麻煩。真正項目中必須加入相關保護措施,才能確保系統安全可靠運行。
現在市面上對文件系統的保護并沒有一套完整的理論及方法,沒有相關處理措施。工程師對自己文件系統及數據采用打補丁的方式,哪里有問題補哪里,效果不明顯,效率低下。大批量發貨出問題需要應對相當費時費力,從而給公司及客戶帶來巨大損失。
本系統提供一種用于嵌入式文件系統保護及恢復的方法,涉及到從系統最初的上電分區檢測,數據備份,數據恢復,掉電時文件系統的保護。
嵌入式系統上電后,對文件系統分區進行掛載操作,若多次掛載分區不成功,將對掛載的分區進行格式化操作。并對DBR、FAT、目錄區進行有效性檢測,若發現DBR、FAT、目錄區損壞,將對其進行重新格式化及參數恢復操作。
對DATA 區的數據進行有效性檢測,若DATA 區數據存在損壞或數據不可靠。根據保存在裸區中的備份/恢復信息,各記錄的頭信息,生成相應文件,保證生成的文件與最后正常運行時的文件完全一致。確保系統所需相關參數正常,系統運行正常。
系統正常運行,由守護進程實時檢測系統供電情況。當系統發生掉電,守護進程能夠迅速識別并做出反應。需要寫的文件或正在寫的文件,允許其全部寫入Flash 中。寫完后系統不再發起新的寫操作,并在合適時刻打開Flash 寫保護,讓Flash 進入寫保護狀態,系統進入電容供電模式。若系統又重新上電,系統守護進程解除對Flash 的寫保護,重新允許寫Flash。
隨著Cortex M 核技術的發展,M 核MCU 使用越來越多。M核MCU 內部所帶RAM、ROM 并不大,一般在幾十K 到1M 字節之間。但在其上運行的應用任務越來越復雜,功能越來越強大,要求處理的數據也顯著增加。為了加強對系統相關數據的管理,不得不尋求文件系統的支持。文件系統作為數據管理的唯一軟件,其重要性和可靠性不言而喻。
目前市面上能在小內存上運行的文件系統主要有FatFs、uCFs、TinyFs、LittleFs,別的大型文件系統幾乎不能移植到小內存MCU 上。但上述各文件系統設計之初并沒有完全考慮空間大小,運行效率不高,很多功能不完善。真正將上述文件系統移植到Cortex M 核芯片之后,會發現存在一系列問題,主要表現如下:
多數小型文件系統不支持均衡磨損管理。由于Flash 有一定的使用壽命,一般可擦除的次數為10 ~100 萬次,隨著擦除次數的增加,會有一些單元逐漸變得不穩定或數據存貯異常。因此要盡量避免頻繁地對同一塊地址進行擦除操作,以免造成局部單元提前損壞,盡量使整塊芯片擦寫次數均衡。需要增加Flash 更新算法和磨損程度檢測算法。Flash 更新算法是將Flash 中要更新的數據直接寫入一個空塊中,降低由于Flash 先擦除后寫入的特性帶來的對塊的頻繁擦除。

圖1:本方法總流程圖

圖2:分區在Flash 上的起始位置及大小

圖3:分區在文件系統視圖上的起始位置及大小

圖4:參數恢復流程圖

圖5:掉電保護流程圖
多數小型文件系統不支持掉電保護。由于Flash 本身內部單元設計屬性決定了,對于單個存貯單元只能將其由1 變成0,不能由0 變為1。由0 變成1 只能由Flash 提供的擦除命令并按塊操作。所以對Flash 進行寫時,一般先將一塊中的內容全部拷貝出來然后進行塊擦除,最后將要修改的內容按頁一并寫入。由于在擦除的過程中可能存在隨機掉電,存在沒有擦除完全或僅擦除了一部分,也有可能擦除后沒來得及寫入或僅寫入一部分數據。丟失的重要數據會對系統運行產生影響,若丟失的是FAT 表或目錄表,此時相當多的文件都會丟失,將產生嚴重錯誤。
多數小型文件系統不支持分區自動檢測,無法判斷FAT 表或目錄區是否損壞或部分損壞。導致的結果是損壞的文件系統仍在錯誤運行,無法及時發現并采取措施進行恢復到上一次正常運行狀態。繼續運行的后果就是系統出現不可預知的錯誤。所以嵌入式文件系統必須增加對FAT 表,目錄區有效性的檢測。檢測到損壞后要能夠自動重新進行格式化,并讓系統重新正常運行。
多數小型文件系統不支持日志功能,當分區損壞后,文件系統可以重新格式化。但重新格式化后,所有數據都會丟失,導致整個系統無法正常運行。當分區重新格式化后,要有可靠的機制保證將保存在裸區的數據恢復成系統最后正常運行的相關數據,并生成相關文件。確保系統所需數據正常,系統運行正常。
嵌入式系統上電后,對文件系統分區首先進行掛載操作,若多次掛載不成功,將對分區格式化。接下來將對DBR、FAT、目錄區的有效性進行檢測。若發現分區存在異常,將對其進行格式化及參數恢復操作。
對DATA 區進行有效性檢測,若發現數據損壞或數據不可靠,將根據保存在裸區中的備份/恢復信息,在分區中生成相應文件,保證生成的文件與最后正常運行時的文件完全一致。確保系統運行正常。
系統正常運行,由守護進程定時檢測系統是否掉電。系統掉電發生,守護進程能夠迅速識別并做出反應。需要寫的文件或正在寫的文件,系統允許其全部寫入Flash 中。寫完后系統不再發起新的寫操作,并在合適時刻打開Flash 寫保護,讓Flash 進入寫保護狀態,防止文件系統損壞。
本方法總流程圖如圖1。
對文件系統分區進行格式化,一個分區在Flash 上的邏輯映射結構:分區的最開始部分為DBR 區,接下來是FAT 表及目錄區,最后是真正存文件內容的數據區。格式化函數f_format()根據分區分配的空間大小,會計算每個區的起始位置,每個區的大小。FAT表或目錄區在格式化后,文件系統會在每個區寫入相關標志,并按要求寫入指定字符。
系統上電后,通過f_mount()函數從格式化好的分區中,讀取DBR、FAT、目錄區、數據區的開始位置、大小、分區類型等相關信息,供分區有效性檢測所用。
分區在Flash 上的起始位置及大小,如圖2。
分區在文件系統視圖上的起始位置及大小,如圖3。
文件系統使用過程中會在相關區域進行Sector 分配,并按要求在相關區域寫入指定數據。不會出現整個Sector 全為0xFF 的情況。若出現整個Sector 全為0xFF 則認為此Sector 被擦除了但沒來得及寫,或寫入了亂數據。系統會對DBR、FAT、目錄區的起始位置、大小進行檢測,若超過指定閥值,則認為分區損壞。若系統檢測到分區損壞,會調用f_mkfs()對分區進行格式化,然后重新進行掛載操作。
FAT 表及目錄區的損壞對文件系統來講是災難性的,嚴重時會引起整個分區損壞。數據區的數據如果校驗不成功,也會引起系統出現各種問題。當分區出現損壞時則進行格式化,若數據區出現損壞,則要增加恢復處理。若為參數區損壞,系統會調用prm_ret_files()進行參數恢復,確保所需參數正常,保證系統運行正常。
參數備份依據:產品出廠前,系統調用prm_bak_files()將默認參數與實時參數全部備份到裸區。運行過程中只要有參數修改都要進行相應參數備份, 調用prm_bak_onefile()進行單個參數備份。確保備份區與參數區的參數實時同步,一直是最新的。
裸區中參數存放:裸區的前4K保存的是備份/恢復記錄信息(32字節),備份/恢復標志,備份/恢復次數。每個參數最前面32 字節為文件頭信息:文件名、文件長度、文件CRC 校驗,每個文件內容從文件頭信息的第32 字節開始存放。從4K 開始存放實時參數,每個實時參數目前分配16K。
參數恢復依據:若系統發現參數損壞,首先讀取文件備份恢復記錄信息,確認裸區是否進行過備份。若裸區進行過備份,接下來讀取文件記錄頭信息,包括文件名、長度、CRC 檢驗。根據文件長度讀取記錄數據,對數據進行CRC 檢驗。然后根據記錄文件名在分區中生成相應文件, 系統校驗在分區中生成的文件是否正常。接下來進行下一個文件恢復,所有文件恢復完成后,設置系統文件恢復記錄相關信息,整個恢復工作完成。如圖4 所示。
系統守護進程實時監測系統是否掉電。若發現系統掉電,馬上保存系統有用的中間數據并生成掉電記錄,處理完后設置系統掉電標志,系統不再發起新的寫操作,但前期發起的相關寫操作仍然允許完成。延時指定時間等待所有寫操作完成,接下來對Flash 發送寫保護命令,Flash 進入寫保護狀態,系統進入電容供電模式。若系統又重新上電,守護進程解除對Flash 的寫保護,重新允許寫Flash,系統進入上電正常模式。若系統一直沒有重新上電,系統等待電容電量耗光,系統完全掉電。如圖5 所示。
如圖6。
update 升級區:用于串口、USB、遠程升級文件的中轉站。分區最后4K 建立升級文件及控制信息,如升級與否、長度、校驗、時標信息。

圖7:文件備份恢復記錄結構
param 參數區:文件系統支持,出廠默認參數,實時運行參數存放此分區。
log日志區:文件系統支持,終端的黑匣子,記錄終端上下電、參數破壞、及系統模塊生成的各種重要信息。
rttapp數據區:文件系統支持,系統各任務所需數據均聚集于此。
raw 參數備份區:裸區不支持文件系統,由系統通過地址直接管理,以記錄的形式保存運行所需的重要數據。當數據分區受到破壞時,需從raw 備份區拷貝數據生成相應文件。
文件備份恢復記錄結構,如圖7。

測試主要從兩個方面進行:一是人為對DBR、FAT、目錄區進行破壞,寫入相關非法數據或刪除相關重要信息字段,看系統是否能檢測出損壞并恢復。二是對文件系統進行頻繁的讀寫操作,在讀寫過程中進行刀閘實驗,控制刀閘隨機上下電時間,進行10-15 天的長時間測試,看文件系統及文件是否損壞或損壞后能否恢復。
對4 臺樣品終端,全部在高溫、常溫、低溫下各進行10 天刀閘試驗,總共進行30 天刀閘試驗,每10 天對4 臺樣品終端檢查一次,文件系統及文件沒有出現損壞的情況。
通過長時間刀閘實驗,發現文件及文件系統,沒有被損壞,說明本系統的掉電保護機制起到了保護作用,不會在掉電時寫壞文件及文件系統。人為對DBR、FAT、目錄區進行損壞,上電重啟時系統啟動檢測機制,可以有效判斷出相關分區已損壞,并自動重新進行格式化,然后根據備份區將相關參數重新生成文件。批量發貨十幾萬臺,長時間運行未報告文件系統損壞問題。說明本文件系統保護及恢復方法有效可靠。
由于現有小型嵌入式文件系統對均衡磨損、掉電保護、分區檢測、日志功能支持不足,本系統針對這些不足提供了一種嵌入式文件系統的保護及恢復方法。在系統上電后,從掛載分區開始,就進入保護措施,能夠在啟動系統之初,迅速判斷相應的數據是否有損壞的情況發生。為了確保系統運行的準確性,對DBR、FAT、DIR區的數據準確性進行檢測,并采取對應的恢復操作。在實際使用中由系統守護進程實時監測系統是否掉電,確保文件數據寫入正常。本方法從系統數據準確性的角度保障系統的正常運行,在嵌入式系統的保護上具有極大意,能夠確保文件系統穩定可靠運行。