引言 隨著(zhù)嵌入式系統在數碼相機、數字攝像機、移動(dòng)電話(huà)、MP3音樂(lè )播放器等移動(dòng)設備中越來(lái)越廣泛的應用,Flash存儲器已經(jīng)逐步取代其他半導體存儲元件,成為嵌入式系統中主要數據和程序載體。Flash存儲器又稱(chēng)閃存,是一種可在線(xiàn)多次擦除的非易失性存儲器NVM(Non-Volatile Memo-ry),即掉電后數據不會(huì )丟失。Flash存儲器還具有體積小、功耗低、抗振性強等優(yōu)點(diǎn),是嵌入式系統的首選存儲設備。 世面上常用的Flash存儲設備有兩種:NOR Flash和NAND Flash。根據存儲容量,NOR一般為1~16 MB,而NAND為8~512 MB,現在的大容量NAND已經(jīng)可以達到4 GB;讀取速度NOR較NAND快,寫(xiě)入速度NOR比NAND慢一些;擦除速度NOR需要2~5 s,而NAND僅僅需要2~5 ms;NAND的價(jià)格比NOR低很多。由于種種原因,較常用的是NAND Flash。但是由于NANDFlash的工藝不能保證NAND的存儲陣列(memory ar-ray)在其生命周期中保持性能的可靠,因此,在NAND的生產(chǎn)中及使用過(guò)程中會(huì )產(chǎn)生壞塊。其表現是:當編程/擦除這個(gè)塊時(shí),不能將某些位拉高,這會(huì )造成頁(yè)編程(page program)和塊擦除(block erase)操作時(shí)的錯誤;相應地,反映到狀態(tài)寄存器(status register)的相應位。 總體上,壞塊可以分為兩大類(lèi):第一類(lèi)為固有壞塊,這是生產(chǎn)過(guò)程中產(chǎn)生的壞塊,一般芯片原廠(chǎng)都會(huì )在出廠(chǎng)時(shí)將壞塊第一個(gè)頁(yè)的擴展區域(Spare Area)的第6個(gè)字節標記為不等于0xff的值;第二類(lèi)為使用壞塊,這是在NANDFlash使用過(guò)程中,如果塊擦除或者頁(yè)編程錯誤,就可以簡(jiǎn)單地將這個(gè)塊作為壞塊來(lái)處理,這個(gè)時(shí)候需要把壞塊標記起來(lái)。為了和固有壞塊信息保持一致,將新發(fā)現壞塊的第一個(gè)頁(yè)的擴展區域的第6個(gè)字節標記為非0xff的值。由于Flash寫(xiě)入數據的時(shí)候是先擦除塊,這樣這個(gè)塊里面的數據將全部變成0xff,寫(xiě)入1時(shí),該位不變;寫(xiě)入0時(shí),該位由1變?yōu)?。如果將擴展區域的第6 個(gè)字節標記為非0xff之后,將不可能再恢復為0xff,除非格式化有可能恢復。 我們已經(jīng)了解到,壞了的塊是無(wú)法擦除和寫(xiě)人數據的,而在嵌入式系統中,啟動(dòng)的第一步就是將Flash里面的前4KB數據自動(dòng)復制到SRAM里面去運行。如果僅僅Flash的第一塊壞了,而導致引導程序無(wú)法下載進(jìn)去,那么這個(gè)塊不是不能讀取數據,而是讀不出我們想再要放入的數據,這樣這個(gè) Flash設備就報廢了。本文就這個(gè)問(wèn)題作了深入的討論,用一種基于Flash的地址重映射的方法解決這個(gè)問(wèn)題。本文采用三星(Samscrag)公司的 S3C2440 ARM處理器和NAND Flash存儲設備K9F1208UOM討論地址重映射的思想。 1 S3C2440使用NAND Flash引導系統的方法 自動(dòng)啟動(dòng)模式順序: 、購臀煌瓿; 、诋斣O置為自動(dòng)啟動(dòng)模式,NAND Flash的開(kāi)始4 KB被拷貝到Steppingstone的4 KB內部緩沖器; 、跾teppingstone映射到nGCS0; 、蹸PU開(kāi)始在Steppingstone執行啟動(dòng)代碼程序。 由系統引導順序看出,如果Flash的第一塊壞了,那么讀出的數據不一定是引導程序,這樣,系統將無(wú)法啟動(dòng)。而在這種情況下,就只能換一塊完好的Flash了,這樣就造成了很大的浪費。 2 Flash存儲器的內部結構 K9F1208UOM型Flash芯片內部存儲器結構如圖1所示。 ![]() 典型的NAND Flash由4 096塊組成,每一個(gè)塊包含32頁(yè),而每頁(yè)是512+16=528字節。對于一個(gè)頁(yè),0~511字節為主存儲區,即通常所說(shuō)的用戶(hù)可設定地址區,用來(lái)存儲數據;512~527共16字節為擴展存儲區,用來(lái)存儲頁(yè)的信息。擴展區的16字節用于描述主存儲區的512字節。而對于壞塊,也僅僅是將這16字節的第 6字節設置為不等于0xff,來(lái)標示壞塊。 在NANDFlash使用過(guò)程中可能會(huì )出現這樣的問(wèn)題:產(chǎn)生壞塊或壞頁(yè)、由此引發(fā)的數據丟失、對一些扇區或塊的過(guò)分磨損導致NANDFlash 壽命縮短等。為了能更好地使用NAND Flash,在其損壞時(shí)使損失最小化,需要一種方法,使用相同的地址可以屏蔽掉壞了的塊,而指針指向好塊。即使第一塊壞了,還可以使用O地址去操作一個(gè)好塊。 3 Flash存儲器的讀取方法 K9F11208UOM型Flash芯片內部與外部引腳關(guān)系如圖2所示。對于每一個(gè)塊的訪(fǎng)問(wèn),都需要一個(gè)固定的物理地址,基于這個(gè)固定的物理地址來(lái)操作Flash存儲器,在對塊進(jìn)行操作的時(shí)候,一個(gè)塊地址對應一個(gè)塊,如果這個(gè)塊壞了,那么這個(gè)地址的存在就沒(méi)有意義了。就像ARM芯片在引導的時(shí)候,需要復制Flash的前4 KB的數據,這樣需要固定塊的數據。如果這個(gè)塊壞了,系統將無(wú)法引導。 ![]() 下面通過(guò)地址重映射的方法,即在Flash固件里面加入一個(gè)地址重映射的區域來(lái)解決這一問(wèn)題。 4 基于地址重映射的讀取方法 在實(shí)現地址重映射的時(shí)候,可以從塊邏輯地址O開(kāi)始,查看相對應的物理塊。如果損壞,將地址從最后一個(gè)開(kāi)始向前指,而相應的邏輯塊被標示為壞塊。例如圖3,物理塊0損壞,邏輯塊地址0指向物理塊4095的地址,而邏輯塊地址4095被標示為壞塊?梢钥闯,即使塊0摜壞,仍然可以通過(guò)邏輯地址O進(jìn)行操作,其內部的變化,并不會(huì )影響外部的使用。唯一不同的是,Flash的整體空間變小了。不過(guò)即使這樣,也不會(huì )像以前那樣,第一塊壞了,就去換一個(gè) Flash。 ![]() 5 性能分析 很明顯,在數據讀取的時(shí)候增加了一步地址重映射的計算。這樣使整體性能會(huì )略微下降。下面分析一下加入地址重映射之后的性能影響(這里僅僅分析數據的讀取性能,因為對Flash操作最多的是數據的讀取,用戶(hù)使用時(shí)也是讀取最多)。 地址重映射是根據輸入的地址計算操作地址的。從圖4可以看出,地址重映射的計算是加在地址A25輸入之后的,因其在內部操作,延時(shí)相對很小。而這個(gè)地址重映射在整個(gè)塊操作之中只操作一次,且其使用時(shí)間很短,故在這里可以忽略不計,其對數據的讀取操作基本沒(méi)有影響。 ![]() 加入地址重映射之后,壞塊全部集中到了整個(gè)Flash設備的最后。也就是說(shuō),即使這個(gè)Flash中有1024個(gè)塊壞了,仍然可以當其為一個(gè)32 MB的Flash來(lái)使用,即其有效塊為第0~1 023塊;不像前面所描述的那樣,就算只有第一個(gè)塊壞了,這個(gè)Flash也就報廢了。經(jīng)過(guò)加入地址重映射之后的Flash,即使就剩下一塊沒(méi)有損壞的塊了,這個(gè)Flash仍然可以作為引導系統使用。 6 結論 通過(guò)在Flash內部加入地址重映射機制,對于使用Flash將會(huì )有很大的方便,并且,即使第一個(gè)塊壞了,仍可以繼續使用這個(gè)Flash,而無(wú)需廠(chǎng)家保證第一個(gè)塊是好的。這樣大大延長(cháng)了Flash的使用壽命,僅僅在壞塊達到一定數量的時(shí)候才需要換一個(gè)。 參考文獻 1. 彭兵,步凱,徐欣.NANDFlash壞塊管理研究[J].微處理機,2009(2):113. 2. Samsung Electronics.K9F1208UOM 64MX 8 Bit NAND Flash MEMORY USER's M A NUAL.Reversion 0.9. 3. Samsung Electronics.S3C2440 32-BIT CMOS MICROCONTROLLER USER'S MANUAL,Reversion 1.0. 作者:大連交通大學(xué) 王剛 關(guān)蘋(píng)蘋(píng) 宋濤 劉俊陽(yáng) 來(lái)源:《單片機與嵌入式系統應用 》 2009(11) |