基于FLASH介質(zhì)嵌入式存儲(chǔ)方案的設(shè)計(jì)與實(shí)現(xiàn)
1 引言 FLASH(閃速存儲(chǔ)器)作為一種安全、快速的存儲(chǔ)體,具有體積小、容量大、成本低、掉電數(shù)據(jù)不丟失等一系列優(yōu)點(diǎn),已成為嵌入式系統(tǒng)中數(shù)據(jù)和程序最主要的載體。由于FLASH在結(jié)構(gòu)和操作方式上與硬盤(pán)、E2ROM等其他存儲(chǔ)介質(zhì)有較大區(qū)別,使用FLASH時(shí)必須根據(jù)其自身特性,對(duì)存儲(chǔ)系統(tǒng)進(jìn)行特殊設(shè)計(jì),以保證系統(tǒng)的性能達(dá)到最優(yōu)。 2 FLASH的特點(diǎn) 1.區(qū)塊結(jié)構(gòu) 2.先擦后寫(xiě) 3.操作指令 4.位反轉(zhuǎn) 5.壞塊 3 關(guān)鍵設(shè)計(jì) 對(duì)于NOR FLASH,數(shù)據(jù)的讀操作可以通過(guò)獨(dú)立的數(shù)據(jù)總線和地址總線快速完成,然而NOR FLASH的其他操作需要通過(guò)特殊的指令來(lái)完成,更糟糕的是不同廠商生產(chǎn)的芯片這些指令互不相同。這就導(dǎo)致了設(shè)備的不兼容。 對(duì)于NAND FLASH,也存在這樣的問(wèn)題。NAND FLASH可以根據(jù)相同的指令讀取芯片的廠商號(hào)和設(shè)備號(hào),從而通過(guò)識(shí)別設(shè)備號(hào)調(diào)用對(duì)應(yīng)的時(shí)序流程實(shí)現(xiàn)操作。但是,系統(tǒng)中太多的判斷,會(huì)使得程序的結(jié)構(gòu)變得非常復(fù)雜。所以,在一定的條件下,NAND FLASH設(shè)備還是不兼容的。 為了解決這一問(wèn)題,一個(gè)較好的方法是將FLASH的各個(gè)操作指令以及結(jié)構(gòu)特性按照統(tǒng)一的格式存放到FLASH中固定位置。系統(tǒng)初始化時(shí),將這個(gè)結(jié)構(gòu)讀入系統(tǒng),通過(guò)分析這個(gè)結(jié)構(gòu),可以獲得關(guān)于芯片所有相關(guān)信息,包括操作指令,區(qū)塊分布等等。這樣,系統(tǒng)可以輕松實(shí)現(xiàn)對(duì)不同型號(hào)FLASH的所有操作,極大地提高了設(shè)備的擴(kuò)展性。 3.2 雙模式文件系統(tǒng)設(shè)計(jì) 嵌入式系統(tǒng)中文件數(shù)據(jù)的存放一般有兩種結(jié)構(gòu),一種是索引格式的線性結(jié)構(gòu),一種是非線性的鏈表式結(jié)構(gòu)。這兩種結(jié)構(gòu)各有優(yōu)缺點(diǎn)。比如對(duì)于系統(tǒng)配置、點(diǎn)陣字庫(kù)等一些具有固定結(jié)構(gòu)的系統(tǒng)數(shù)據(jù),索引結(jié)構(gòu)比鏈表式結(jié)構(gòu)更有效率。但對(duì)于經(jīng)常更新的用戶(hù)數(shù)據(jù),鏈表式結(jié)構(gòu)要比索引結(jié)構(gòu)更靈活。如果系統(tǒng)能將兩種結(jié)構(gòu)集成,勢(shì)必能將性能發(fā)揮到最優(yōu)。 實(shí)現(xiàn)這種集成的方法是將設(shè)備定義成若干個(gè)分區(qū),每個(gè)分區(qū)相互獨(dú)立,不同分區(qū)可以使用不同的文件模式。這樣,不同類(lèi)型的數(shù)據(jù)就可以根據(jù)自己的屬性選擇存放的分區(qū)。比如系統(tǒng)數(shù)據(jù)存放在使用索引線性結(jié)構(gòu)的分區(qū),用戶(hù)數(shù)據(jù)存放在使用鏈?zhǔn)椒蔷€性結(jié)構(gòu)的分區(qū)。 3.3 壞塊處理 4 系統(tǒng)實(shí)現(xiàn) | |
系統(tǒng)的存儲(chǔ)結(jié)構(gòu)如圖1所示,在FLASH的Block0位置存放整個(gè)系統(tǒng)最重要的數(shù)據(jù)——系統(tǒng)記錄SR(System Record)。選擇Block0的原因是一般FLASH出廠時(shí),都能保證Block0是完好的,因此可以避免壞塊問(wèn)題帶來(lái)的不便。SR其實(shí)就是一個(gè)定義好的數(shù)據(jù)結(jié)構(gòu),它包括媒質(zhì)信息和文件系統(tǒng)信息兩部分。媒質(zhì)信息包括FLASH存儲(chǔ)器的類(lèi)型、容量、塊類(lèi)型的大小和數(shù)量(BlockInfo)、FLASH 操作命令(CommandInfo)等。文件系統(tǒng)信息包括版本信息、各邏輯分區(qū)的起始地址(物理地址)和結(jié)束地址。FLASH設(shè)備可以被分成一個(gè)或多個(gè)邏輯分區(qū),每個(gè)邏輯分區(qū)采用的操作方式可以互不相同,如圖1中Device0分區(qū)采用的是線性文件系統(tǒng),Device1分區(qū)采用的是鏈?zhǔn)轿募到y(tǒng)。如果采用的是線性文件系統(tǒng),在分區(qū)信息后面加入文件索引表INDEX起始地址、大小等信息;如果采用的是鏈?zhǔn)轿募到y(tǒng),則加入文件系統(tǒng)頁(yè)大小、文件分配表FAT和文件登記表FRT所在的位置等信息。
文件登記表FRT位于FAT后的頁(yè)中,存放著邏輯分區(qū)中文件的信息,如文件總數(shù)、每個(gè)文件的文件代號(hào)、位置、長(zhǎng)度以及校驗(yàn)?zāi)J?。其中,校?yàn)?zāi)J接脕?lái)標(biāo)識(shí)文件讀寫(xiě)時(shí)采用差錯(cuò)校驗(yàn)的級(jí)別。不同類(lèi)型的文件采用不同級(jí)別的校驗(yàn)方式。0級(jí)不進(jìn)行校驗(yàn),1級(jí)ECC校驗(yàn),2級(jí)逐個(gè)字節(jié)比較。 對(duì)于線性文件系統(tǒng)分區(qū),所有文件順序存儲(chǔ),讀取數(shù)據(jù)時(shí),直接通過(guò)INDEX索引得到某個(gè)文件的邏輯起始地址,然后從這個(gè)地址開(kāi)始順序搜索,獲取某個(gè)偏移位置下的n個(gè)連續(xù)Byte。鏈?zhǔn)轿募到y(tǒng)是將地址空間分成若干個(gè)等分,即Sector,它是操作的最小單位;一個(gè)大文件可以分布在不連續(xù)的多個(gè) Sector中,然后通過(guò)FAT表將它們連接起來(lái);在FLASH介質(zhì)上實(shí)現(xiàn)鏈?zhǔn)轿募到y(tǒng),Sector大小的選擇是一個(gè)關(guān)鍵,由于FLASH的寫(xiě)操作,擦操作是以Page,Block為單位的,設(shè)小了使大塊結(jié)構(gòu)的FLASH寫(xiě)操作復(fù)雜,設(shè)多了又浪費(fèi)空間,因此最好的選擇是將Sector大小設(shè)為擦操作的最小單位16K。 整個(gè)邏輯分區(qū)中,INDEX,FAT,FRT表中的內(nèi)容非常重要,一旦因?yàn)楫惓.a(chǎn)生錯(cuò)誤,可能會(huì)影響到所有文件;所以,這三個(gè)文件都做了備份處理,備份存放于不同的Block中。同時(shí),在對(duì)他們處理時(shí),改寫(xiě)表中的更新?tīng)顟B(tài)。0xff表示開(kāi)始更新,0x00表示更新結(jié)束。在文件系統(tǒng)初始化時(shí),讀取它們的更新?tīng)顟B(tài),如果表中的更新?tīng)顟B(tài)為0xff,說(shuō)明該表存在操作異常,可用備份表更正。 4.2 層次接口
1.操作系統(tǒng)層 在整個(gè)存儲(chǔ)系統(tǒng)中,操作系統(tǒng)扮演的是使用者的角色。當(dāng)需要數(shù)據(jù)時(shí),它通過(guò)調(diào)用文件系統(tǒng)層提供的接口函數(shù)獲取數(shù)據(jù),它不關(guān)心數(shù)據(jù)的來(lái)源和正確性。 2.文件系統(tǒng)層 3.驅(qū)動(dòng)層 5 結(jié)論 |
評(píng)論