關于FLASH壽命的讀寫方法
NOR(或非)和NAND(與非)是市場上兩種主要的Flash閃存,sNORFLASH 和CPU之間不需要其他電路控制,NOR flash可以芯片內執(zhí)行程序,而NAND FLASH 和CPU 的接口必須由相應的控制電路進行轉換, NAND FLASH 以塊的方式進行訪問,不支持芯片內執(zhí)行。
NAND FLASH 比NOR FLASH 容量大,價格低, NAND flash中每個塊的最大擦寫次數為100萬次,而NOR 10W次, FLASH 編程原理都是只能把1變成0,而不能把0寫為1, 所以在FLASH 編程之前,都要把對應的塊擦除,擦除的過程就是把所有位都寫為1,塊內所有字節(jié)都變?yōu)?xFF。
NAND Flash芯片的種種不足,則需要靠控制芯片或操作系統(tǒng)軟件來補足,動態(tài)平均抹寫(Dynamic Wear Leveling)就是NAND Flash控制芯片技術上的一項重要設計,可以將寫入的資料平均在每一個NAND Flash芯片的區(qū)塊上,而非重復寫入同一個區(qū)塊,造成NAND Flash芯片的損害,可以順利延長NAND Flash芯片使用壽命,因此Wear-Leveling技術幾乎是NAND Flash控制芯片設計上的必備。
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.
動態(tài)平均讀寫解決了塊的 Erase 周期的次數限制。動態(tài)平均讀寫算法并不是隨機使用可用的塊,而是平均使用塊,因此,每個塊都獲得了相同的使用機會。靜態(tài)平均讀寫算法解決了一個更有趣的問 題。除了最大化 Erase 周期的次數外,某些 flash 設備在兩個 Erase 周期之間還受到最大化 Read 周期的影響。這意味著如果數據在塊中存儲的時間太長并且被讀了很多次,數據會逐漸消耗直至丟失。靜態(tài)平均讀寫算法解決了這一問題,因為它可以定期將數據移 動到新塊。
開發(fā)電子產品時,常常需要斷電后保存某些數據,這就需要使用FLASH或EEPROM芯片,這兩種芯片,可擦除的次數是有限制的,通常FLASH為10萬 次,EEPROM要多一點,為100萬甚至1000萬次。FLASH的擦除不能單個字節(jié)進行,有一個最小單位,存儲容量相對比較大,適合大量數據的存 儲;EEPROM可以單個字節(jié)進行擦除,存儲容量不大,只適合存儲少量的設置數據。
先以FLASH和EEPROM需要寫入一個字節(jié)為例來說明新數據是如何寫入的。假定都是在首地址要寫入新數據0x55。不管是FLASH還是EEPROM
對于FLASH,寫操作只能將數據位從1改寫為0,如果想要將數據位從0改為1,就需要進行擦除操作,而且這個擦除最小單位是page(可能是256字節(jié) 或更多)。現(xiàn)在要在首地址寫入0x55,穩(wěn)妥的方法是先擦除這個地方,也就是要擦除第一個page,擦除操作會一并將首地址后面的另外255個字節(jié)也擦除 掉,如果這255個字節(jié)保存有其它數據,還需要把這些數據先進行備份,擦除第一個page后再將0x55和備份的255個字節(jié)寫進去。也不是必須擦除第一 個page,寫操作可以完成數據位1到0的轉變,利用這一特性結合首地址原來的內容,我們就有可能不用進行擦除操作,比如原來內容為0xFF,顯然可以直 接寫入0x55,原內容為0xF5,同樣也可以寫入0x55,但如果原內容為0xAA,執(zhí)行寫0x55則會得到完全錯誤的結果,寫完后內容依然為 0x00,因為對于0x55所有需要保持為1的位數據0xAA都是0,寫0x55會把0xAA為1的位全清0,原來為0的位不會改變。
對于EEPROM,寫操作既可以將數據位從1改寫為0,也可以將數據位從0改寫為1,不需要進行單獨的擦除操作,要寫0x55直接將0x55寫到首地址, 不管原來內容為什么,完成寫操作后內容都是0x55。
一開始我們說了FLASH和EEPROM都有可擦除的最大次數(EEPROM實際上沒有擦除操作),雖然這個數字看著不小,但對于程序來說并不大,比如 EEPROM為10萬次,如果我們以每秒一次的間隔依次寫入0xFF和0x00,則只能維持100000/3600=27.78小時,也就是一天多就可以 超出其最大壽命次數,不能再可靠寫入所需的內容。
這種可寫入的最大次數是芯片的特性決定的,我們無法改變,所以在使用這些芯片時,我們應充分考慮最大寫入次數這一參數,要確保產品在實際工作中不超過這一 參數。實際上許多時候只要程序做出針對性處理,有可能讓產品的最大寫入次數超過芯片的壽命,還是以EEPROM來做說明。
假定現(xiàn)在有一個產品,需要保存一些參數,參數的個數并不多,總共為10個字節(jié),用EEPROM來保存就可以滿足需求,我們選用了容量為256字節(jié)的 EEPROM,如果我們不做過多考慮,很有可能就是直接將這10個字節(jié)從EEPROM的首地址開始保存,每次改寫也是直接修改這部分內容,這樣我們最多可 以保存參數10萬次。只要我們做一點簡單處理,就可以將保存參數的次數成倍增加,來看看我們應該如何實現(xiàn)。
直接保存的最簡方法:
地址 0x00 0x01 0x02 ... 0x09
內容 data1 data2 data3 ... data10
改進的保存方法:
處理方法是將256字節(jié)按16字節(jié)大小分成16等份,按后面格式存儲參數
地址 0x10*n +0x00 +0x01 +0x02 ... +0x09 +0x0A +0x0B +0x0C +0x0D +0x0E +0x0F
內容 flag data1 data2 ... data9 data10 保留1 保留2 保留3 保留4 check_sum
check_sum=(flag+data1+data2+...+data10+保留1+...+保留4 )&0xFF
flag為0xA5表示當前16個字節(jié)為正在使用的記錄,為其它值表示當前16字節(jié)已經丟棄
讀取參數的時候先從地址0x10*n+0x00讀flag,如果為0xA5表明當前記錄為正在使用中,讀出全部內容,并按前面公式進行校驗,如果校驗出 錯,則當前參數不可靠,直接使用默認參數,并將當前區(qū)域的flag改寫為0,同時在地址0x10*(n+1)位置開始將默認參數寫入,地址0x10* (n+1)寫入內容為0xA5。如果所有區(qū)域都沒有發(fā)現(xiàn)有效記錄,在地址0寫入默認參數。
每次需要更改參數設定時,先將當前記錄位置的flag改為0,然后再下一條記錄位置寫入新的參數,這個順序可以做出適當改進,比如對寫入時斷電等意外情況 做出考慮,從而得到更可靠的寫入結果,不過就按此方法也都可以滿足應用需求。
再來對比一下兩種方法,最簡方法只能保存10萬次,改進的方法理論上增加了16倍,達到160萬次,如果預估最簡方法產品是3年內絕對不會出錯,現(xiàn)在就增 加到了48年,一個電子產品使用超過3年還是有可能,但用48年的可能性就非常之小,可以視同為0。對于FLASH芯片也是同樣道理,這里就不重復舉例說 明,在應用中也應該做出同樣的處理。
編輯:admin 最后修改時間:2023-07-15