Nand Flash作為一種安全、快速的存儲體,,因其具有體積小,、容量大,、成本低,、掉電數(shù) 據(jù)不丟失等一系列優(yōu)點,已逐步取代其它半導(dǎo)體存儲元件,,成為嵌入式系統(tǒng)中數(shù)據(jù)存儲的主 要載體,。盡管Nand Flash的每個單元塊相互獨立,且每塊一般可擦除次數(shù)高達(dá)10~100萬次,, 但是隨著擦寫次數(shù)增加,,會有一些單元塊逐漸變得不穩(wěn)定或失效從而形成永久性壞塊。因此,, 要避免頻繁地對同一塊進(jìn)行操作,,盡量達(dá)到擦寫次數(shù)均衡;同時,,由于擦除操作耗時較多,, 會對系統(tǒng)的實時性造成影響。為此,,本文介紹了一種基于磨損均衡思想的Nand Flash存儲管 理方式,,并深入討論了該方式在Ti公司的DSP TMS320F28x中的程序?qū)崿F(xiàn)。
1 器件介紹
本文中采用的Nand Flash芯片K9F6408U0C是一塊擁有8M(8,388,608)×8bit存儲空間及 256K(262,,144)×8bit輔用存儲空間的存儲芯片,,電源電壓為1.8V-3.3V。芯片內(nèi)部按塊和 頁的方式來組織的,,如圖1所示,,共分成1024個塊,每塊包含16個頁,每頁內(nèi)有528個字節(jié)。 F28x系列DSP是美國TI公司最新推出的C2000平臺上的定點DSP芯片,。
圖1 K9F6408UOC內(nèi)部結(jié)構(gòu)示意圖
F28x系列芯片具有 低成本,、低功耗和高效能等特點,特別適用于有大量數(shù)據(jù)處理的測控場合,。
2 Flash的特點及存儲管理的作用
由K9F6408U0C的基本結(jié)構(gòu)可以知道,,它的基本單位有塊、頁,、字節(jié)等,。 Nand Flash 芯片具有如下特點:
Flash寫:通過寫命令將每個字節(jié)存儲單元中的1變?yōu)?;寫操作不能把0變?yōu)?。
Flash擦除:擦除命令是Flash中存儲單元0變?yōu)?的唯一途徑,,一旦對某一塊中的某一位 寫0,,要再改變成1,則必須執(zhí)行擦除命令,。
通常,,對于容量較小的Flash塊的操作過程是:先把整個塊的數(shù)據(jù)讀到RAM中,在RAM中 修改數(shù)據(jù)內(nèi)容,,再擦除整個塊,,最后寫入修改后的數(shù)據(jù)。顯然,,這樣頻繁復(fù)雜的讀-擦除- 寫操作,,對于Flash的使用壽命以及系統(tǒng)性能是很不利的,而且微處理器中通常RAM大小有限,。 因此在硬件條件苛刻的嵌入式系統(tǒng)中就迫切需要一種合理的存儲管理方式以便有效地均衡 Flash各個存儲塊的擦寫次數(shù),,提高Flash的使用壽命,從而提高數(shù)據(jù)存儲的安全性,。
3 存儲管理系統(tǒng)的設(shè)計
3.1建立壞塊管理表
Nand Flash由于生產(chǎn)工藝的問題,,不可避免的會存在一些壞塊,這些壞塊在芯片出廠前 都已被標(biāo)識好,。根據(jù)Nand Flash數(shù)據(jù)手冊中的介紹,,在每一塊的第一頁與第二頁的Spare area 的第六個字節(jié)(也就是該頁的第517字節(jié))即是出廠時的壞塊標(biāo)識位,如果某塊的該兩頁的 第517字節(jié)內(nèi)容不同時為0xFF,,則代表該塊為廠家標(biāo)識壞塊,。這種壞塊的檢測必須在對芯 片進(jìn)行擦除前進(jìn)行,因為廠家壞塊有可能也能夠被進(jìn)行擦除操作,,如使用這種塊將對數(shù)據(jù)安 全留下一定的隱患,。
Nand Flash在出廠前會保證每塊芯片的第一塊與第二塊是完好的,所以在本文的設(shè)計中,,采用的方式是將壞塊管理表存放在第一塊的第一頁的前128個字節(jié)中,,每個字節(jié)的一位代表芯片的一塊,如該位為1剛表明該塊是好的,,為0則表示對應(yīng)塊為壞塊,。壞塊管理表的建立是必需的,而且最好是在芯片進(jìn)行其它擦寫操作前進(jìn)行,。
3.2 Flash存儲空間管理
在本文設(shè)計的Flash空間管理中,,F(xiàn)lash的存儲塊被分為空閑塊(Free,即空白沒寫數(shù)據(jù) 的好塊),,有效塊(Valid,,即存有有效數(shù)據(jù)的塊,,不能被擦除),無效塊(Invalid,,即數(shù) 據(jù)已無效或是寫入錯誤塊,,可被擦除),保留塊(Reserve,,用于替換新產(chǎn)生的壞塊),,其它的則為壞塊,所有存儲塊的管理均采用單向鏈表方式進(jìn)行管理,。
在大部分的Flash存儲空間管理系統(tǒng)中可能并不存在保留塊,,在本系統(tǒng)中增加保留塊的 作用主要是,當(dāng)部分存儲塊因為反復(fù)擦寫成為新的壞塊時,,可以用保留塊取而代之成為新的空閑塊,,從而使得留給用戶的可用存儲塊總數(shù)在一定時期內(nèi)是一定的,,這樣做的優(yōu)點是可以增強數(shù)據(jù)的安全性,,延長整個Flash的使用周期,缺點是用戶可用的存儲空間相對減少,,不過在Flash芯片技術(shù)迅速發(fā)展的今天,,大容量的Flash芯片價格已經(jīng)十分低廉,數(shù)據(jù)安全才是嵌入式系統(tǒng)設(shè)計最值得重視的,。
在本文的設(shè)計中,,統(tǒng)一規(guī)定Flash每一塊的第一頁的Spare Area為數(shù)據(jù)塊狀態(tài)信息標(biāo)記區(qū),具體規(guī)定如表2所示:
根據(jù)上表的設(shè)計,,塊擦除次數(shù)最大為224 ? 1 = 16777215 ,,遠(yuǎn)大于Flash的最大擦除次數(shù)10到100萬次;塊狀態(tài)標(biāo)記字節(jié),,0xFF代表其為空閑塊,,0xFD代表其為保留塊,0xFC代表其為有效塊,,0xF0代表其為無效塊,,0x00則表明當(dāng)前塊為壞塊,在壞塊管理表中其對應(yīng)位為0,。
3.3磨損均衡與無效塊回收
如圖2所示,,當(dāng)系統(tǒng)上電后,如不存在壞塊管理表則應(yīng)首先應(yīng)建立相應(yīng)的壞塊管理表,, 參照壞塊表根據(jù)每一塊的第517字節(jié)建立各個鏈表Free_List,,Valid_List,Invalid_List,, Reserved_List,,初始化并按擦除次數(shù)非遞減序排列各鏈表,。當(dāng)無效塊因擦除成為新的空閑塊時,根據(jù)塊擦除次數(shù)插入到空閑鏈表中相應(yīng)位置,,當(dāng)需要寫入數(shù)據(jù)到新的空閑塊時則取用空 閑鏈表的鏈?zhǔn)姿缚臻e塊,,寫入數(shù)據(jù)有效后則標(biāo)識該塊為有效塊,否則標(biāo)識為無效塊,,通過 這樣的管理方式保證每次都是使用空閑鏈表中擦除次數(shù)最小的塊,,從而使磨損達(dá)到均衡。
圖2 Flash存儲管理流程示意圖
對于靜態(tài)數(shù)據(jù)塊(指的是Flash中存儲的不經(jīng)常被修改的數(shù)據(jù))[3],,在本文中采用的處 理方法是當(dāng)空閑塊中的最大擦除次數(shù)與有效塊中的最小擦除次數(shù)之差大于某一設(shè)定閥值(該 閥值不能過小,,否則數(shù)據(jù)搬遷將過于頻繁),則遷移該有效塊中數(shù)據(jù)至空閑鏈表中擦除次數(shù) 最大的塊中,,從而避免因某些數(shù)據(jù)塊被靜態(tài)數(shù)據(jù)長時間占用而使得其它數(shù)據(jù)塊的磨損加劇,, 進(jìn)而可使得整個Flash的磨損趨于平衡。
對于無效塊的擦除回收本文的設(shè)計是在有足夠空閑塊的情況下一般是在系統(tǒng)空閑或上 電時進(jìn)行,,這樣能節(jié)約更多寶貴的系統(tǒng)資源以進(jìn)行更重要的工作,,當(dāng)在系統(tǒng)運行過程中,如果空閑塊塊數(shù)與無效塊塊數(shù)的比值超出一個閥值(本系統(tǒng)取50),,則啟動程序回收所有無效 塊,。這個閥值應(yīng)取得適中,如太大則使得回收過于頻繁,,太少的話一方面使空閑空間過少,, 另一方面一旦啟動回收程序,因要回收塊數(shù)過多,,從而使采集數(shù)據(jù)的實時輸入受到影響,,本 系統(tǒng)中取空閑塊與無效塊的比值作為閥值,好處是只要空閑塊塊數(shù)足夠,,無效塊回收基本在系統(tǒng)初始化是進(jìn)行,,即使在采集過程中回收占用的時間也是十分微小,這樣的設(shè)計對實時性要求極高的嵌入式系統(tǒng)是很有好處的,。
3.4 Flash存儲管理的程序?qū)崿F(xiàn)
對于Nand Flash在DSP嵌入式系統(tǒng)中的使用,,其接口方式與讀寫方法與在其他單片機中的方法都是一樣的,參考[1]中提供的流程圖就可以完成,,其難點在于如何管理,,在其管理中,對鏈表數(shù)據(jù)結(jié)構(gòu)的操作是最重要的,,下面將給出本文系統(tǒng)中用DSP TMS320F28x如何實現(xiàn)Nand Flash存儲管理的鏈表操作的關(guān)鍵程序代碼,,結(jié)合具體的要求只需要進(jìn)行簡單的修改即可滿足在新系統(tǒng)中的應(yīng)用。
在DSP系統(tǒng)工程中的CMD文件中,,對于段的定義一定要為.systemmem分配一定的可用RAM空間[ 4 ],,這個大小跟系統(tǒng)后面malloc函數(shù)要分配的動態(tài)內(nèi)存空間有關(guān),,以便在產(chǎn)生一個新的結(jié)點時申請一個結(jié)點類型大小的空間,在結(jié)點銷毀時可對空間進(jìn)行釋放,,定義系統(tǒng)中鏈表結(jié)點的類型為:
通過這樣的定義就可以得到四個帶頭結(jié)點的鏈表,,頭結(jié)點的數(shù)庫域中是沒有信息的,每 一個鏈表的頭結(jié)點都指向該鏈表的首元素,,如不存在則指向NULL,,程序中必須初始化指針, 否則會造成致命的系統(tǒng)錯誤,。下面給出鏈表的初始化程序,,結(jié)點生成及銷毀程序,其他的函 數(shù)就不一一列舉,,只給出其相應(yīng)函數(shù)名及功能介紹,。
4 結(jié)論
本文創(chuàng)新點在于:從Nand Flash的特性出發(fā),深入討論了基于磨損均衡算法的Flash存儲 管理在DSP系統(tǒng)中采用鏈表結(jié)構(gòu)的程序?qū)崿F(xiàn),,改進(jìn)了無效塊的回收方式及動靜態(tài)數(shù)據(jù)塊的磨 損平衡,。經(jīng)實踐證明,有效延長了Flash的使用壽命,進(jìn)一步提高了其存儲效率和數(shù)據(jù)安全性,, 從而更有利于在嵌入式系統(tǒng)中的應(yīng)用,。