專利名稱:一種嵌入式系統(tǒng)中非易失性存儲器的數(shù)據(jù)存取方法
技術領域:
本發(fā)明涉及嵌入式數(shù)據(jù)庫領域,具體地是指使用Flash作為非易失性數(shù)據(jù)存儲器的嵌入式系統(tǒng)中存儲器的數(shù)據(jù)存取方法。
背景技術:
Flash以其速度快和非易失性廣泛地應用于嵌入式系統(tǒng)中。Flash有如下特點1、讀Flash操作和讀RAM是相同的(寫和擦除操作后的讀操作需要在讀操作前復位);2、寫Flash操作只能把Flash中數(shù)據(jù)從“1”變到“0”(Bit);3、擦除操作可以把“0”變成“1”,但擦除操作只能針對整段進行,一段一般是64KByte左右。
4、每段的擦除壽命有限,一般是每段可以擦除10萬次。
目前,對Flash的讀寫都是調用底層的函數(shù)直接對Flash進行操作。對Flash中的數(shù)據(jù)進行改變時,必須先把相應的一段數(shù)據(jù)全部讀入RAM,對RAM進行修改,然后擦除該段,最后再把RAM中的數(shù)據(jù)寫入該段(以下簡稱讀擦除寫操作)。這樣做有幾個缺點1、當存入Flash中的數(shù)據(jù)結構(以下簡稱數(shù)據(jù)結構)比較復雜時,軟件很難維護。
2、當數(shù)據(jù)結構或Flash型號發(fā)生改變時,必須重新編寫軟件。
3、對Flash中數(shù)據(jù)的改變,即使是只有一個Bit,也得對整個Flash進行擦除。這樣做既會增加時間,也會減少Flash壽命。變化很頻繁的數(shù)據(jù)只在整個Flash中占很小一部分,若對該數(shù)據(jù)所在的段頻繁擦除,則該段很容易達到它的壽命,從而導致軟件無法運行,也就是產品無法再使用了。
4、在進行讀擦除寫操作時,如果發(fā)生意外斷電,則Flash中的數(shù)據(jù)很有可能會丟失或損壞,從而導致軟件無法運行或死機。
中國專利公開號CN 1581109A,
公開日2005年2月16日,發(fā)明名稱為《一種刷新嵌入式系統(tǒng)中非易失性存儲器的方法》,提出了將存儲器劃分邏輯塊,對邏輯塊進行編號,借助標志,系統(tǒng)每刷新完一邏輯塊都作一次記錄,即使系統(tǒng)在刷新過程中意外中斷,也可在下次刷新操作時從中斷位置開始,而不需要對已成功刷新的邏輯塊進行重復的數(shù)據(jù)寫入的技術方案。減少了對存儲單元的刷新次數(shù),降低了壞塊的危險性,提高了存儲器的使用壽命。但該技術方案沒有改變存儲器中在原位置進行刷新的操作方式。某個數(shù)據(jù)的頻繁變化及刷新,對其所在存儲單元使用壽命的影響要遠大于因斷電而導致增加刷新次數(shù)所帶來的影響。因此,該技術方案對存儲器使用壽命的提高較小,壞塊的危險性依然較高。同時,也難以降低因意外斷電而導致存儲器中數(shù)據(jù)丟失或損壞的風險。
發(fā)明內容
為了解決目前對Flash操作中存在的編程復雜、移植性差、壽命短和意外斷電數(shù)據(jù)易被損壞問題,本發(fā)明提供了一種嵌入式系統(tǒng)中非易失性存儲器Flash的數(shù)據(jù)存取方法。該方法能延長存儲器的使用壽命、能對意外斷電損壞的數(shù)據(jù)進行恢復,且通用性、移植性好。
本發(fā)明解決其技術問題所采用的技術方案是一種嵌入式系統(tǒng)中非易失性存儲器的數(shù)據(jù)存取方法,包括以下步驟A.按照Flash(非易失性存儲器)中的物理結構將其存儲器劃分為一個以上的段,根據(jù)段的起始地址從小到大給有效段唯一編號,段編號存儲于段本身中,在每段內劃分有一個以上的邏輯塊,在段內有效塊唯一編號,塊編號存儲于塊本身中;B.按照段和塊的編號順序從小到大存儲或更新塊內文件,更新時,在段號最大的段中尋找未使用的空塊,把原塊中的數(shù)據(jù)經(jīng)過修改后復制到該空塊中,原塊的編號也一并復制到該空塊中,使之成為有效塊,將原塊標記為無效塊,當段中的空塊使用完時,則按照從小到大的編號順序尋找新的空段,在新的空段中尋找空塊進行文件存儲或更新操作;C.當只剩下一個空段時,則在所有舊段中尋找無效塊,若所有舊段中均無無效塊,這時存儲器空間已滿,停止文件存儲或更新操作;若尋找到帶有無效塊的段則執(zhí)行步驟D;D.對帶有無效塊的舊段進行整理,把舊段中的有效塊復制到新的空段中,把該空段編號為存儲器中最大段號加一,把舊段的物理地址寫入新段中,然后擦除舊段,將舊段標記為空段,再執(zhí)行步驟B。
本發(fā)明在步驟B中進一步包括以下步驟B1在對塊進行文件更新操作前對塊進行操作前標記,在操作完成時對塊進行操作完成標記,在對段進行操作前對段進行操作前標記,在操作完成時對段進行操作完成標記;B2在系統(tǒng)重新啟動時對塊和段進行掃描,若發(fā)現(xiàn)有操作前標記沒有操作完成標記的塊號相同的兩個有效塊時,如果塊號相同的兩個塊在同一段中,則靠后面的塊為有效塊,前面的塊為無效塊;如果塊號相同的兩個塊不在同一段中,則指定段號大的段中的塊為有效塊,段號小的段中的塊為無效塊;B3對有效塊重復步驟B1。
本發(fā)明的步驟A中所劃分各段的大小是相同的,各塊的大小也是相同的,段的大小為64KB--256KB,塊的大小為256B--1024B。
本發(fā)明的有益效果一是保證了不論修改存儲器中的什么數(shù)據(jù),即使是對同一數(shù)據(jù)的不停修改,對存儲器中段的擦除都是循環(huán)交替進行的,F(xiàn)lash中每一段的擦除次數(shù)都相同(最多只相差一次)。與原有Flash中在原位置上不斷擦除并寫入某經(jīng)常修改數(shù)據(jù)的方式相比,本發(fā)明方法所采用的由原塊向空塊步進似的擦除方式,實現(xiàn)了對Flash的均勻磨損,而不會是某段擦除壽命到了,其他塊或段還沒被擦除幾次。使用了均勻磨損后,F(xiàn)lash的壽命大大延長,如果是在那些經(jīng)常修改數(shù)據(jù)的情況下應用,F(xiàn)lash壽命的延長就顯得更加明顯。二是可以實現(xiàn)斷電后數(shù)據(jù)的恢復。通過將數(shù)據(jù)復制到RAM中,在系統(tǒng)外進行修改后,再寫入空塊中的操作,在數(shù)據(jù)更新的同時,較好地保存了原塊的原始數(shù)據(jù)直至修改后的數(shù)據(jù)寫入空塊以后,才擦除原塊中的數(shù)據(jù)。如可在系統(tǒng)重新啟動時對塊和段進行掃描,若塊(或段)只有操作前標記而沒有操作完成標記,則可知此塊(或段)在上次操作時發(fā)生意外斷電。即可把斷電前的相同塊(段)號的舊塊(段),復制到新的空塊中并標記為有效,從而實現(xiàn)斷電數(shù)據(jù)恢復。能保證在任何意外掉電的情況下,不使Flash里的文件系統(tǒng)混亂,并盡可能保證文件內容不丟失。也就是說,本發(fā)明可以保證在任何一個寫Flash的操作中,當發(fā)生意外掉電時,文件系統(tǒng)不亂。三是將存儲器內的數(shù)據(jù)調入獨立的文件處理系統(tǒng)即根據(jù)本發(fā)明方法設計的FFS文件系統(tǒng)進行修改,F(xiàn)FS文件系統(tǒng)的實現(xiàn)不依賴于Flash的型號和Flash中存儲的數(shù)據(jù)。FFS文件系統(tǒng)可以在不同系統(tǒng)間方便移植,通用性好。
圖1是Flash數(shù)據(jù)結構2是Flash文件結構3是CPU的RAM中文件結構樹4是本發(fā)明方法中文件創(chuàng)建的過程5是本發(fā)明方法中尋找空塊的過程6是本發(fā)明方法中刪除文件的過程圖具體實施方式
以下結合
的具體實施方式
對本發(fā)明作進一步的詳細描述本發(fā)明方法可以直接用于存儲器內的文件處理系統(tǒng)中,但由于Flash的型號較多,數(shù)據(jù)結構比較復雜,通用性較差,系統(tǒng)的設計和維護不夠方便。
申請人采用本發(fā)明方法設計了用于嵌入式系統(tǒng)中非易失性存儲器的FFS(Flash File System)文件處理系統(tǒng)?,F(xiàn)結合該文件處理系統(tǒng)的設計對本發(fā)明方法作深入地介紹。
參見圖1,本發(fā)明的Flash數(shù)據(jù)結構分為一個以上的段,根據(jù)段的起始地址從小到大給有效段唯一編號,段編號存儲于段本身中,每一個段中又分為一個以上的塊,在段內給有效塊唯一編號,塊編號存儲于塊本身中。其中段頭和塊頭的設計如下一.段頭(Sector Head)段頭長256字節(jié),由以下幾個部分組成1.文件系統(tǒng)標識(8字節(jié)字符串)值為“FFSbyHB”,表示此段為本文檔所定義的文件系統(tǒng)中的一部分。
2.文件系統(tǒng)版本號(2字節(jié)無符號整型)當前版本號為0x03013.狀態(tài)(2字節(jié)比特串MSB先,缺省值為“1”)1)段整理開始1Bit2)段整理結束1Bit3)段無空塊1Bit4)段有無效塊1Bit5)擦除舊段開始1Bit6)擦除舊段結束1Bit7)寫段號開始1Bit8)寫段號結束1Bit9)保留8~1Bits4.段號(4字節(jié)無符號整型)段號是唯一的,段號大的段的最后寫操作時間比段號小的段晚??斩蔚亩翁枮?xFFFFFFFF。
5.舊段物理地址(4字節(jié)無符號整數(shù))6.保留(21~256字節(jié))二.塊頭(Block Head)1.塊號(2字節(jié)無符號整型,不能為”0”)塊號在一個文件系統(tǒng)中唯一標識一個塊。在有效塊中(段的有效標識見下文)塊號是唯一的。意外斷電有可能導致塊號相同的兩個有效塊,如果兩塊在同一段中,后面的塊有效,前面的塊無效;如果在不同的段中,段號大的塊有效,段號小的塊無效??諌K的塊號為0xFFFF。
2.同一文件或目錄中下一塊的塊號(2字節(jié)無符號整型)文件的最后一塊此段為0xFFFF3.此塊中有效數(shù)據(jù)的長度(1字節(jié)無符號整型)注目錄不需要說明長度4.狀態(tài)(1字節(jié)比特串MSB先,缺省值為“1”)1)塊寫操作開始1Bit2)塊寫操作結束1Bit3)修改下一塊的塊號開始1Bit4)修改下一塊的塊號結束1Bit5)文件第一次加入數(shù)據(jù)開始1Bit6)文件第一次加入數(shù)據(jù)結束1Bit7)塊無效1Bit8)文件或目錄的第一塊1Bit參見圖2,圖2中介紹了Flash的文件結構,(1)塊頭、“3/5”表示當前塊號/下一塊號,(2)文件頭,(3)有效數(shù)據(jù),(4)未用空間三.文件頭1.文件屬性(1字節(jié)比特串MSB先)1)文件還是目錄1Bit“1”文件“0”目錄2)只讀1Bit3)存檔1Bit4)系統(tǒng)1Bit5)隱藏1Bit6)保留3~1Bits2.文件名(31字節(jié)“0”結尾字符串)文件和目錄除了1Bit的標志外其他都一樣,目錄是一種特殊的文件,目錄的文件頭存放目錄名和目錄屬性,目錄的文件數(shù)據(jù)中存放直接屬于該目錄的目錄和文件的第一塊的塊號。目錄數(shù)據(jù)的分配可以整塊進行,因為0xFFFF是無效塊號,而且0xFFFF可以被改寫為任何塊號。
四.目錄里存放的路徑的格式(4Byte)1.狀態(tài)(1字節(jié)比特串Msb先)1)寫block num開始1bit2)寫block num結束1bit3)擦除block num開始1bit4)擦除block num結束1bit5)刪除原來的路徑開始1bit(for movefile)6)刪除原來的路徑結束1bit(for movefile)
7)保留(1Byte)2.子文件\目錄的第一個block num2byte所有的路徑的表示root/dir name/…/file name注意都用“/”隔斷,所有的文件、目錄都從root開始。
五、名詞解釋1.段物理上,F(xiàn)lash中的一段(Sector),一般為64KB左右。
2.塊邏輯上,文件分塊存放于段中,塊大小為256B。
3.空塊未使用的塊。
4.空段所有塊都為空塊的段。
六、段和塊的操作1.格式化段格式化為空段,即擦除所有的段。
段中的塊全為空塊,既塊頭和塊數(shù)據(jù)全為0xFF。
2.塊的讀操作塊的讀操作和讀RAM一樣,不允許同時讀寫,在寫和擦除后要進行復位操作,之后才能讀。
3.塊的寫操作要避免只針對塊的某一個字節(jié)進行寫操作,這樣會引起對Flash的頻繁寫操作。寫操作在RAM中緩存,為每個打開的文件分配一個和Flash塊大小相同的RAM塊,寫前把當前用戶正準備操作的Flash塊中的數(shù)據(jù)和塊頭拷入RAM塊中。當RAM塊寫滿或用戶跳到另外一個Flash塊或文件關閉時,才把RAM塊中的數(shù)據(jù)寫進Flash。寫Flash,只可以把“1”變?yōu)椤?”。
塊寫前先要找到一個空塊,在最大段號段中尋找第一個空塊,若最大段號段中無空塊,則把此段的“段無空塊”標記為0,并找到下一個空段,并把此空段的“段號”設為Flash中最大段號加一,并在此空段中尋找第一個空塊。
然后把空塊的“塊寫操作開始”標記為0,然后把RAM塊中的數(shù)據(jù)和塊頭寫入此空塊,把此塊中的有效數(shù)據(jù)長度寫入空塊的“此塊中數(shù)據(jù)的長度”,然后把空塊的“塊寫操作結束”標記為0,最后把Flash中原來的塊標記為無效,并且把原來的塊所在的段的“段有無效塊”標志為0。
塊的寫操作也要修改CPU的RAM中的數(shù)據(jù)結構。
4、段的整理當Flash中只剩下一個空段時就應該進行段的整理。首先找到該空段(稱為新段),然后把新段的“段整理開始”標記為0,然后找到段號最小的且“段有無效塊標志”為0的段(稱為舊段),把舊段的物理地址寫入新段的“舊段物理地址”,然后把舊段的有效塊拷入新段,把新段的“段號”設為Flash中最大段號加一,然后把新段的“段整理結束”標記為0。然后把新段的“擦除舊段開始”標記為0,然后把舊段格式化,然后把新段的“擦除舊段結束”標記為0。
段的整理也要修改CPU的RAM中的數(shù)據(jù)結構。
七、文件和目錄的操作1.空塊的尋找1.在Flash中的段號最大的段中是否有空塊,有空塊則返回空塊物理地址,否則繼續(xù)。
2.調用找空段函數(shù),得到一個最近的空段的地址和空段的個數(shù),如果空段只有一個,而且其余的段中有“段有無效塊標志”為“0”,則調用整理函數(shù),再執(zhí)行1,此時一定可以分配到空塊。
3.若不滿足1,且Flash只剩一個空段,同時其余的段中“段有無效塊標志”均為為“1”,則表示Flash已滿,返回尋找空塊失敗。
4.若不滿足1,且Flash至少還剩兩個空段,則尋找最近的一個空段,然后此空段中第一個空塊即為所得,返回其物理地址。
2.創(chuàng)建1.調用“空塊的尋找”,在Flash中找到一個空塊。
2.寫入塊頭信息。
3.寫入文件頭信息。
4.更改在內存中建立的目錄結構樹。
3.刪除1.根據(jù)內存中建立的目錄結構樹找到所要刪除文件的節(jié)點和它上一級文件夾的節(jié)點,就可以找到文件所占用的塊的地址,和上一級文件夾占用的塊的物理地址。
2.把文件占用的這些塊標志為無效。
3.在該文件的上一級文件夾所占用的塊中找到該文件的路徑信息,把此信息擦除。
4.更改目錄結構樹。
4.讀數(shù)據(jù)1.根據(jù)內存中建立的目錄結構樹找到要讀文件的節(jié)點。
2.把當前塊的數(shù)據(jù)從Flash讀入RAM,然后再從中截取出需要的數(shù)據(jù)。
5.寫數(shù)據(jù)1.寫文件1)根據(jù)內存中建立的目錄結構樹找到要寫文件的節(jié)點;2)讀該文件的第一塊,得知是否是空文件(即只有文件頭的,沒有寫數(shù)據(jù)的,也就是文件長度為FF),若是空文件執(zhí)行3),否則執(zhí)行4);3)若是空文件,則直接將小于248Byte個的數(shù)據(jù)寫入當前block,如果長度超過一個block,則執(zhí)行5);4)把當前塊的數(shù)據(jù)讀入Ram,然后從需要寫的位置開始,把輸入的數(shù)據(jù)寫入,若原位置上有數(shù)據(jù)則替換原來數(shù)據(jù),當夠了一個塊的數(shù)據(jù)時,找到一個空塊,把數(shù)據(jù)寫入,然后把原來的塊以及其后的所有塊置為無效;5)如果數(shù)據(jù)沒有寫完,則再找一個空塊,寫數(shù)據(jù);6)并且把這些塊鏈起來,在結構樹的節(jié)點中用新的blocklink代替原來的。
2.將新增加的文件的第一塊的塊號寫入目錄1)根據(jù)內存中建立的目錄結構樹找到要寫目錄的節(jié)點;2)讀出目錄所占的塊的數(shù)據(jù),檢查里面是否還有可寫空間(ffffffff)和是否有刪除的空間(00000000),若有可寫空間執(zhí)行3),否則執(zhí)行4);3)直接將文件的第一塊的塊號寫入,并執(zhí)行5);4)是否有刪除的空間,若有則在RAM中去掉這些,只保留有效的數(shù)據(jù),然后寫入當前要存的路徑信息,尋找一個空塊,將這些數(shù)據(jù)全部寫入該塊;5)更改目錄結構樹。
八、FFS的下層接口Flash提供的函數(shù)如下
九、RAM的文件結構樹圖1)索引號與塊號對應的全局數(shù)組
表示存放每個塊地址的數(shù)組,flash塊的塊號與數(shù)組的索引號對應,n等于整個文件系統(tǒng)占用的flash塊數(shù)。
2)文件結構樹參見圖3,其中
表示根目錄
表示文件信息結點
表示塊信息結點
表示操作信息結點十、均勻磨損段號是唯一的,而且是遞增一的,每次整理時擦除的基本都是段號最小的,這樣就形成一個段寫和擦除的環(huán)狀結構。段內的塊的分配按照物理地址從小到大分配,同時也遵循了段的循環(huán)使用原則。因此可以達到均勻磨損的目的。使用了均勻磨損后,F(xiàn)lash的壽命可延長5~10倍。
十一、斷電保護按照本發(fā)明方法所建立的FFS文件處理系統(tǒng)要能保證在任何意外掉電的情況下,不使flash里的文件系統(tǒng)混亂,盡可能保證文件內容不丟失。也就是說,本發(fā)明方法只要可以保證在任何一個寫flash的操作中,當發(fā)生意外掉電時,文件系統(tǒng)不亂,就是可行的。
FFS文件處理系統(tǒng)對flash的操作有創(chuàng)建文件、刪除文件、追加文件、讀文件等,其中前三個操作會對flash進行寫,下面就對這幾種操作具體分析如何在寫flash時做斷電保護。
(注以下所寫的流程或過程均指與flash相關的讀或寫)1.創(chuàng)建文件CreatFile參見圖4,圖4是本發(fā)明方法中創(chuàng)建文件的過程圖圖4中有①、②標號的即為需要保護的地方。
標號①處(添加新創(chuàng)建文件的路徑信息)Step1塊頭->狀態(tài)->塊寫操作開始=0Step2在目錄文件(目錄也是一種特殊的文件)的內容后緊接著的未使用區(qū)域寫入增加文件\目錄的第一塊的塊號開始=0Step3寫入增加文件\目錄的第一塊的塊號Step4寫入增加文件\目錄的第一塊的塊號結束=0斷電恢復上電初始化建立文件結構樹時,發(fā)現(xiàn)這種有開始沒有結束標志的,就將開始、結束以及塊號全清零(00000000)。
結果只舍棄新創(chuàng)建的這一個文件\目錄,對其他的無影響。
標號②處(寫入塊頭信息)的執(zhí)行過程Step1塊頭->狀態(tài)->塊寫操作開始=0(如果沒有執(zhí)行標號①,則執(zhí)行此步)Step2寫入塊號Step3文件頭信息寫入flashStep4塊頭->狀態(tài)->文件\目錄的第一塊=0Step5塊頭->狀態(tài)->塊寫操作結束=0斷電恢復如果塊寫操作結束不為0,則認為塊信息不完全,上電初始化時將此塊的塊無效標志為0,段頭狀態(tài)的段有無效塊標志為0。掉電前創(chuàng)建的文件\目錄所在的非根目錄文件將會指到一個無效的塊,在創(chuàng)建文件結構樹時,凡是目錄文件指向無效塊的路徑都標志成00000000。
結果舍棄新創(chuàng)建的這一個文件\目錄。
Step6塊頭->文件第一塊數(shù)據(jù)加入開始標志置為0Step7塊頭->有效數(shù)據(jù)長度填入該文件占用此塊的有效數(shù)據(jù)長度Step8寫入文件數(shù)據(jù)Step9塊頭->文件第一塊數(shù)據(jù)加入結束標志置為0這樣只會導致文件內容不準確,而不會對文件結構造成影響,并且這種誤差是可知和易于修正的??梢栽谖募Y構樹上標注。
Step10如果文件需要不止一塊,則在寫完這一塊之后調用下述的D、追加函數(shù)2.查找空塊函數(shù)(前提段等長)參見圖5,圖5中標號③(寫入段頭信息)處的執(zhí)行過程Step1寫入分配的段號Step2寫入當前版本號0x0301Step3寫入文件系統(tǒng)標識“FFSbyHB00”只有當文件系統(tǒng)標識和版本號都正確的時候,此段才是有效段,否則認為是無效段,會在上電初始化時被清除。這樣就保證只有正確段頭信息的段是有效段,其余的段無效。
標號④(整理段)處的執(zhí)行過程Step1新段的段頭->狀態(tài)->段整理開始標志置為0Step2往新段的段頭寫入舊段物理地址Step3將舊段里的有效塊依次拷貝到新段Step4新段的段頭->狀態(tài)->段整理結束標志置為0如果有段整理開始,而沒有結束標志,則認為舊段內容沒有正確拷貝到新段,應該在上電初始化時,將這樣的段擦除,然后再重新做一遍整理。
Step5新段的段頭->狀態(tài)->擦除舊段開始標志置為0Step6擦除舊段Step7新段的段頭->狀態(tài)->擦除舊段結束標志置為0如果擦除舊段開始和結束標志不匹配,則在上電初始化時根據(jù)該段頭的舊段物理地址信息,將舊段擦除,接著再將該段的段頭->狀態(tài)->擦除舊段結束標志置為0。
3.刪除文件DeletFile參見圖6,圖6中標號⑤(標志為無效塊)執(zhí)行策略從文件的最后一個塊開始把塊頭的狀態(tài)里的塊無效標志置為0。
此時的斷電結果只是被操作文件的內容被破壞,既不會破壞結構也不會使哪一塊flash空間不可再用。或者是上一級目錄文件指向一個無效的塊,這在上電初始化建立文件結構樹時會處理(如前所述)。
標號⑥(清除路徑信息)執(zhí)行的工作Step1把上一級目錄文件(非根目錄)里的刪除文件\目錄的第一塊的塊號開始標志置為0Step2把上一級目錄文件(非根目錄)里的“記錄被刪除文件\目錄的第一塊的塊號”信息置為0Step3把上一級目錄文件(非根目錄)里的刪除文件\目錄的第一塊的塊號結束標志置為0
斷電恢復如果只有“刪除文件\目錄的第一塊的塊號開始”標志為0,而結束標志不為0,則表示刪除塊號未完成,在上電初始化,建立文件結構樹時,完成斷電前未完成的工作。
4.初始化時需要做的工作Step1掃描段,記錄有效段相關信息(段號,物理地址)如果文件系統(tǒng)標識或版本號不正確,該段視為無效,立即擦除。
如果有寫段號開始標志為0,而結束不為0,則該段視為無效,立即擦除。
如果段整理開始標志為0,而結束不為0,該段視為無效,立即擦除。
如果擦除舊段開始標志為0,而結束不為0,則根據(jù)舊段物理地址,擦除舊段。擦除之后格式化,寫上文件系統(tǒng)標識和版本號。
Step2掃描有效段的每一塊,建立文件結構樹(文件的目錄結構,文件名,每個文件\目錄依次占據(jù)的塊的塊號和各塊的物理地址,文件有效長度,文件屬性,文件是否有損壞)如果有塊寫開始標志,而沒有結束標志,該塊視為無效,塊無效標志置為0。
如果有文件第一塊數(shù)據(jù)寫開始標志,而沒有結束標志,該塊視為無效,塊無效標志置為0。
如果修改下一塊的塊號開始標志為0,而結束不為0,則視本塊為該文件的最后一塊,并且把NextBN置為0,當進行文件操作時,讀到NextBN為0則另找一空塊復制此塊內容,塊號不變,將NextBN置為正確的值。
如果同一文件\目錄中下一塊的塊號是一個無效塊的塊號,則視本塊為該文件的最后一塊,并且把NextBN置為0,當進行文件操作時,讀到NextBN為0則另找一空塊復制此塊內容,塊號不變,將NextBN置為正確的值。
如果在建立結構樹完成之后,存在沒有路徑指向的block,則把這些block都置為invalid。
如果目錄中標明的某一文件的寫文件\目錄的第一塊的塊號開始標志為0,而結束不為0,則清除該路徑信息,這樣就會產生無路徑的block,在初始化時,刪除這樣的block。
如果目錄中標明的某一文件的寫文件\目錄的第一塊的塊號開始標志為0,而結束不為0,則清除該路徑信息。
如果目錄中標明的某一文件的第一塊是無效塊,則清除該路徑信息。
如果目錄文件記錄的文件狀態(tài)的擦除原來block num開始標志為0,而結束不為0,則記錄下這個block num,當在哪個目錄中的路徑是這個block num,就說明這個目錄就是原來的應該擦除的,將此block num擦除,然后把結束標志置為0。
如果在建樹的整個過程都找不到這樣的有效目錄,則直接將結束標志置為0。
根據(jù)本發(fā)明方法所設計的FFS文件處理系統(tǒng),在使用Flash作為嵌入式非易失性數(shù)據(jù)的存儲器中進行了均勻磨損和斷電保護等性能的試驗和測試,其測試方法和結果如下FFS測試一(強度測試)(含對比測試),文件系統(tǒng)大小640K字節(jié)。在FFS中創(chuàng)建一個文件,寫入一個字節(jié),關閉文件,刪除文件。反復操作,直至FLASH損壞。記錄次數(shù)
測試1256,130,465次測試2257,332,721次測試3256,452,102次不用FFS,直接進行FLASH的讀寫擦除操作,直至FLASH損壞。記錄次數(shù)測試41,087,786次測試51,001,336次測試61,022,483次結論FFS文件系統(tǒng)用于刪除操作時的耐磨損強度比直接采用FLASH要提高250倍左右。
FFS測試二(魯棒性測試),在魯棒性測試時,先創(chuàng)建一個文件,寫入0~255共256個字節(jié)100次,在以上過程中隨機加上程序中斷,強制中斷FLASH操作,然后重新初始化FLASH。重復測試1,000次,檢查各次程序中斷后的文件是否被破壞。在以上測試中,其所得到的結果一般應有以下五種情況A.文件正常存在,數(shù)據(jù)沒有錯誤,沒有遺漏。
B.文件正常存在,數(shù)據(jù)沒有錯誤,但有遺漏。
C.文件正常存在,數(shù)據(jù)有錯誤,無遺漏。
D.文件正常存在,數(shù)據(jù)有錯誤,有遺漏。
E.文件不存在。
(注上述情況中所說的文件數(shù)據(jù)遺漏是指文件末尾的數(shù)據(jù)有丟失,但是存在文件中的數(shù)據(jù)都是正常的)1.在FFS中創(chuàng)建文件進行測試,其結果所符合的情況類型和次數(shù)如下A532B468C0D0E02.不用FFS,直接在FLASH中創(chuàng)建文件進行測試,,其結果所符合的情況類型和次數(shù)如下A198B220C232D210E140結論當發(fā)生意外掉電時,F(xiàn)FS文件系統(tǒng)可以保證在寫flash的操作中文件數(shù)據(jù)不會被破壞,但可能會有所遺漏;若直接采用FLASH系統(tǒng)則出現(xiàn)文件丟失或數(shù)據(jù)出錯的幾率比較高,也可能會出現(xiàn)數(shù)據(jù)有遺漏的情況。
由以上測試可知本發(fā)明方法應用后其Flash存儲器的使用壽命或耐磨損強度可顯著提高,其文件系統(tǒng)對意外斷電損壞數(shù)據(jù)的恢復效果好,文件系統(tǒng)及數(shù)據(jù)基本不受意外斷電的影響,且兼容性好,適于各種型號的Flash存儲器使用。
權利要求
1.一種嵌入式系統(tǒng)中非易失性存儲器的數(shù)據(jù)存取方法,其特征在于包括以下步驟A.按照Flash(非易失性存儲器)中的物理結構將其存儲器劃分為一個以上的段,根據(jù)段的起始地址從小到大給有效段唯一編號,段編號存儲于段本身中,在每段內劃分有一個以上的邏輯塊,在段內有效塊唯一編號,塊編號存儲于塊本身中;B.按照段和塊的編號順序從小到大存儲或更新塊內文件,更新時,在段號最大的段中尋找未使用的空塊,把原塊中的數(shù)據(jù)經(jīng)過修改后復制到該空塊中,原塊的編號也一并復制到該空塊中,使之成為有效塊,將原塊標記為空塊(無效塊),當段中的空塊使用完時,則按照從小到大的編號順序尋找新的空段,在新的空段中尋找空塊進行文件存儲或更新操作;C.當只剩下一個空段時,則在所有舊段中尋找無效塊,若所有舊段中均無無效塊,這時存儲器空間已滿,停止文件存儲或更新操作;若尋找到帶有無效塊的段則執(zhí)行步驟D;D.對帶有無效塊的舊段進行整理,把舊段中的有效塊復制到新的空段中,把該空段編號為存儲器中最大段號加一,把舊段的物理地址寫入新段中,然后擦除舊段,將舊段標記為空段,再執(zhí)行步驟B。
2.根據(jù)權利要求1所述的一種嵌入式系統(tǒng)中非易失性存儲器的數(shù)據(jù)存取方法,其特征在于在步驟B中進一步包括以下步驟B1在對塊進行文件更新操作前對塊進行操作前標記,在操作完成時對塊進行操作完成標記,在對段進行操作前對段進行操作前標記,在操作完成時對段進行操作完成標記;B2在系統(tǒng)重新啟動時對塊和段進行掃描,若發(fā)現(xiàn)有操作前標記沒有操作完成標記的塊號相同的兩個有效塊時,如果塊號相同的兩個塊在同一段中,則靠后面的塊為有效塊,前面的塊為無效塊;如果塊號相同的兩個塊不在同一段中,則指定段號大的段中的塊為有效塊,段號小的段中的塊為無效塊;B3對有效塊重復步驟B1。
3.根據(jù)權利要求1或2所述的一種嵌入式系統(tǒng)中非易失性存儲器的數(shù)據(jù)存取方法,其特征在于步驟A中所劃分各段的大小是相同的,各塊的大小也是相同的,段的大小為64KB-256KB,塊的大小為256B-1024B。
全文摘要
一種嵌入式系統(tǒng)中非易失性存儲器的數(shù)據(jù)存取方法。按照Flash中的物理結構將其存儲器分為一個以上的段,并給予唯一編號,在每段內劃分有一個以上的邏輯塊,在段內給予有效塊唯一編號,對存儲器中段的擦除都是循環(huán)交替進行的,F(xiàn)lash中每一段的擦除次數(shù)都相同,實現(xiàn)了對Flash的均勻磨損和斷電保護,文件系統(tǒng)的操作不依賴于Flash型號和存儲在Flash中的數(shù)據(jù),通用性、移植性好、能有效延長Flash使用壽命,文件系統(tǒng)及數(shù)據(jù)基本不受意外斷電的影響,并能對意外損壞的數(shù)據(jù)進行恢復。
文檔編號G06F12/00GK1805049SQ20051001986
公開日2006年7月19日 申請日期2005年11月22日 優(yōu)先權日2005年11月22日
發(fā)明者胡波, 袁穗聰 申請人:武漢國光通信有限公司