基于FLASH介質(zhì)嵌入式存儲(chǔ)方案的設(shè)計(jì)與實(shí)現(xiàn)
系統(tǒng)實(shí)現(xiàn)
本文引用地址:http://www.ex-cimer.com/article/265391.htm結(jié)構(gòu)定義
系統(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ù)量(Block Info)、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健F渲?,校?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,F(xiàn)AT,F(xiàn)RT表中的內(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ō)明該表存在操作異常,可用備份表更正。
層次接口
整個(gè)存儲(chǔ)系統(tǒng)分成三層,如圖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)層
文件系統(tǒng)層的任務(wù)是實(shí)現(xiàn)它和操作系統(tǒng)層的函數(shù)接口。在實(shí)現(xiàn)方式上,線性文件系統(tǒng)和鏈?zhǔn)轿募到y(tǒng)有較大區(qū)別。比如文件讀取mfread,線性文件系統(tǒng)直接讀取所要的字節(jié),而鏈?zhǔn)轿募到y(tǒng)是每次先把對(duì)應(yīng)的整個(gè)頁(yè)讀到文件緩沖區(qū),然
后再把所需數(shù)據(jù)拷貝到讀到指定內(nèi)存。文件刪除mfdelete,線性文件系統(tǒng)需要重新整理,不然就會(huì)因?yàn)榇罅康臄?shù)據(jù)空洞(由于空間太小,無(wú)法放入新文件的小塊區(qū)域)使得系統(tǒng)很快沒(méi)有可用空間。鏈?zhǔn)轿募到y(tǒng)只需修改文件系統(tǒng)的FAT和FRT,而不用做其他任何處理,當(dāng)下次寫(xiě)入操作用到該塊時(shí),自動(dòng)完成擦除。
(3)驅(qū)動(dòng)層
驅(qū)動(dòng)層的任務(wù)是完成與FLASH之間的通訊協(xié)議,實(shí)現(xiàn)它和文件系統(tǒng)層的函數(shù)接口。接口函數(shù)包括頁(yè)面讀mPageRead,頁(yè)面寫(xiě)mPageWrite,塊擦除mBlockErase,隨機(jī)讀取mRnRead,隨機(jī)寫(xiě)入mRnWrite。mPageRead,mPageWrite,mBlockErase對(duì)整頁(yè)或塊進(jìn)行操作,在鏈?zhǔn)轿募到y(tǒng)中調(diào)用;mRnRead,mRnWrite對(duì)字節(jié)單位進(jìn)行操作,在線性文件系統(tǒng)中調(diào)用。其中mRnWrite比較麻煩,以寫(xiě)一個(gè)Byte為例,它的操作分三步,首先將目標(biāo)塊中的所有數(shù)據(jù)讀到內(nèi)存Buffer中,然后將要寫(xiě)入的數(shù)據(jù)更新到Buffer,擦除目標(biāo)塊,最后將已更新的Buffer寫(xiě)回到目標(biāo)塊,這里的Buffer大小是一個(gè)Block。由于嵌入式系統(tǒng)的內(nèi)存資源比較緊張,系統(tǒng)采用了塊交換技術(shù)以降低成本,方法是在FLASH中搜索一個(gè)空閑塊,用它充當(dāng)Buffer的角色。
結(jié)論
通過(guò)上面的設(shè)計(jì),所實(shí)現(xiàn)的存儲(chǔ)系統(tǒng)具有以下的特點(diǎn):
(1)使用通用模式設(shè)計(jì),增強(qiáng)了系統(tǒng)對(duì)FLASH設(shè)備的兼容性;
(2)使用雙模式文件結(jié)構(gòu)設(shè)計(jì),使不同類(lèi)型的數(shù)據(jù)處理效率同時(shí)達(dá)到最優(yōu);
(3)使用地址映射表,屏蔽了壞塊帶來(lái)的隱患,增強(qiáng)了系統(tǒng)的健壯性;
(4)對(duì)重要數(shù)據(jù)采用備份保護(hù),保證不會(huì)因?yàn)閿嚯姷犬惓?dǎo)致系統(tǒng)的崩潰,增強(qiáng)了系統(tǒng)穩(wěn)定性;
(5)采用塊交換技術(shù),節(jié)約系統(tǒng)成本;
(6)進(jìn)行分級(jí)差錯(cuò)校驗(yàn),提高了系統(tǒng)的執(zhí)行效率;
因此,本文所設(shè)計(jì)的FLASH存儲(chǔ)系統(tǒng),非常適合于嵌入式系統(tǒng)的應(yīng)用。
存儲(chǔ)器相關(guān)文章:存儲(chǔ)器原理
評(píng)論