1引言
FLASH(閃速存儲器)作為一種安全、快速的存儲體,,具有體積小,、容量大、成本低,、掉電數(shù)據(jù)不丟失等一系列優(yōu)點,,已成為嵌入式系統(tǒng)中數(shù)據(jù)和程序最主要的載體。由于FLASH在結構和操作方式上與硬盤,、E2ROM等其他存儲介質有較大區(qū)別,,使用FLASH時必須根據(jù)其自身特性,對存儲系統(tǒng)進行特殊設計,,以保證系統(tǒng)的性能達到最優(yōu),。
2FLASH的特點
FLASH是一種非易失性存儲器NVM(Non-VolatileMemory),根據(jù)結構的不同可以將其分成NORFLASH和NANDFLASH兩種,。但不管哪一種都具有如下特點:
(1)區(qū)塊結構
FLASH在物理結構上分成若干個區(qū)塊,,區(qū)塊之間相互獨立。比如NORFLASH把整個Memory分成若干個Sector,,而NANDFLASH把整個Memory分成若干個Block,;
(2)先擦后寫
由于FLASH的寫操作只能將數(shù)據(jù)位從1寫成0,不能從0寫成1,,所以在對存儲器進行寫入之前必須先執(zhí)行擦操作,,將預寫入的數(shù)據(jù)位初始化為1。擦操作的最小單位是一個區(qū)塊,,而不是單個字節(jié),。
(3)操作指令
除了NORFLASH的讀,F(xiàn)LASH的其它操作不能像RAM那樣,,直接對目標地址進行總線操作,。比如執(zhí)行一次寫操作,它必須輸入一串特殊的指令(NORFLASH),,或者完成一段時序(NAND FLASH)才能將數(shù)據(jù)寫入到FLASH中,。
(4)位反轉
由于FLASH固有的電器特性,在讀寫數(shù)據(jù)過程中,,偶然會產(chǎn)生一位或幾位數(shù)據(jù)錯誤,。這就是位反轉。位反轉無法避免,,只能通過其他手段對結果進行事后處理,。
(5)壞塊
FLASH在使用過程中,可能導致某些區(qū)塊的損壞,。區(qū)塊一旦損壞,,將無法進行修復。如果對已損壞的區(qū)塊進行操作,,可能會帶來不可預測的錯誤,。尤其是NAND FLASH在出廠時就可能存在這樣的壞塊(已經(jīng)被標識出)。
3 關鍵設計
3.1 FLASH通用設計
對于一個嵌入式系統(tǒng),,設備的兼容性越好,,系統(tǒng)可行性就越好,產(chǎn)品也就越有競爭力,。所以,,為了兼容不同類型的FLASH設備,對FLASH進行通用設計至關重要,。
對于NORFLASH,,數(shù)據(jù)的讀操作可以通過獨立的數(shù)據(jù)總線和地址總線快速完成,然而NOR FLASH的其他操作需要通過特殊的指令來完成,,更糟糕的是不同廠商生產(chǎn)的芯片這些指令互不相同,。這就導致了設備的不兼容。
對于NAND FLASH,,也存在這樣的問題,。NAND FLASH可以根據(jù)相同的指令讀取芯片的廠商號和設備號,從而通過識別設備號調用對應的時序流程實現(xiàn)操作,。但是,,系統(tǒng)中太多的判斷,會使得程序的結構變得非常復雜,。所以,,在一定的條件下,NAND FLASH設備還是不兼容的,。
為了解決這一問題,,一個較好的方法是將FLASH的各個操作指令以及結構特性按照統(tǒng)一的格式存放到FLASH中固定位置。系統(tǒng)初始化時,,將這個結構讀入系統(tǒng),,通過分析這個結構,,可以獲得關于芯片所有相關信息,包括操作指令,,區(qū)塊分布等等,。這樣,系統(tǒng)可以輕松實現(xiàn)對不同型號FLASH的所有操作,,極大地提高了設備的擴展性,。
3.2雙模式文件系統(tǒng)設計
嵌入式系統(tǒng)中文件數(shù)據(jù)的存放一般有兩種結構,一種是索引格式的線性結構,,一種是非線性的鏈表式結構,。這兩種結構各有優(yōu)缺點。比如對于系統(tǒng)配置,、點陣字庫等一些具有固定結構的系統(tǒng)數(shù)據(jù),,索引結構比鏈表式結構更有效率。但對于經(jīng)常更新的用戶數(shù)據(jù),,鏈表式結構要比索引結構更靈活,。如果系統(tǒng)能將兩種結構集成,勢必能將性能發(fā)揮到最優(yōu),。
實現(xiàn)這種集成的方法是將設備定義成若干個分區(qū),,每個分區(qū)相互獨立,不同分區(qū)可以使用不同的文件模式,。這樣,,不同類型的數(shù)據(jù)就可以根據(jù)自己的屬性選擇存放的分區(qū)。比如系統(tǒng)數(shù)據(jù)存放在使用索引線性結構的分區(qū),,用戶數(shù)據(jù)存放在使用鏈式非線性結構的分區(qū),。
3.3壞塊處理
FLASH中的壞塊處理是一件很棘手的問題,如果沒有有效的管理,,對系統(tǒng)的穩(wěn)定性會造成嚴重影響,。一個可行的解決方法是生成一張壞塊表,壞塊表中記錄所有壞塊的塊號,,并且按塊號從小到大排序,,壞塊表在讀寫過程中動態(tài)更新。當讀寫數(shù)據(jù)時,,遍歷壞塊表中的塊號,,將文件的邏輯地址轉換成對應FLASH物理地址,以保證所用的FLASH地址空間不存在壞塊,。
4系統(tǒng)實現(xiàn)
4.1結構定義
圖1-存儲結構
系統(tǒng)的存儲結構如圖1所示,,在FLASH的Block0位置存放整個系統(tǒng)最重要的數(shù)據(jù)——系統(tǒng)記錄SR(SystemRecord)。選擇Block0的原因是一般FLASH出廠時,,都能保證Block0是完好的,,因此可以避免壞塊問題帶來的不便,。SR其實就是一個定義好的數(shù)據(jù)結構,它包括媒質信息和文件系統(tǒng)信息兩部分,。媒質信息包括FLASH存儲器的類型,、容量、塊類型的大小和數(shù)量(BlockInfo),、FLASH操作命令(CommandInfo)等。文件系統(tǒng)信息包括版本信息,、各邏輯分區(qū)的起始地址(物理地址)和結束地址,。FLASH設備可以被分成一個或多個邏輯分區(qū),每個邏輯分區(qū)采用的操作方式可以互不相同,,如圖1中Device0分區(qū)采用的是線性文件系統(tǒng),,Device1分區(qū)采用的是鏈式文件系統(tǒng)。如果采用的是線性文件系統(tǒng),,在分區(qū)信息后面加入文件索引表INDEX起始地址,、大小等信息;如果采用的是鏈式文件系統(tǒng),,則加入文件系統(tǒng)頁大小,、文件分配表FAT和文件登記表FRT所在的位置等信息。
文件登記表FRT位于FAT后的頁中,,存放著邏輯分區(qū)中文件的信息,,如文件總數(shù)、每個文件的文件代號,、位置,、長度以及校驗模式。其中,,校驗模式用來標識文件讀寫時采用差錯校驗的級別,。不同類型的文件采用不同級別的校驗方式。0級不進行校驗,,1級ECC校驗,,2級逐個字節(jié)比較。
對于線性文件系統(tǒng)分區(qū),,所有文件順序存儲,,讀取數(shù)據(jù)時,直接通過INDEX索引得到某個文件的邏輯起始地址,,然后從這個地址開始順序搜索,,獲取某個偏移位置下的 n個連續(xù)Byte。鏈式文件系統(tǒng)是將地址空間分成若干個等分,,即Sector,,它是操作的最小單位,;一個大文件可以分布在不連續(xù)的多個Sector中,然后通過FAT表將它們連接起來,;在FLASH介質上實現(xiàn)鏈式文件系統(tǒng),,Sector大小的選擇是一個關鍵,由于FLASH的寫操作,,擦操作是以Page,, Block為單位的,設小了使大塊結構的FLASH寫操作復雜,,設多了又浪費空間,,因此最好的選擇是將Sector大小設為擦操作的最小單位16K。
整個邏輯分區(qū)中,,INDEX,FAT,FRT表中的內容非常重要,,一旦因為異常產(chǎn)生錯誤,可能會影響到所有文件,;所以,,這三個文件都做了備份處理,備份存放于不同的Block中,。同時,,在對他們處理時,改寫表中的更新狀態(tài),。0xff表示開始更新,0x00表示更新結束,。在文件系統(tǒng)初始化時,讀取它們的更新狀態(tài),,如果表中的更新狀態(tài)為0xff,,說明該表存在操作異常,可用備份表更正,。
4.2層次接口
整個存儲系統(tǒng)分成三層,,如圖2所示。
圖2–層次結構
1.操作系統(tǒng)層
在整個存儲系統(tǒng)中,,操作系統(tǒng)扮演的是使用者的角色,。當需要數(shù)據(jù)時,它通過調用文件系統(tǒng)層提供的接口函數(shù)獲取數(shù)據(jù),,它不關心數(shù)據(jù)的來源和正確性,。
2.文件系統(tǒng)層
文件系統(tǒng)層的任務是實現(xiàn)它和操作系統(tǒng)層的函數(shù)接口。在實現(xiàn)方式上,,線性文件系統(tǒng)和鏈式文件系統(tǒng)有較大區(qū)別,。比如文件讀取mfread,線性文件系統(tǒng)直接讀取所要的字節(jié),而鏈式文件系統(tǒng)是每次先把對應的整個頁讀到文件緩沖區(qū),然后再把所需數(shù)據(jù)拷貝到讀到指定內存,。文件刪除mfdelete,,線性文件系統(tǒng)需要重新整理,不然就會因為大量的數(shù)據(jù)空洞(由于空間太小,,無法放入新文件的小塊區(qū)域)使得系統(tǒng)很快沒有可用空間,。鏈式文件系統(tǒng)只需修改文件系統(tǒng)的FAT和 FRT,而不用做其他任何處理,,當下次寫入操作用到該塊時,,自動完成擦除。
3.驅動層
驅動層的任務是完成與FLASH之間的通訊協(xié)議,,實現(xiàn)它和文件系統(tǒng)層的函數(shù)接口,。接口函數(shù)包括頁面讀mPageRead,頁面寫mPageWrite,塊擦除 mBlockErase,隨機讀取mRnRead,隨機寫入mRnWrite,。mPageRead,mPageWrite,,mBlockErase對整頁或塊進行操作,,在鏈式文件系統(tǒng)中調用;mRnRead,mRnWrite對字節(jié)單位進行操作,,在線性文件系統(tǒng)中調用,。其中mRnWrite比較麻煩,以寫一個Byte為例,,它的操作分三步,,首先將目標塊中的所有數(shù)據(jù)讀到內存Buffer中,然后將要寫入的數(shù)據(jù)更新到Buffer,,擦除目標塊,,最后將已更新的Buffer寫回到目標塊,這里的Buffer大小是一個Block。由于嵌入式系統(tǒng)的內存資源比較緊張,,系統(tǒng)采用了塊交換技術以降低成本,方法是在 FLASH中搜索一個空閑塊,,用它充當Buffer的角色。
5結論
通過上面的設計,,所實現(xiàn)的存儲系統(tǒng)具有以下的特點:
1.使用通用模式設計,,增強了系統(tǒng)對FLASH設備的兼容性;
2.使用雙模式文件結構設計,,使不同類型的數(shù)據(jù)處理效率同時達到最優(yōu),;
3.使用地址映射表,屏蔽了壞塊帶來的隱患,,增強了系統(tǒng)的健壯性,;
4.對重要數(shù)據(jù)采用備份保護,保證不會因為斷電等異常導致系統(tǒng)的崩潰,增強了系統(tǒng)穩(wěn)定性,;
5.采用塊交換技術,,節(jié)約系統(tǒng)成本;
6.進行分級差錯校驗,,提高了系統(tǒng)的執(zhí)行效率,;
因此,本文所設計的FLASH存儲系統(tǒng),,非常適合于嵌入式系統(tǒng)的應用,。