如何基于FLASH介質(zhì)嵌入式存儲方案的設計與實(shí)現?
引言
本文引用地址:http://dyxdggzs.com/article/201808/385633.htmFLASH(閃速存儲器)作為一種安全、快速的存儲體,具有體積小、容量大、成本低、掉電數據不丟失等一系列優(yōu)點(diǎn),已成為嵌入式系統中數據和程序最主要的載體。由于FLASH在結構和操作方式上與硬盤(pán)、E2ROM等其他存儲介質(zhì)有較大區別,使用FLASH時(shí)必須根據其自身特性,對存儲系統進(jìn)行特殊設計,以保證系統的性能達到最優(yōu)。
FLASH的特點(diǎn)
FLASH是一種非易失性存儲器NVM(Non-VolatileMemory),根據結構的不同可以將其分成NORFLASH和NANDFLASH兩種。但不管哪一種都具有如下特點(diǎn):
(1)區塊結構
FLASH在物理結構上分成若干個(gè)區塊,區塊之間相互獨立。比如NORFLASH把整個(gè)Memory分成若干個(gè)Sector,而NANDFLASH把整個(gè)Memory分成若干個(gè)Block;
(2)先擦后寫(xiě)
由于FLASH的寫(xiě)操作只能將數據位從1寫(xiě)成0,不能從0寫(xiě)成1,所以在對存儲器進(jìn)行寫(xiě)入之前必須先執行擦操作,將預寫(xiě)入的數據位初始化為1。擦操作的最小單位是一個(gè)區塊,而不是單個(gè)字節。
(3)操作指令
除了NORFLASH的讀,FLASH的其它操作不能像RAM那樣,直接對目標地址進(jìn)行總線(xiàn)操作。比如執行一次寫(xiě)操作,它必須輸入一串特殊的指令(NORFLASH),或者完成一段時(shí)序(NAND FLASH)才能將數據寫(xiě)入到FLASH中。
(4)位反轉
由于FLASH固有的電器特性,在讀寫(xiě)數據過(guò)程中,偶然會(huì )產(chǎn)生一位或幾位數據錯誤。這就是位反轉。位反轉無(wú)法避免,只能通過(guò)其他手段對結果進(jìn)行事后處理。
(5)壞塊
FLASH在使用過(guò)程中,可能導致某些區塊的損壞。區塊一旦損壞,將無(wú)法進(jìn)行修復。如果對已損壞的區塊進(jìn)行操作,可能會(huì )帶來(lái)不可預測的錯誤。尤其是NAND FLASH在出廠(chǎng)時(shí)就可能存在這樣的壞塊(已經(jīng)被標識出)。
關(guān)鍵設計
FLASH通用設計
對于一個(gè)嵌入式系統,設備的兼容性越好,系統可行性就越好,產(chǎn)品也就越有競爭力。所以,為了兼容不同類(lèi)型的FLASH設備,對FLASH進(jìn)行通用設計至關(guān)重要。
對于NORFLASH,數據的讀操作可以通過(guò)獨立的數據總線(xiàn)和地址總線(xiàn)快速完成,然而NOR FLASH的其他操作需要通過(guò)特殊的指令來(lái)完成,更糟糕的是不同廠(chǎng)商生產(chǎn)的芯片這些指令互不相同。這就導致了設備的不兼容。
對于NAND FLASH,也存在這樣的問(wèn)題。NAND FLASH可以根據相同的指令讀取芯片的廠(chǎng)商號和設備號,從而通過(guò)識別設備號調用對應的時(shí)序流程實(shí)現操作。但是,系統中太多的判斷,會(huì )使得程序的結構變得非常復雜。所以,在一定的條件下,NAND FLASH設備還是不兼容的。
為了解決這一問(wèn)題,一個(gè)較好的方法是將FLASH的各個(gè)操作指令以及結構特性按照統一的格式存放到FLASH中固定位置。系統初始化時(shí),將這個(gè)結構讀入系統,通過(guò)分析這個(gè)結構,可以獲得關(guān)于芯片所有相關(guān)信息,包括操作指令,區塊分布等等。這樣,系統可以輕松實(shí)現對不同型號FLASH的所有操作,極大地提高了設備的擴展性。
雙模式文件系統設計
嵌入式系統中文件數據的存放一般有兩種結構,一種是索引格式的線(xiàn)性結構,一種是非線(xiàn)性的鏈表式結構。這兩種結構各有優(yōu)缺點(diǎn)。比如對于系統配置、點(diǎn)陣字庫等一些具有固定結構的系統數據,索引結構比鏈表式結構更有效率。但對于經(jīng)常更新的用戶(hù)數據,鏈表式結構要比索引結構更靈活。如果系統能將兩種結構集成,勢必能將性能發(fā)揮到最優(yōu)。
實(shí)現這種集成的方法是將設備定義成若干個(gè)分區,每個(gè)分區相互獨立,不同分區可以使用不同的文件模式。這樣,不同類(lèi)型的數據就可以根據自己的屬性選擇存放的分區。比如系統數據存放在使用索引線(xiàn)性結構的分區,用戶(hù)數據存放在使用鏈式非線(xiàn)性結構的分區。

壞塊處理
FLASH中的壞塊處理是一件很棘手的問(wèn)題,如果沒(méi)有有效的管理,對系統的穩定性會(huì )造成嚴重影響。一個(gè)可行的解決方法是生成一張壞塊表,壞塊表中記錄所有壞塊的塊號,并且按塊號從小到大排序,壞塊表在讀寫(xiě)過(guò)程中動(dòng)態(tài)更新。當讀寫(xiě)數據時(shí),遍歷壞塊表中的塊號,將文件的邏輯地址轉換成對應FLASH物理地址,以保證所用的FLASH地址空間不存在壞塊。
結構定義
系統的存儲結構如圖1所示,在FLASH的Block0位置存放整個(gè)系統最重要的數據——系統記錄SR(System Record)。選擇Block0的原因是一般FLASH出廠(chǎng)時(shí),都能保證Block0是完好的,因此可以避免壞塊問(wèn)題帶來(lái)的不便。SR其實(shí)就是一個(gè)定義好的數據結構,它包括媒質(zhì)信息和文件系統信息兩部分。媒質(zhì)信息包括FLASH存儲器的類(lèi)型、容量、塊類(lèi)型的大小和數量(Block Info)、FLASH操作命令(CommandInfo)等。文件系統信息包括版本信息、各邏輯分區的起始地址(物理地址)和結束地址。FLASH設備可以被分成一個(gè)或多個(gè)邏輯分區,每個(gè)邏輯分區采用的操作方式可以互不相同,如圖1中Device0分區采用的是線(xiàn)性文件系統,Device1分區采用的是鏈式文件系統。如果采用的是線(xiàn)性文件系統,在分區信息后面加入文件索引表INDEX起始地址、大小等信息;如果采用的是鏈式文件系統,則加入文件系統頁(yè)大小、文件分配表FAT和文件登記表FRT所在的位置等信息。
文件登記表FRT位于FAT后的頁(yè)中,存放著(zhù)邏輯分區中文件的信息,如文件總數、每個(gè)文件的文件代號、位置、長(cháng)度以及校驗模式。其中,校驗模式用來(lái)標識文件讀寫(xiě)時(shí)采用差錯校驗的級別。不同類(lèi)型的文件采用不同級別的校驗方式。0級不進(jìn)行校驗,1級ECC校驗,2級逐個(gè)字節比較。
對于線(xiàn)性文件系統分區,所有文件順序存儲,讀取數據時(shí),直接通過(guò)INDEX索引得到某個(gè)文件的邏輯起始地址,然后從這個(gè)地址開(kāi)始順序搜索,獲取某個(gè)偏移位置下的n個(gè)連續Byte。鏈式文件系統是將地址空間分成若干個(gè)等分,即Sector,它是操作的最小單位;一個(gè)大文件可以分布在不連續的多個(gè)Sector中,然后通過(guò)FAT表將它們連接起來(lái);在FLASH介質(zhì)上實(shí)現鏈式文件系統,Sector大小的選擇是一個(gè)關(guān)鍵,由于FLASH的寫(xiě)操作,擦操作是以Page,Block為單位的,設小了使大塊結構的FLASH寫(xiě)操作復雜,設多了又浪費空間,因此最好的選擇是將Sector大小設為擦操作的最小單位16K。
評論