色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

線性文件系統的設計方案在嵌入式應用管理Flash空間中的應用

電子設計 ? 來源:單片機與嵌入式系統應用 ? 作者:吳雨俊 ? 2020-09-10 17:54 ? 次閱讀

嵌入式系統中,為了便于對閃存(Flash)空間進行管理,會采用文件的形式來訪問Flash。目前,可以購買到的Flash文件系統一般都是兼容DOS的文件系統(Flash File System,FFS),這對需要一個具有復雜的目錄層次,并且DDS文件兼容的系統來說是必要的;但是對大多數的嵌入式應用來說,這種文件系統太過奢侈。在參與嵌入式系統項目的時候,設計了一種線性文件系統,它適用于大多數的嵌入式應用對Flash文件系統的需求。

線性文件系統設計基于三個目標:一是提供給應用程序通過文件名而不是物理地址訪問系統Flash的能力;二是文件系統的設計獨立于實時操作系統(RTOS),這樣可以很容易移植到不同的嵌入式應用中;三是設計統一的底層接口,適應不同的Flash類型。本文設計的線性文件系統為典型的嵌入式系統提供了所需的類文件系統能力。需要注意的是,本文件系統不支持復雜的Flash扇區擦寫次數均衡算法,沒有目錄層次,并且和其它的文件系統不兼容。

1 線性文件系統

線性文件系統的設計思路是這樣的:文件分為文件頭和文件數據區兩個部分,每個文件按照順序存放在Flash中,以單向鏈表來鏈接文件。文件的起始部分是文件頭,包含文件的屬性、指向下一個文件頭的指針、文件頭和文件數據區的32位循環冗余校驗和(CRC32)等。文件頭用一個32位的字來表示文件屬性,每位表示一種屬性,如數據文件或者是可執行文件,是否已刪除的文件等,具體可以根據應用的需要來定義文件的屬性;文件頭和文件數據區維護獨立的CRC32校驗,使文件系統能更精確檢測文件的完整性。文件的起始地址沒有特殊需求,分配給文件系統的Flash大小限制了文件的大小。另外,線性文件系統作為嵌入式系統的一個功能模塊,它為應用程序提供與標準文件系統類似的API接口,如:read()、write()、 open()、close()、stat()和seek()等。對于同時在多片Flash的系統而言,每片Flash相當于一個目標,文件都可存儲在任何一片中(當然受物理空間限制),但不能跨片存儲。

在第一個文件創建之前,必須進行初始化,將所有分配給文件系統的Flash空間擦除。當創建第一個文件時,起始位置從文件系統的起始地址開始,文件頭指針指向下一個空文件的起始位置(鏈表尾部);第二個文件的位置從當前的鏈表尾部開始,同時文件頭中的鏈表指針指向新的尾部。刪除文件時,僅僅是簡單地把文件頭的標識位中的活動文件標識位置0,表示刪除。這樣,在經過多次刪除之后,就有必要運行碎片整理模塊來進行文件系統Flash空間的碎片整理。碎片整理模塊還需要在文件系統Flash空間尾部留一個扇區來數據備份,以便當碎片整理被打斷時(如下電或者復位)可以恢復文件系統。這個保留的扇區稱空閑扇區。它必須放在文件系統空間之后,這樣可以保證文件系統的所有文件在所占用的Flash空間是連續的。整個文件空間的分配如圖1所示。

線性文件系統的設計方案在嵌入式應用管理Flash空間中的應用

陰影部分是文件頭,數據結構如下:

struct hdr{

unsigned short hdrsize; /*文件頭字節數*/

long filsize; /*文件頭版本*/

long filsize; /*文件大小*/

long flags; /*描述文件的標識*/

unsigned long filcrc; /*文件數據的CRC32的值*/

unsigned long hdrcec; /*文件的最后修改時間*/

struct hdr *next; /*指向下一個文件頭的指針*/

char name[NAMESIZE]; /*文件名*/

char info[INFOSIZE]; /*文件描述信息*/

};

碎片整個記錄區包含兩種數據類型:碎片整理文件頭信息表defraghdr和文件區扇區整理前后的CRC值備份表sectorcre。具體的地址分配從空閑扇區的起始地址減1開始,往前分配文件系統扇區數乘以4字節作為sectorcrc的空間;從sectorcrc起始地址減1開始,往前分配活動文件個數乘以64字節作為碎片整理文件頭信息表。這兩個結構定義如下:

struct defraghdr{

struct hdr *ohdr; /*文件頭的原始位置指針*/

struct hdr *nextfile; /*指向下一個文件的指針*/

long filsize; /*文件大小*/

unsigned long crc; /*這個頭的CRC32值*/

unsigned long ohdrcrc; /*原始文件頭CRC32值的拷貝*/

long idx; /*碎片整理表頭的索引*/

long nesn; /*新的文件尾的扇區號*/

long neso; /*新的文件尾的扇區偏移量*/

char *nda; /*新的文件起始地址*/

char fname[NAMESIZE]; /*文件名*/

};

struct sectorcrc{

unsigned long precrc; /*碎片整理前扇區數據CRC32的值*/

unsigned long postcrc; /*碎片整理后扇區數據CRC32的值*/

};

從上面介紹可知,除了文件數據之外,文件系統還需要如下4種額外的開銷。

①文件頭:這是每個文件必須的開銷,如果文件名和信息域各24字節,那么整個文件頭共76字節。

②碎片整理文件頭信息表:每個活動(非刪)的文件在進行碎片整理時在這個表里創建一個表項,每個表項64字節。

③碎片整理前后的扇區CRC32值表:保存文件整理前后的CRC32值,總的字節數約為文件所占扇區數的4倍。

④空閑塊:用來在碎片整理過程中備份當前整理扇區數據。它必須不小于文件系統其它所有扇區。

可以用下面方程計算系統開銷的總和:

overhead=(FTOT*(HDRSIZE+64))+SPARESIZE+(SECTORCOUNT*8)

其中:

FTOT是總的文件數;

HDRSIZE是文件頭字節數(目前為76字節);

SPARESIZE是空閑塊的大小;

SECTORCOUNT是分配給文件系統的Flash扇區數,不包括空閑塊。

2 碎片整理

創建新文件需要占用文件系統空間;但是,由于Flash的底層技術不允許 Flash中的任意地址空間被刪除,而是按照扇區為單位刪除,為此在刪除一個文件的時候,暫時沒有把整個文件所占的空間刪除,僅僅是在文件頭的標識里作一個刪除標識,并保留在Flash中。這樣,被刪除文件積累到一定的數量時,就會占用相當大的空間。因此,需要整理文件系統Flash空間,使被刪除文件占用的空間重新使用。圖2顯示了碎片整理過程。文件F1、F2和F5已經被刪除,并且在碎片整理之后從Flash中被清除。

進行碎片整理的方法可以有多種。對于嵌入式系統來說,選擇哪種方法,衡量的依據是復雜性和功能之間的平衡。下面討論兩種不同的方法:第一種方法相當簡單,但是有缺陷;第二種方法功能強大得多,筆者在線性文件實現中即采用這種方法。當然,存在更加復雜的解決辦法,但通常的情況是,所添加的復雜性會使整個文件系統的實現更加復雜。目標是保持文件存儲的簡單和線性,保證所有的文件都是以連續的空間存儲在Flash中。

最簡單的方法是將活動的文件備份在 RAM中,刪除分配給文件系統的Flash空間,然后將RAM中備份的所有文件拷貝回Flash。這種方法很簡單,并且不需要分配一個扇區作為空閑區;但問題是,需要有一整塊和分配給文件系統的空間一樣大的RAM來完成這項工作。更糟的是,如果此時系統被復位,或者在刪除扇區內容卻還沒有將文件拷貝回 Flash的時候被斷電,文件系統將會崩潰。因為RAM中的內容會隨之選擇,文件內容會被破壞掉。

我們在文件系統實現設計了一種碎片整理方法,可以防止在碎片整理過程中系統復位導致文件崩潰的情況。采用這種方法,不需要大塊的RAM,但是需要預選先分配給碎片整理過程一個Flash扇區作為備份區。這個扇區的字節數不小于任何分配給文件系統的扇區。在整個文件系統中,這個扇區位于分配給文件系統最后一個扇區的下一個扇區。因為扇區可能比需要分配給非刪除文件的備份的空間要小,所以它必須逐個扇區進行處理,而不是一下就把所有的碎片整理完。采用備份扇區的好處是,在碎片整理過程中,無論斷電或者復位都不會破壞文件系統。當下次系統重新恢復時,會根據在碎片整理前記錄的每個扇區碎片整理前后CRC值,來判斷當前的文件碎片整理狀態。如果上次文件整理沒有完成,就會繼續上次的整理。這種技術的一個缺陷是空閑扇區的擦寫次數會較多。這樣空閑扇區就可能因為達到擦寫壽命而失敗。達到這一點的關鍵依賴于使用的Flash、所分配給文件系統的扇區數、文件刪除和重建的頻率。一個可行的解決辦法采用電池備份的RAM來替換空閑扇區,可以增加Flash的整體壽命,但是對那些預算緊張的應用來說太過奢移

具體的碎片整理過程是,首先建立碎片整理區。①為每個扇區建立2個CRC32表項;第一個CRC32是這個扇區在碎片整理前的CRC值;第二個 CRC32值是計算出來的碎片整理后的CRC32值。這些CRC是當碎片整理過程被打斷時,用來重新恢復整理用的。②創建碎片整理文件頭信息表,每個活動的文件占用一個表項。③計算①和②的CRC值,并保存。①~③的數據保存在圖1中的碎片整理記錄區。第二步是文件重定位;遍歷文件系統的每個扇區,處理重新定位后存儲空間和該扇區相覆蓋的文件。在每個扇區被重寫之前,扇區原來的信息被保存在空閑扇區里。第三步,擦除Flash;遍歷未使用的扇區,確認所有的扇區被刪除。第四步,完整性檢測:對新的文件進行檢測,保證所有重定位的文件都是完整的。

3 應用分析

Flash 的扇區有最大擦寫次數。當前的Flash芯片一般支持10萬~100萬次的擦除。文件系統的應用各不相同,所以這里不能下結論說采用線性文件系統 Flash的壽命會有多長。下面解釋文件系統訪問Flash的方法。這樣用戶可以根據應用來判斷Flash的預期壽命。

我們所設計的線性文件系統并不進行扇區刪除次數均衡,以延長Flash的使用壽命。如果所需要的文件系統頻繁修改并需要扇區刪除次數均衡,可以購買現成的Flash文件系統。扇區刪除均衡算法大大增加了底層實現的復雜性,并且超出本文的討論范圍。一般來說,通過文件系統來管理Flash的需求遠大于對Flash扇區擦寫次數均衡的需求,特別是現在越來越多的Flash扇區都支持100萬次的擦寫。

如上面所提到的,文件系統本身提供給編程者的接口API 與標準OS提供的接口類似。這可能誤導開發者認為文件系統可以看作是一個硬盤,以任意的頻率進行讀寫操作。事實并不是這樣,線性文件系統碎片整理同制并沒有進行擦寫次數均衡,這意味著空閑扇區可能會是最早損壞的Flash扇區。因為在碎片整理過程中,空閑扇區被用作其它所有扇區的暫時存放扇區。例如在設計里,有13個扇區Flash用來作線性文件系統區,有1個扇區作為空閑扇區。假設對于最壞情況的碎片整理(13個扇區都影響到),如果每天進行1次碎片整理,對于100 000次擦寫次數的Flash而言,可用期能夠超過20年(100 000/13/365=21)。20年是基于每天進行1次碎片整理,并且所有扇區都影響到的情況。碎片整理的頻率和整理所影響到的扇區數受應用程序使用文件的限制。用戶可以根據文件系統的應用來估算Flash扇區的磨損情況,并作相應的處理。

下面討論文件系統是如何使用扇區的。Flash扇區僅僅在碎片整理時候才被擦除。當刪除文件的時候,只是簡單地作一個標識(文件頭的一個位)。如果一個存在的文件以寫的方式打開,實際的修改步驟是,刪除原有的文件,并在當前文件系統的最后一個文件之后重寫該文件。最后,這個過程會使文件系統的 Flash空間被耗盡,這要就需要運行碎片整理程序。碎片整理程序會使已被刪除文件所占用的空間被清除,所有活動的文件在Flash中的位置以連續的方式存放。每個扇區的整理過程是,扇區被拷貝到空閑扇區作備份,然后原來的扇區被刪除,計算出該扇區在文件整理后的內容,寫入扇區,之后刪除空閑扇區的備份。文件系統從頭到尾每個扇區重復這樣作。在碎片整理時,如果一個扇區不需要進行碎片整理,碎片整理程序就不會動這個扇區因此,受碎片整理程序影響的扇區數目依賴于當前被文件系統占用的Flash扇區數和被刪除文件在Flash中的位置。

在一個典型的嵌入式應用里,文件系統中的可執行文件本身就是應用程序。可執行文件一般是最大的文件,也是最不可能經常改變的文件。這意味著執行文件所占用的空間是相對固定的,將會減少空閑扇區因為碎片整理而進行的擦寫次數。另外一方面,如果有任何文件需要定期改動,碎片整理將會更加頻繁運行。

結語

本文所設計的線性文件系統已經成功應用在參加的嵌入式系統的產品,并且在實踐中證明是一種比較有效的管理Flash的方式。當然,線性文件系統不是解決所有嵌入式應用管理 Flash空間問題的答案,但是它對于那些不能判斷是否要購買現成的Flash文件系統的項目提供了一個非常有用的選擇方案。

責任編輯:gt

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5082

    文章

    19104

    瀏覽量

    304815
  • FlaSh
    +關注

    關注

    10

    文章

    1633

    瀏覽量

    147940
  • 操作系統
    +關注

    關注

    37

    文章

    6801

    瀏覽量

    123283
收藏 人收藏

    評論

    相關推薦

    嵌入式Linux文件系統管理

      嵌入式 Linux 開發人員可以使用平臺映像生成器等工具獲得對構建復雜文件系統的更多控制,這使得組裝、調整和創建文件系統映像更容易完成。
    發表于 08-12 09:23 ?719次閱讀
    <b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>文件系統管理</b>

    嵌入式系統中的線性Flash文件系統設計,不看肯定后悔

    本文設計的線性文件系統為典型的嵌入式系統提供了所需的類文件系統能力。需要注意的是,本文件系統不支
    發表于 04-28 06:21

    嵌入式文件系統概述

    嵌入式Linux系統移植-(Linux文件系統嵌入式文件系統概述·文件是有組織、有次序地存儲
    發表于 11-05 06:29

    嵌入式系統中的Flash文件系統

    介紹嵌入式系統中的 Flash文件系統。對 FFS需求,Flash存儲器特性,FFS要求和實現作了描述,并介紹幾種免費和商用的 FFS。
    發表于 04-07 09:40 ?15次下載

    嵌入式系統中的線性Flash 文件系統設計

    設計一種能夠典型嵌入式環境下應用的線性文件系統, 為嵌入式系統
    發表于 05-15 15:07 ?10次下載

    嵌入式Linux上實現JFFS文件系統

    本文通過嵌入式操作系統uClinux 上實現可讀寫JFFS 文件系統的實例,介紹了嵌入式
    發表于 05-31 15:10 ?23次下載

    嵌入式Linux文件系統的研究與應用

    隨著嵌入式系統的發展,使用Linux操作系統搭建的嵌入式平臺得到了越來越廣泛的應用。文件系統嵌入式
    發表于 08-13 08:59 ?16次下載

    嵌入式Linux文件系統及存儲機制

    本文分析了嵌入式系統中常用的存儲設備及其管理機制,介紹了常用的基于FLASH文件系統類型
    發表于 05-14 10:22 ?1657次閱讀
    <b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>文件系統</b>及存儲機制

    Flash損耗均衡的嵌入式文件系統設計

    本文基于AVR單片機擴展Flash存儲器和以太網控制器設計了一款嵌入式文件系統,實現數據存儲和存儲器使用的損耗均衡,為延長Flash存儲器的使用壽命提供研究方法。
    發表于 06-27 09:19 ?1982次閱讀
    <b class='flag-5'>Flash</b>損耗均衡的<b class='flag-5'>嵌入式</b><b class='flag-5'>文件系統</b>設計

    基于嵌入式Linux的Flash文件系統的實時性能研究_孫曉榮

    基于嵌入式Linux的Flash文件系統的實時性能研究_孫曉榮
    發表于 03-16 10:09 ?0次下載

    嵌入式文件系統及特點

    與可靠?! ?b class='flag-5'>嵌入式文件系統特點  嵌入式文件系統雖然繼承了通用文件系統的組織結構,但由于功能和作用與普通桌面操作
    發表于 09-06 14:29 ?1174次閱讀

    Linux嵌入式文件系統如何構建

    Linux支持多種文件系統,同樣,嵌入式Linux也支持多種文件系統。雖然嵌入式系統中,由于資
    發表于 06-18 09:23 ?992次閱讀

    Nand Flash文件系統解決方案

    Nand Flash文件系統解決方案(嵌入式開發一般考什么證書)-ST提供適用于SLC的NFTL(NAND Flash Translatio
    發表于 07-30 10:41 ?9次下載
    Nand <b class='flag-5'>Flash</b><b class='flag-5'>文件系統</b>解決<b class='flag-5'>方案</b>

    嵌入式Linux系統移植-(Linux文件系統

    嵌入式Linux系統移植-(Linux文件系統嵌入式文件系統概述·文件是有組織、有次序地存儲
    發表于 11-02 12:51 ?16次下載
    <b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>系統</b>移植-(Linux<b class='flag-5'>文件系統</b>)

    文件系統】FatFs文件系統嵌入式芯片LPC18XX上的移植

    文件系統】FatFs文件系統嵌入式芯片LPC18XX上的移植
    發表于 12-04 10:51 ?12次下載
    【<b class='flag-5'>文件系統</b>】FatFs<b class='flag-5'>文件系統</b><b class='flag-5'>在</b><b class='flag-5'>嵌入式</b>芯片LPC18XX上的移植
    主站蜘蛛池模板: xnxx高中生| 王晶三级作品| 欧美狂野乱码一二三四区| 美美哒高清在线播放8| 玖玖在线精品| 泡妞高手在都市免费观看| 色女仆影院| 亚洲精品视频免费看| 在线免费公开视频| 99热久久这里只有精品视频| 成年人视频在线免费| 国产精品一区二区制服丝袜| 国产偷国产偷亚州清高| 久久亚洲伊人| 色精品极品国产在线视频 | 97caopeng| 国产精品午夜福利在线观看| 久久国产成人午夜AV影院无码| 免费在线观看黄色网址| 日本孕妇大胆孕交| 夜夜穞狠狠穞| 成人短片迅雷下载| 久久综合狠狠综合狠狠| 忘忧草日本在线WWW日本| 97碰成视频免费| 好爽胸大好深好多水| 日韩精品 电影一区 亚洲高清| 伊人久久大线蕉香港三级| 国产99九九久久无码熟妇| 母狗黄淑珍| 伊人久在线| 国产亚洲精品字幕在线观看| 日韩欧美一区二区三区免费看| 在线电影一区二区| 国产中文字幕乱码免费| 涩涩电影网| 大胸美女被吊起来解开胸罩| 男女XX00上下抽搐动态图| 亚洲视频在线免费观看| 国产黄A片在线观看永久免费麻豆| 男女牲交全过程免费播放|