新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MAXQ處理器的非易失存儲(chǔ)功能

MAXQ處理器的非易失存儲(chǔ)功能

作者: 時(shí)間:2016-09-12 來(lái)源:網(wǎng)絡(luò) 收藏
1.jpg

圖1. 數(shù)據(jù)單元報(bào)頭結(jié)構(gòu)

本文引用地址:http://m.butianyuan.cn/article/201609/303484.htm

寫數(shù)據(jù)單元時(shí),寫子程序必須知道要寫的數(shù)據(jù)、數(shù)據(jù)單元的長(zhǎng)度和數(shù)據(jù)要寫的位置。很容易可以知道數(shù)據(jù)寫在哪個(gè)地址;無(wú)論是新數(shù)據(jù)單元還是更新已有的數(shù)據(jù)單元,都會(huì)寫在存儲(chǔ)陣列的末尾。寫命令會(huì)搜索陣列的末尾,緊接著在最后一個(gè)記錄后寫入新的數(shù)據(jù)單元。假如在當(dāng)前的存儲(chǔ)頁(yè)面沒(méi)有足夠的空間保存特定長(zhǎng)度的數(shù)據(jù)元,就會(huì)出現(xiàn)頁(yè)面結(jié)束標(biāo)志并打開(kāi)一個(gè)新頁(yè)面。圖2是這種典型的數(shù)據(jù)頁(yè)面的結(jié)構(gòu)。

在這個(gè)數(shù)據(jù)頁(yè)面中,先寫數(shù)據(jù)單元1,并更新。接著寫數(shù)據(jù)單元4,但從不更新。隨后是數(shù)據(jù)單元3,共更新7次。最后寫入數(shù)據(jù)單元2,從不更新。

頁(yè)面結(jié)束標(biāo)志的出現(xiàn)表明曾執(zhí)行寫操作,但數(shù)據(jù)單元太長(zhǎng)不能填入當(dāng)前頁(yè)面。會(huì)打開(kāi)一個(gè)新頁(yè)面以填寫數(shù)據(jù)單元。在整個(gè)數(shù)據(jù)結(jié)構(gòu)的末尾會(huì)分配一個(gè)空單元,這里本該是一個(gè)數(shù)據(jù)單元的報(bào)頭。

2.jpg

圖2. 典型的數(shù)據(jù)頁(yè)面

要注意這種方案并沒(méi)有涉及重復(fù)記錄的問(wèn)題。因?yàn)橹貜?fù)記錄不會(huì)有問(wèn)題。事實(shí)上,讀和寫程序都會(huì)完全忽略重復(fù)記錄。寫操作時(shí),不管同樣編號(hào)的記錄是否存在,新記錄都會(huì)寫在陣列的末尾。當(dāng)讀操作時(shí),只有符合請(qǐng)求記錄編號(hào)的最后一個(gè)(所以是最近的)記錄可以讀到。

從陣列中讀取數(shù)據(jù)元會(huì)比寫操作更復(fù)雜。讀功能會(huì)收到數(shù)據(jù)元編號(hào)和數(shù)據(jù)元應(yīng)該寫入的地址。當(dāng)執(zhí)行此命令時(shí),讀操作會(huì)從陣列的最開(kāi)始進(jìn)行搜索。當(dāng)它找到一個(gè)記錄符合被請(qǐng)求的數(shù)據(jù)元,它會(huì)保存這個(gè)地址并繼續(xù)搜索。當(dāng)它找到另外一個(gè)匹配的記錄時(shí),讀命令會(huì)用新地址替代已保存的地址。當(dāng)搜索到陣列的末尾時(shí),保存的地址就會(huì)是符合請(qǐng)求記錄的最近寫入的記錄。當(dāng)執(zhí)行讀操作時(shí),就會(huì)把這個(gè)數(shù)據(jù)復(fù)制到緩存中。

盡管所介紹的用來(lái)從存儲(chǔ)陣列中保存和讀取記錄的主讀機(jī)制是可行的,還會(huì)存在一個(gè)問(wèn)題:沒(méi)有機(jī)制可以重新使用被過(guò)時(shí)的記錄占用的空間(也沒(méi)有機(jī)制可以刪除記錄。但由于這種方案是針對(duì)嵌入式應(yīng)用開(kāi)發(fā)的,所以可能不會(huì)是個(gè)很嚴(yán)重的問(wèn)題。)。如果不重新恢復(fù)一些空間,這些之前被分配的空間會(huì)很快用盡。由于閃存只能每次擦除一整個(gè)頁(yè)面,恢復(fù)空間意味著擦除整個(gè)頁(yè)面。另外一個(gè)更嚴(yán)重的問(wèn)題是閃存頁(yè)面不能被隨便擦除,會(huì)存在刪除有用信息的風(fēng)險(xiǎn)。唯一的可選方案是在刪除整個(gè)舊頁(yè)面之前,把有用信息復(fù)制到一個(gè)新頁(yè)面。

從廢舊的記錄中恢復(fù)空間有三個(gè)步驟。第一,打開(kāi)新頁(yè)面,把每個(gè)數(shù)據(jù)元的最近版本復(fù)制到新頁(yè)面中。第二,擦除舊頁(yè)面。第三,對(duì)新頁(yè)面做頁(yè)面標(biāo)示,是讀命令可以找到新頁(yè)面。

第一個(gè)步驟比較復(fù)雜,需要更詳細(xì)的檢查。完成這個(gè)步驟最簡(jiǎn)單的方法可以分成兩個(gè)子步驟:第一,使用一個(gè)RAM保存記錄編號(hào)和陣列中最近記錄的地址;第二,從RAM陣列逐一復(fù)制最近記錄到新閃存頁(yè)面。這個(gè)過(guò)程最快,并且相對(duì)簡(jiǎn)單。

使用這兩個(gè)子步驟存在的問(wèn)題是2000只有1k字的RAM空間。上述方案限制了可以保存到RAM中作緩存的數(shù)據(jù)量。這明顯是不能接受的。

這種難題的解決方案非常耗時(shí),但不管存儲(chǔ)陣列變得多大(合理范圍內(nèi))都是可行的。為源陣列中的每一項(xiàng)條目單獨(dú)操作,而不是在RAM中建立指針。因此,算法可以簡(jiǎn)化為:

從源陣列讀取一個(gè)數(shù)據(jù)元。

在目標(biāo)陣列中搜索這個(gè)數(shù)據(jù)單元。假如找到了,就說(shuō)明這個(gè)數(shù)據(jù)單元已經(jīng)寫入。源指針增加并返回步驟1。

在源陣列中搜索這個(gè)數(shù)據(jù)單元最近記錄。

把這個(gè)數(shù)據(jù)單元的最近記錄寫入目標(biāo)陣列中。

源指針增加并返回步驟1。

最后,在目標(biāo)陣列中,每個(gè)數(shù)據(jù)元都有精確的條目對(duì)應(yīng)。填寫后的頁(yè)面如圖3示意。這樣,就可以安全擦除源頁(yè)面,并把頁(yè)面報(bào)頭寫入目標(biāo)陣列。

空間恢復(fù)后

圖3. 空間恢復(fù)后,圖2中的數(shù)據(jù)頁(yè)面會(huì)如此表現(xiàn)。

這個(gè)過(guò)程對(duì)于數(shù)據(jù)存儲(chǔ)會(huì)非常安全。然而,當(dāng)使用閃存器件時(shí)還要面對(duì)另一個(gè)風(fēng)險(xiǎn):在寫或者擦除操作中掉電。假如發(fā)生掉電,有可能會(huì)破壞一個(gè)或者多個(gè)頁(yè)面 (例如寫操作)或者不能完全擦除頁(yè)面(例如擦除操作)。而我們這種緊湊的操作從本質(zhì)上講是安全的??梢钥紤]以下的情況:

假如在填寫操作時(shí)掉電,源頁(yè)面仍然保持完整。當(dāng)重新上電后,很容易辨別新寫的頁(yè)面(他們沒(méi)有頁(yè)面報(bào)頭)并把它擦除,再重新啟動(dòng)填寫操作。

假如在正擦除舊頁(yè)面時(shí)掉電,可能會(huì)包含無(wú)效的報(bào)頭??梢圆脸@些頁(yè)面并把報(bào)頭添加到新頁(yè)面。

假如在正把頁(yè)面報(bào)頭寫入到新頁(yè)面時(shí)掉電,數(shù)據(jù)仍然是完整的。頁(yè)面報(bào)頭更新操作可以再次重新啟動(dòng)。

簡(jiǎn)言之,這些預(yù)料之外的突發(fā)事件不會(huì)導(dǎo)致陣列數(shù)據(jù)被破壞并不可恢復(fù)。

方案2的改進(jìn)

這里介紹的存儲(chǔ)子系統(tǒng)沒(méi)有錯(cuò)誤檢測(cè)的機(jī)制。在數(shù)據(jù)元標(biāo)識(shí)符中有一些位(這里的是6位)沒(méi)有被使用??梢允褂肅RC6算法(x6 + x + 1)根據(jù)數(shù)據(jù)元計(jì)算出CRC以確保沒(méi)有發(fā)生讀寫錯(cuò)誤。這雖然不是特別強(qiáng)大的算法(它會(huì)錯(cuò)過(guò)多位錯(cuò)誤中的1/64),它可以檢測(cè)到多數(shù)可能發(fā)生的錯(cuò)誤。

這個(gè)方法對(duì)系統(tǒng)的另一個(gè)限制是讀取時(shí)間很長(zhǎng)。每次讀操作都需要讀取陣列中的所有記錄,以找到最近的記錄。有3個(gè)方法可以用來(lái)縮短讀取時(shí)間:

在數(shù)據(jù)單元中為正向指針留一個(gè)空字節(jié)。當(dāng)數(shù)據(jù)更新時(shí),為正向指針?lè)峙湟粋€(gè)新的入口地址。按照這種方式,數(shù)據(jù)表格可以按鏈表的方式移動(dòng)。

向后移動(dòng)表格。這樣就可以在被請(qǐng)求信號(hào)第一次出現(xiàn)時(shí)停止搜索。

假如單元數(shù)量很少,可以在啟動(dòng)時(shí)建立一個(gè)RAM陣列,包含單元ID和指針。后面的讀取會(huì)很快。只需讀RAM陣列以決定從哪兒獲取數(shù)據(jù)單元。

結(jié)論

非易失數(shù)據(jù)存儲(chǔ)是每位設(shè)計(jì)工程師遲早都必須面對(duì)的問(wèn)題。使用靈活的閃存,就不用再借助于串行存儲(chǔ)保存配置數(shù)據(jù)了。



關(guān)鍵詞: 非易失存儲(chǔ) MAXQ 處理器

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉