采用FLASH的嵌入式存儲系統(tǒng)設(shè)計
1 引言
FLASH(閃速存儲器)作為一種安全、快速的存儲體,具有體積小、容量大、成本低、掉電數(shù)據(jù)不丟失等一系列優(yōu)點(diǎn),已成為嵌入式系統(tǒng)中數(shù)據(jù)和程序最主要的載體。由于FLASH在結(jié)構(gòu)和操作方式上與硬盤、E2ROM等其他存儲介質(zhì)有較大區(qū)別,使用FLASH時必須根據(jù)其自身特性,對存儲系統(tǒng)進(jìn)行特殊設(shè)計,以保證系統(tǒng)的性能達(dá)到最優(yōu)。
2 FLASH的特點(diǎn)
FLASH是一種非易失性存儲器NVM(Non-Volatile Memory),根據(jù)結(jié)構(gòu)的不同可以將其分成NOR FLASH和NAND FLASH兩種。但不管哪一種都具有如下特點(diǎn):
(1)區(qū)塊結(jié)構(gòu)FLASH在物理結(jié)構(gòu)上分成若干個區(qū)塊,區(qū)塊之間相互獨(dú)立。比如NOR FLASH把整個Memory分成若干個Sector,而NAND FLASH把整個Memory分成若干個Block;
(2)先擦后寫由于FLASH的寫操作只能將數(shù)據(jù)位從1寫成0,不能從0寫成1,所以在對存儲器進(jìn)行寫入之前必須先執(zhí)行擦操作,將預(yù)寫入的數(shù)據(jù)位初始化為1。擦操作的最小單位是一個區(qū)塊,而不是單個字節(jié)。
(3)操作指令除了NOR FLASH的讀,F(xiàn)LASH的其它操作不能像RAM那樣,直接對目標(biāo)地址進(jìn)行總線操 作。比如執(zhí)行一次寫操作,它必須輸入一串特殊的指令(NOR FLASH),或者完成一段時序(NAND FLASH)才能將數(shù)據(jù)寫入到FLASH中。
(4)位反轉(zhuǎn)由于FLASH固有的電器特性,在讀寫數(shù)據(jù)過程中,偶然會產(chǎn)生一位或幾位數(shù)據(jù)錯誤。這就是位反轉(zhuǎn)。位反轉(zhuǎn)無法避免,只能通過其他手段對結(jié)果進(jìn)行事后處理。
(5)壞塊FLASH在使用過程中,可能導(dǎo)致某些區(qū)塊的損壞。區(qū)塊一旦損壞,將無法進(jìn)行修復(fù)。如果對已損壞的區(qū)塊進(jìn)行操作,可能會帶來不可預(yù)測的錯誤。尤其是NAND FLASH在出廠時就可能存在這樣的壞塊(已經(jīng)被標(biāo)識出)。
3 關(guān)鍵設(shè)計
3.1 FLASH通用設(shè)計
對于一個嵌入式系統(tǒng),設(shè)備的兼容性越好,系統(tǒng)可行性就越好,產(chǎn)品也就越有競爭力。所以,為了兼容不同類型的FLASH設(shè)備,對FLASH進(jìn)行通用設(shè)計至關(guān)重要。
對于NOR FLASH,數(shù)據(jù)的讀操作可以通過獨(dú)立的數(shù)據(jù)總線和地址總線快速完成,然而NOR FLASH的其他操作需要通過特殊的指令來完成,更糟糕的是不同廠商生產(chǎn)的芯片這些指令互不相同。這就導(dǎo)致了設(shè)備的不兼容。
對于NAND FLASH,也存在這樣的問題。NAND FLASH可以根據(jù)相同的指令讀取芯片的廠商號和設(shè)備號,從而通過識別設(shè)備號調(diào)用對應(yīng)的時序流程實(shí)現(xiàn)操作。但是,系統(tǒng)中太多的判斷,會使得程序的結(jié)構(gòu)變得非常復(fù)雜。所以,在一定的條件下,NAND FLASH設(shè)備還是不兼容的。
為了解決這一問題,一個較好的方法是將FLASH的各個操作指令以及結(jié)構(gòu)特性按照統(tǒng)一的格式存放到FLASH中固定位置。系統(tǒng)初始化時,將這個結(jié)構(gòu)讀入系統(tǒng),通過分析這個結(jié)構(gòu),可以獲得關(guān)于芯片所有相關(guān)信息,包括操作指令,區(qū)塊分布等等。這樣,系統(tǒng)可以輕松實(shí)現(xiàn)對不同型號FLASH的所有操作,極大地提高了設(shè)備的擴(kuò)展性。
3.2 雙模式文件系統(tǒng)設(shè)計
嵌入式系統(tǒng)中文件數(shù)據(jù)的存放一般有兩種結(jié)構(gòu),一種是索引格式的線性結(jié)構(gòu),一種是非線性的鏈表式結(jié)構(gòu)。這兩種結(jié)構(gòu)各有優(yōu)缺點(diǎn)。比如對于系統(tǒng)配置、點(diǎn)陣字庫等一些具有固定結(jié)構(gòu)的系統(tǒng)數(shù)據(jù),索引結(jié)構(gòu)比鏈表式結(jié)構(gòu)更有效率。但對于經(jīng)常更新的用戶數(shù)據(jù),鏈表式結(jié)構(gòu)要比索引結(jié)構(gòu)更靈活。如果系統(tǒng)能將兩種結(jié)構(gòu)集成,勢必能將性能發(fā)揮到最優(yōu)。
實(shí)現(xiàn)這種集成的方法是將設(shè)備定義成若干個分區(qū),每個分區(qū)相互獨(dú)立,不同分區(qū)可以使用不同的文件模式。這樣,不同類型的數(shù)據(jù)就可以根據(jù)自己的屬性選擇存放的分區(qū)。比如系統(tǒng)數(shù)據(jù)存放在使用索引線性結(jié)構(gòu)的分區(qū),用戶數(shù)據(jù)存放在使用鏈?zhǔn)椒蔷€性結(jié)構(gòu)的分區(qū)。
3.3 壞塊處理
FLASH中的壞塊處理是一件很棘手的問題,如果沒有有效的管理,對系統(tǒng)的穩(wěn)定性會造成嚴(yán)重影響。一個可行的解決方法是生成一張壞塊表,壞塊表中記錄所有壞塊的塊號,并且按塊號從小到大排序,壞塊表在讀寫過程中動態(tài)更新。當(dāng)讀寫數(shù)據(jù)時,遍歷壞塊表中的塊號,將文件的邏輯地址轉(zhuǎn)換成對應(yīng)FLASH 物理地址,以保證所用的FLASH地址空間不存在壞塊。
4 系統(tǒng)實(shí)現(xiàn)
4.1 結(jié)構(gòu)定義
系統(tǒng)的存儲結(jié)構(gòu)如圖1所示,在FLASH的Block0位置存放整個系統(tǒng)最重要的數(shù)據(jù)——系統(tǒng)記錄SR(System Record)。選擇Block0的原因是一般FLASH出廠時,都能保證Block0是完好的,因此可以避免壞塊問題帶來的不便。SR其實(shí)就是一個定義好的數(shù)據(jù)結(jié)構(gòu),它包括媒質(zhì)信息和文件系統(tǒng)信息兩部分。媒質(zhì)信息包括FLASH存儲器的類型、容量、塊類型的大小和數(shù)量(BlockInfo)、FLASH 操作命令( CommandInfo )等。文件系統(tǒng)信息包括版本信息、各邏輯分區(qū)的起始地址(物理地址)和結(jié)束地址。FLASH設(shè)備可以被分成一個或多個邏輯分區(qū),每個邏輯分區(qū)采用的操作方式可以互不相同,如圖1中Device0分區(qū)采用的是線性文件系統(tǒng),Device1分區(qū)采用的是鏈?zhǔn)轿募到y(tǒng)。如果采用的是線性文件系統(tǒng),在分區(qū)信息后面加入文件索引表INDEX起始地址、大小等信息;如果采用的是鏈?zhǔn)轿募到y(tǒng),則加入文件系統(tǒng)頁大小、文件分配表FAT和文件登記表FRT所在的位置等信息。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
電子血壓計相關(guān)文章:電子血壓計原理
評論