關(guān)于FLASH壽命的讀寫方法
NOR(或非)和NAND(與非)是市場上兩種主要的Flash閃存,sNORFLASH 和CPU之間不需要其他電路控制,NOR flash可以芯片內(nèi)執(zhí)行程序,而NAND FLASH 和CPU 的接口必須由相應(yīng)的控制電路進(jìn)行轉(zhuǎn)換, NAND FLASH 以塊的方式進(jìn)行訪問,不支持芯片內(nèi)執(zhí)行。
NAND FLASH 比NOR FLASH 容量大,價(jià)格低, NAND flash中每個(gè)塊的最大擦寫次數(shù)為100萬次,而NOR 10W次, FLASH 編程原理都是只能把1變成0,而不能把0寫為1, 所以在FLASH 編程之前,都要把對應(yīng)的塊擦除,擦除的過程就是把所有位都寫為1,塊內(nèi)所有字節(jié)都變?yōu)?xFF。
NAND Flash芯片的種種不足,則需要靠控制芯片或操作系統(tǒng)軟件來補(bǔ)足,動(dòng)態(tài)平均抹寫(Dynamic Wear Leveling)就是NAND Flash控制芯片技術(shù)上的一項(xiàng)重要設(shè)計(jì),可以將寫入的資料平均在每一個(gè)NAND Flash芯片的區(qū)塊上,而非重復(fù)寫入同一個(gè)區(qū)塊,造成NAND Flash芯片的損害,可以順利延長NAND Flash芯片使用壽命,因此Wear-Leveling技術(shù)幾乎是NAND Flash控制芯片設(shè)計(jì)上的必備。
Static Wear Leveler
Let the Static Wear Leveler (SW Leveler) be associated with a Block Erasing Table (BET) to remember which block has been erased in a selected period of time. The SW Leveler is activated by some system parameters for the needs of static wear levelling. When the SW Leveler is running, it either resets the BET or picks up a block that has not been erased so far (based on the BET information) and triggers the Cleaner to do garbage collection on the block. The selection procedure of a block must be done in an efficient way within a bounded amount of time. Note that the BET must be updated whenever a block is erased. It could be done by a triggering action to the SW Leveler. The design of the BET must be scalable because of the rapid increasing of flash-memory capacity and the limited RAM space on a controller. Whenever a block is recycled by garbage collection, any modification to the address translation is done as the original design of a Flash Translation Layer driver. The implementation of the SW Leveler could be a thread or a procedure triggered by a timer or the Allocator/Cleaner based on some preset conditions.
The SW Leveler is invoked by the Cleaner to update the BET whenever any block is erased by the Cleaner in garbage collection when static wear levelling is needed. We can use two variables to keep track of the total number of block erases done since the BET is reset and the number of 1’s in the BET. If the ratio of the two tracked number is too high, the SW Leveler is triggered to move cold data from their original place by requesting the Cleaner to reclaim those blocks whose corresponding bit in the Block Erasing Table is 0.
Block Erasing Table
The purpose of the Block Erasing Table (BET) is to remember which block has been erased in a pre-determined time frame, referred to as the resetting interval, so as to locate blocks of cold data. A BET is a bit array, in which each bit corresponds to a set of 2k contiguous blocks where k is an integer that is larger or equal to 0. Whenever a block is erased by the Cleaner, the SW Leveler is triggered to set the corresponding bit as 1.
動(dòng)態(tài)平均讀寫解決了塊的 Erase 周期的次數(shù)限制。動(dòng)態(tài)平均讀寫算法并不是隨機(jī)使用可用的塊,而是平均使用塊,因此,每個(gè)塊都獲得了相同的使用機(jī)會(huì)。靜態(tài)平均讀寫算法解決了一個(gè)更有趣的問 題。除了最大化 Erase 周期的次數(shù)外,某些 flash 設(shè)備在兩個(gè) Erase 周期之間還受到最大化 Read 周期的影響。這意味著如果數(shù)據(jù)在塊中存儲(chǔ)的時(shí)間太長并且被讀了很多次,數(shù)據(jù)會(huì)逐漸消耗直至丟失。靜態(tài)平均讀寫算法解決了這一問題,因?yàn)樗梢远ㄆ趯?shù)據(jù)移 動(dòng)到新塊。
開發(fā)電子產(chǎn)品時(shí),常常需要斷電后保存某些數(shù)據(jù),這就需要使用FLASH或EEPROM芯片,這兩種芯片,可擦除的次數(shù)是有限制的,通常FLASH為10萬 次,EEPROM要多一點(diǎn),為100萬甚至1000萬次。FLASH的擦除不能單個(gè)字節(jié)進(jìn)行,有一個(gè)最小單位,存儲(chǔ)容量相對比較大,適合大量數(shù)據(jù)的存 儲(chǔ);EEPROM可以單個(gè)字節(jié)進(jìn)行擦除,存儲(chǔ)容量不大,只適合存儲(chǔ)少量的設(shè)置數(shù)據(jù)。
先以FLASH和EEPROM需要寫入一個(gè)字節(jié)為例來說明新數(shù)據(jù)是如何寫入的。假定都是在首地址要寫入新數(shù)據(jù)0x55。不管是FLASH還是EEPROM
對于FLASH,寫操作只能將數(shù)據(jù)位從1改寫為0,如果想要將數(shù)據(jù)位從0改為1,就需要進(jìn)行擦除操作,而且這個(gè)擦除最小單位是page(可能是256字節(jié) 或更多),F(xiàn)在要在首地址寫入0x55,穩(wěn)妥的方法是先擦除這個(gè)地方,也就是要擦除第一個(gè)page,擦除操作會(huì)一并將首地址后面的另外255個(gè)字節(jié)也擦除 掉,如果這255個(gè)字節(jié)保存有其它數(shù)據(jù),還需要把這些數(shù)據(jù)先進(jìn)行備份,擦除第一個(gè)page后再將0x55和備份的255個(gè)字節(jié)寫進(jìn)去。也不是必須擦除第一 個(gè)page,寫操作可以完成數(shù)據(jù)位1到0的轉(zhuǎn)變,利用這一特性結(jié)合首地址原來的內(nèi)容,我們就有可能不用進(jìn)行擦除操作,比如原來內(nèi)容為0xFF,顯然可以直 接寫入0x55,原內(nèi)容為0xF5,同樣也可以寫入0x55,但如果原內(nèi)容為0xAA,執(zhí)行寫0x55則會(huì)得到完全錯(cuò)誤的結(jié)果,寫完后內(nèi)容依然為 0x00,因?yàn)閷τ?x55所有需要保持為1的位數(shù)據(jù)0xAA都是0,寫0x55會(huì)把0xAA為1的位全清0,原來為0的位不會(huì)改變。
對于EEPROM,寫操作既可以將數(shù)據(jù)位從1改寫為0,也可以將數(shù)據(jù)位從0改寫為1,不需要進(jìn)行單獨(dú)的擦除操作,要寫0x55直接將0x55寫到首地址, 不管原來內(nèi)容為什么,完成寫操作后內(nèi)容都是0x55。
一開始我們說了FLASH和EEPROM都有可擦除的最大次數(shù)(EEPROM實(shí)際上沒有擦除操作),雖然這個(gè)數(shù)字看著不小,但對于程序來說并不大,比如 EEPROM為10萬次,如果我們以每秒一次的間隔依次寫入0xFF和0x00,則只能維持100000/3600=27.78小時(shí),也就是一天多就可以 超出其最大壽命次數(shù),不能再可靠寫入所需的內(nèi)容。
這種可寫入的最大次數(shù)是芯片的特性決定的,我們無法改變,所以在使用這些芯片時(shí),我們應(yīng)充分考慮最大寫入次數(shù)這一參數(shù),要確保產(chǎn)品在實(shí)際工作中不超過這一 參數(shù)。實(shí)際上許多時(shí)候只要程序做出針對性處理,有可能讓產(chǎn)品的最大寫入次數(shù)超過芯片的壽命,還是以EEPROM來做說明。
假定現(xiàn)在有一個(gè)產(chǎn)品,需要保存一些參數(shù),參數(shù)的個(gè)數(shù)并不多,總共為10個(gè)字節(jié),用EEPROM來保存就可以滿足需求,我們選用了容量為256字節(jié)的 EEPROM,如果我們不做過多考慮,很有可能就是直接將這10個(gè)字節(jié)從EEPROM的首地址開始保存,每次改寫也是直接修改這部分內(nèi)容,這樣我們最多可 以保存參數(shù)10萬次。只要我們做一點(diǎn)簡單處理,就可以將保存參數(shù)的次數(shù)成倍增加,來看看我們應(yīng)該如何實(shí)現(xiàn)。
直接保存的最簡方法:
地址 0x00 0x01 0x02 ... 0x09
內(nèi)容 data1 data2 data3 ... data10
改進(jìn)的保存方法:
處理方法是將256字節(jié)按16字節(jié)大小分成16等份,按后面格式存儲(chǔ)參數(shù)
地址 0x10*n +0x00 +0x01 +0x02 ... +0x09 +0x0A +0x0B +0x0C +0x0D +0x0E +0x0F
內(nèi)容 flag data1 data2 ... data9 data10 保留1 保留2 保留3 保留4 check_sum
check_sum=(flag+data1+data2+...+data10+保留1+...+保留4 )&0xFF
flag為0xA5表示當(dāng)前16個(gè)字節(jié)為正在使用的記錄,為其它值表示當(dāng)前16字節(jié)已經(jīng)丟棄
讀取參數(shù)的時(shí)候先從地址0x10*n+0x00讀flag,如果為0xA5表明當(dāng)前記錄為正在使用中,讀出全部內(nèi)容,并按前面公式進(jìn)行校驗(yàn),如果校驗(yàn)出 錯(cuò),則當(dāng)前參數(shù)不可靠,直接使用默認(rèn)參數(shù),并將當(dāng)前區(qū)域的flag改寫為0,同時(shí)在地址0x10*(n+1)位置開始將默認(rèn)參數(shù)寫入,地址0x10* (n+1)寫入內(nèi)容為0xA5。如果所有區(qū)域都沒有發(fā)現(xiàn)有效記錄,在地址0寫入默認(rèn)參數(shù)。
每次需要更改參數(shù)設(shè)定時(shí),先將當(dāng)前記錄位置的flag改為0,然后再下一條記錄位置寫入新的參數(shù),這個(gè)順序可以做出適當(dāng)改進(jìn),比如對寫入時(shí)斷電等意外情況 做出考慮,從而得到更可靠的寫入結(jié)果,不過就按此方法也都可以滿足應(yīng)用需求。
再來對比一下兩種方法,最簡方法只能保存10萬次,改進(jìn)的方法理論上增加了16倍,達(dá)到160萬次,如果預(yù)估最簡方法產(chǎn)品是3年內(nèi)絕對不會(huì)出錯(cuò),現(xiàn)在就增 加到了48年,一個(gè)電子產(chǎn)品使用超過3年還是有可能,但用48年的可能性就非常之小,可以視同為0。對于FLASH芯片也是同樣道理,這里就不重復(fù)舉例說 明,在應(yīng)用中也應(yīng)該做出同樣的處理。
編輯:admin 最后修改時(shí)間:2023-07-15