電子產業(yè)一站式賦能平臺

PCB聯(lián)盟網

搜索
查看: 2726|回復: 0
收起左側

嵌入式工程師證書培訓_基于Flash存儲器的嵌入式文件系統(tǒng)設計

[復制鏈接]

2607

主題

2607

帖子

7472

積分

高級會員

Rank: 5Rank: 5

積分
7472
跳轉到指定樓層
樓主
發(fā)表于 2020-8-14 16:50:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
嵌入式工程師證書培訓_基于Flash存儲器的嵌入式文件系統(tǒng)設計,   

引 言

Flash 存儲器( Flash Memory) 是一種高可靠性、高密度的固態(tài)存儲器件。其存儲方式是完全非易失性的,掉電后可以保存數據;可以在線寫入,并可按頁連續(xù)字節(jié)寫入,存取速度快,所以嵌入式系統(tǒng)通常使用Flash 存儲器作為存儲設備。 但Flash存儲器也存在著兩個主要缺陷:一是在重寫之前必須進行擦除,因為Flash 存儲器劃分成很多擦除塊(SectorOErase) ,對任何一位數據進行修改必須先擦除整個塊(Sector) ;二是擦除塊的擦除次數有限,當一個塊提前達到擦除次數上限時, 將導致整個Flash 存儲器無法使用。 所以,目前PC 機上很多成熟的基于磁盤的文件系統(tǒng)在Flash 存儲器上使用都存在著不足。

嵌入式系統(tǒng)應具有的特點: 一是高可靠性,在惡劣環(huán)境下系統(tǒng)仍能正常工作;二是低消耗,受成本限制系統(tǒng)設計必須量體裁衣,去除冗余;三是高效率,在占用較少資源情況下保證功能需求,這樣就要求算法簡單,效率高。 而日志文件系統(tǒng)(Log-St ruct ured File System) 在數據更新時無需將數據寫入原存儲區(qū)域,適應Flash 存儲器無法進行重寫這一特點。 目前,針對Flash 存儲器的缺陷而設計的Linux 下的J FFS 文件系統(tǒng),就是采用簡化的日志文件系統(tǒng)。 J FFS 文件系統(tǒng)將磨損均衡集成于清除機制之中,在帶來掉電可恢復功能的同時,大大減少了塊擦除的次數,提高了文件系統(tǒng)的存取速度和效率。 但是,J FFS 文件系統(tǒng)無法單獨使用,或者使用于其它實時操作系統(tǒng)中。 對由于受成本和實時性限制而無法使用Linux 的一些嵌入式系統(tǒng),也就無法使用J FFS 文件系統(tǒng);谏鲜龇治,該嵌入式文件系統(tǒng)適合在開源實時操作系統(tǒng)(如μC/OS-II) 和無操作系統(tǒng)的情況下使用。

嵌入式文件系統(tǒng)原理

在日志文件系統(tǒng)中,一個文件被修改后不是被寫入到原來的存儲空間,而是被加到所有內容的后面,象日志一樣被更新,這就是日志文件系統(tǒng)的基本原理。由于同一個文件在文件系統(tǒng)中會留下不同的版本,所以系統(tǒng)需要設置一張表標注文件的最新與以前的版本。在內容不斷添加時為不將存儲空間占滿,系統(tǒng)設計了一種回收機制,回收無效內容占用的空間。

日志文件系統(tǒng)在文件更新時不用將文件寫回原來的地址,這對Flash 存儲器這種存儲介質最為適合。 文中所設計的嵌入式文件系統(tǒng)采用了日志文件系統(tǒng)的設計原理,以及J FFS 文件系統(tǒng)將磨損均衡集成于清除機制之中的方法。 該系統(tǒng)將一個可擦寫塊平分為多個簇,文件的讀寫以簇為單位進行。簇的狀態(tài)有3 種:臟、干凈和空。臟表示所存內容已被置為無效;干凈表示所存數據有效;空表示可以寫入數據。文件和目錄在該系統(tǒng)中被作為節(jié)點,一個節(jié)點占用若干個簇,節(jié)點中的內容連續(xù)存儲,但不能越過塊邊界存儲。該系統(tǒng)設置一個索引節(jié)點,保存整個系統(tǒng)的信息,其中包含保存有各簇狀態(tài)的簇狀態(tài)表。

每一次文件更新后內容都將被添加至末尾處,索引節(jié)點也被更新,總是占用最末尾的干凈簇。 回收臟簇時,將所要擦除塊中的干凈簇重寫到空簇中,再進行塊擦除。 當內容寫至存儲體末端,則從頭部重新開始循環(huán)存儲。 所設計的文件系統(tǒng)的操作過程見圖1。

  
  




嵌入式文件系統(tǒng)設計

Flash 存儲器中的存儲結構

Flash 存儲器中的存儲結構見圖2。 該存儲器中每個簇的第一個字作為簇的狀態(tài)字,表示此簇是否為一個節(jié)點的首簇或空簇。 每個節(jié)點的首部存放此節(jié)點屬性(文件/目錄/索引節(jié)點) 和節(jié)點標識號。

  
  




索引節(jié)點

索引節(jié)點存放該文件系統(tǒng)的大部分信息。 包括32 位的索引節(jié)點更新號、一張簇狀態(tài)表、下一個要被擦除塊的塊號、給下一個新建節(jié)點(文件或目錄) 的節(jié)點編號、系統(tǒng)根目錄信息表。系統(tǒng)每一次更新都會產生新的索引節(jié)點,索引節(jié)點更新號加1。 按照Flash 存儲器的使用壽命10 年計算,需要每秒更新136 次以上,才能達到索引節(jié)點更新號的上限,所以認為擁有最大更新號的索引節(jié)點為最新的索引節(jié)點。簇狀態(tài)表中對應每一個簇有兩個Bit 位,表示各個簇的狀態(tài)(干凈01 ,臟11 ,空00) 。根目錄信息表存放根目錄下的各個目錄項,每個目錄項包括:屬性(文件0x1/目錄0x0) 、文件名或目錄名、節(jié)點編號、此文件(或目錄) 對應節(jié)點的起始簇地址、根目錄表的大小可變。

目錄節(jié)點

目錄節(jié)點存放的內容有目錄名,目錄項個數,及所有目錄項信息。 文件節(jié)點存放文件名,文件大小,文件屬性及文件內容,內存中的目錄結構見圖3。

  
  




內存數據結構及基本操作

該文件系統(tǒng)載入(Mount ) 后,會在內存中建立一個系統(tǒng)的映象。該映象包括:索引節(jié)點中的信息、目錄及文件信息、每個可擦寫塊中包含的節(jié)點信息、未存盤的節(jié)點信息。簇狀態(tài)表、索引節(jié)點更新號、新節(jié)點編號、下一擦除塊號等索引節(jié)點中的內容,在內存中均作為不同的變量。內存中為每個文件和目錄都建立了映象,數據結構見圖4 和圖5。
  




  

內存中的文件節(jié)點不包含文件真正的數據,而使用指針。文件被打開時,在內存中創(chuàng)建一塊新存儲區(qū)域存放數據,數據指針便指向此存儲區(qū),未被打開時,此指針指向空。 對于每個目錄有1 個目錄層數,表示此目錄的深度,如根目錄的目錄層數為0 ,根目錄的下一級目錄則為1 ,依此類推。 存儲地址保存文件或目錄在Flash 中的地址。文件和目錄都被存在上一級目錄下,所屬目錄指針即指向上一級目錄在內存中的數據結構,根目錄的所屬目錄指針即為空。對于同目錄下的不同節(jié)點,在內存中使用鏈表將其串聯(lián),同目錄文件指針即聯(lián)成鏈表。 鏈表的首指針保存在上一級目錄中,首目錄項指針即指向鏈表的首項。為提高塊擦寫的效率,存儲在同一個可擦寫塊中的各個節(jié)點在內存中也建立一個鏈表,塊隊列指針即用于連成此鏈表。為標識被修改的節(jié)點,利用一個未保存隊列,未保存隊列指針即用來建立此隊列。[!--empirenews.page--]嵌入式圖形識別器, 嵌入式工程師的瓶頸, 意大利rcf嵌入式, 南昌嵌入式公司排名, 嵌入式shaolu, 服務器運維和嵌入式, 嵌入式如果加載地圖, 嵌入式lzma, 嵌入式顯卡更換, 嵌入式計算技術, 非嵌入式圖形指, 在嵌入式框架中打開, 嵌入式系統(tǒng)看法, 嵌入式設備管理平臺, 嵌入式可以考什么證, 嵌入式系統(tǒng)電梯, 嵌入式教學學前兒童, 嵌入式有必要讀研, 學校嵌入式管理, 單片機是不是嵌入式, 嵌入式韋東山難學, 嵌入式方向是啥意思,

該文件系統(tǒng)載入(mount ) 時,首先順序掃描Flash 中的每個索引節(jié)點,查找出最大的索引節(jié)點更新號,此更新號對應的索引節(jié)點即為最新的索引節(jié)點。查找到最新索引節(jié)點后,將簇狀態(tài)表等信息映射到內存的數據結構中。依據索引節(jié)點中的根目錄信息,遍歷所有節(jié)點,建立內存中的目錄文件結構,并將節(jié)點添加到對應的擦寫塊隊列中。 對一個文件編輯并保存的過程見圖6。

  
  




文件打開時,先在內存中分配一塊空間作為數據區(qū),將內容寫入,并定位文件節(jié)點的數據指針指向該內存中的數據區(qū)。如果文件內容被修改,就將文件節(jié)點添加到未存盤隊列,依次寫入Flash 存儲器中,并修改簇狀態(tài)表。 保存時將內存中數據區(qū)內容寫入Flash 中,釋放申請的內存空間,修改節(jié)點中的數據指針和簇狀態(tài)表,再將文件的所有上級目錄重新寫入Flash ,最后將更新后的索引節(jié)點內容寫入Flash。如果文件未被修改,則只需修改數據指針即可。

節(jié)點加入未存盤隊列的順序按照目錄層數的大小排列,文件節(jié)點排在隊列首,目錄層數最大的排在其后,目錄層數為1 的排在隊列末尾,根目錄不加入未存盤隊列。

嵌入式文件系統(tǒng)特殊處理機制

均衡擦寫機制

為了避免任意一個可擦除塊因擦寫次數過多而過早報廢,文件系統(tǒng)對Flash擦寫時采用了均衡擦寫機制。 考慮到系統(tǒng)的精簡性,擦寫在整片Flash 的各塊中依次進行,一塊擦寫完后,下一個被擦寫的塊即為后一個塊,在系統(tǒng)的索引節(jié)點中保存了下一個要擦除的塊號。當文件系統(tǒng)中的剩余空間減少到設定值時,系統(tǒng)會擦除此塊,以回收臟簇占用的空間。對應每個可擦寫塊都有一個節(jié)點隊列,此塊中包含的節(jié)點都加入其中。塊擦除的流程見圖7。
  




首先,將未保存于隊列中的節(jié)點保存,清未保存隊列。 然后將塊隊列中的所有文件節(jié)點轉移到空簇中,同時將文件路徑上的各級目錄加入到未存盤隊列中。對于塊隊列中的目錄節(jié)點,則將它和其路徑上的各級目錄加入未存盤隊列中,按照未保存隊列的順序,依次將各個目錄寫入Flash 中,最后寫入最新的索引節(jié)點。因為目錄節(jié)點加入未存盤隊列時,按照目錄層數的大小排列,所以按照未保存隊列的順序寫入時,可以保證當一個目錄要被寫入 Flash 時,它的所有下級目錄已被寫入Flash 中。 所有下級目錄在Flash 中的存儲地址都已確定。當該文件系統(tǒng)的空間將達到存儲上限時,可能會出現特殊情況,即廢簇回收時,空簇的空間不足,無法將所有干凈簇重寫。文件系統(tǒng)為此建立了應急機制,先將文件節(jié)點內容存在內存中,這時新建一個臨時未保存隊列,專門保存文件節(jié)點,在塊擦寫完成后,將剩余的文件節(jié)點寫入新的空簇中,其算法與圖7 所示流程大致相同。 但是,一旦在擦寫時斷電,會導致該塊上的所有數據丟失。

斷電錯誤處理機制

當系統(tǒng)遭遇斷電重新啟動后,索引節(jié)點中的信息會與系統(tǒng)中的狀態(tài)不符,這時便需要錯誤處理機制。 錯誤一般是索引節(jié)點中標注的空簇已被寫入了數據,錯誤處理就是將此簇標志為臟簇,并查找下一個空簇重新寫入。

多任務處理機制

該文件系統(tǒng)允許同時打開多個文件,在多任務操作系統(tǒng)下,為了避免沖突建立了多任務處理機制。系統(tǒng)允許打開的多個文件在內存中同時被編輯修改,但是對 Flash 寫入操作有限制。 處理方法是設立Flash 寫入保護區(qū),在此區(qū)中只允許當前正在執(zhí)行的任務執(zhí)行Flash 寫入操作。 實現Flash 寫入保護區(qū)的方法是建立一個初始值為1 的信號量,當一個節(jié)點需要Flash 寫入時,首先申請信號量,完成后再釋放信號量。 Flash 寫入保護區(qū)見圖6 、圖7。在圖6 中,空操作語句是用來對多個文件的保存進行同步。 例如,有文件1 和文件2 需要保存,先將文件1 的內容寫入Flash 中,文件1 路徑下的目錄節(jié)點被添加到未保存隊列中,再將文件2 的內容寫入Flash 中,文件2 路徑下的目錄節(jié)點也被添加到未保存隊列中,最后將未保存隊列中的所有節(jié)點都寫入Flash 中。這樣,如果同一路徑下的兩個文件同時存盤,可避免路徑下的相同目錄節(jié)點被寫入兩次,從而提高了效率。不足之處在于,如果很多文件同時存盤,會導致索引節(jié)點在一段時間內都無法寫入Flash 存儲器,有斷電丟失的危險。但對于一般嵌入式系統(tǒng)來說,很少會碰到這種情況。當進行Flash存儲器擦寫時,在取塊隊列首節(jié)點至索引節(jié)點寫入完成這段時間內都不允許進行其他Flash 存儲器的寫入操作,這是為了保證數據的完整性,同時也提高了文件系統(tǒng)的穩(wěn)定性。

無目錄文件系統(tǒng)的優(yōu)化

許多嵌入式系統(tǒng)設計中雖沒有目錄管理的要求,但是對執(zhí)行效率和資源消耗的要求較高。 對于不要求有目錄管理的精簡文件系統(tǒng),在設計時也進行了優(yōu)化。精簡文件系統(tǒng)在Flash 中的存儲格式與上述設計相同,文件系統(tǒng)中的所有文件信息都保存在索引節(jié)點的根目錄信息表中。精簡文件系統(tǒng)在內存中的映象則要簡單很多,只包含索引節(jié)點中的信息,包括簇狀態(tài)表、下一個擦除塊、下一個新節(jié)點的標號和根目錄信息,而不用為每個文件都建立內存中的映象,節(jié)省大量的內存空間。 文件的編輯存盤過程簡化為:打開文件、編輯、將文件寫入Flash 存儲器、將修改后的索引節(jié)點寫入Flash 存儲器。擦寫則只需通過查詢根目錄信息表中的各個目錄項,將塊中的所有文件節(jié)點寫入空簇即可。在無目錄管理的情況下,精簡文件系統(tǒng)占用的內存資源可以減少,操作也可便捷,提高了效率。 對于大量只需要按名存取的簡單文件管理的小型嵌入式系統(tǒng)而言,針對Flash 存儲器的簡單文件系統(tǒng)將占用資源少,執(zhí)行效率高,有很大的應用價值。

嵌入式文件系統(tǒng)實現及性能分析

該文件系統(tǒng)的實現采用了分層方法,分為3 層4 個部分:應用程序接口、文件系統(tǒng)核心、操作系統(tǒng)調用接口、Flash 存儲器驅動,實現結構見圖8。

  
[!--empirenews.page--]


實現平臺中RTOS 為μC/OSOII 實時操作系統(tǒng),CPU 使用三星S4510B作為處理器,Flash 存儲器芯片為FUJ ITSU 的29LV160 TE。 針對不同的實時操作系統(tǒng)和Flash 存儲器芯片需要實現不同的操作系統(tǒng)接口和Flash 存儲器驅動。

針對μC/ OSOII 編寫操作系統(tǒng)調用接口,包括5個函數: ①系統(tǒng)調用接口初始化FS_Sys_Interface_Init ( ) ,創(chuàng)建互斥信號量和內存分區(qū); ② Flash 寫入關閉FS_Sys_Write_Lock ( ) ,禁止Flash 寫入操作,調用μC/OS-II 中OSMutePend ( ) ; ③ Flash寫入打開FS_Sys_Write_Unlock ( ) ,重新允許Flash 寫入操作,調用μC/OS-II 中OSMutePost() ; ④內存空間申請FS_Sys_Mem_Alloc( ) 和內存空間添加FS_Sys_Mem_Add ( ) , 都調用OSMemGet ( ) 來完成; ⑤內存空間釋放FS_Sys_Mem_Free ( ) ,調用OSMemPut ( ) 完成,將申請的內存塊全部釋放。針對29LV160 TE 這款Flash 存儲器芯片,定義一個FlashDef 結構體的全局變量, 用于存儲Flash 器件信息,并且編寫針對此款Flash 的塊擦寫函數FS_Device_Sector_Erase ( ) 和數據寫入函數FJ FS_Device_Write ( ) 。

完成這兩部分的實現后,該系統(tǒng)就可運行調試。 測試應用程序接口(API) 。應該提供的各部分功能,并在突然斷電情況下,測試文件系統(tǒng)的恢復情況。無目錄管理的精簡文件系統(tǒng)的載入,可在2μs內完成,文件寫入耗時主要為閃存的等待時間,系統(tǒng)本身只占用不到200 個字節(jié)的內存,產生的代碼段大小為7 K。完整的文件系統(tǒng)載入時,需要建立內存中映象,耗時根據文件數量的多少而不同,一般為10μs ,產生的代碼段大小為11 K。系統(tǒng)寫入效率較高,在無目錄管理的配置下尤其明顯。試驗中系統(tǒng)在多次斷電的情況下,系統(tǒng)仍能恢復至上次存盤的狀態(tài),雖會導致個別文件未更新,但不會導致文件系統(tǒng)崩潰。

結 語

針對Flash 存儲器的固有缺陷設計了一種基于Flash 存儲器的嵌入式文件系統(tǒng)。 在文件讀寫時,極大減少了Flash 存儲器擦寫的次數,提高了效率。 此系統(tǒng)代碼精簡,運行時占用內存資源少,運行效率高,而且有斷電保護,有較高的安全性。
回復

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表