記錄數據的可靠性,通常只考慮到突然掉電、寫入不完全等,往往忽略了存儲器件的使用壽命。存儲器件的擦除次數壽命是行業公認的客觀事實,工程師只能盡量的符合器件使用規范,以免過快損耗擦寫壽命。
Nand-Flash/eMMC(帶有Flash控制器的Nand-Flash)作為一種非線性宏單元模式存儲器,為固態大容量存儲的實現提供了廉價有效的解決方案。Nand-Flash存儲器具有容量大,改寫速度快等優點,適用于大量數據的存儲,因而越來越廣泛地應用在如嵌入式產品、智能手機、云端存儲資料庫等業界各領域。
圖1 Nand-Flash與eMMC芯片
存儲器件使用壽命
使用了Nand-Flash的主板出現丟數據掉程序現象,是一個讓無數工程師毛骨悚然的事故。眼看著程序用著用著就消失了,只能干著急也無法下手。有經驗的工程師手起刀落換上一顆新物料,熬夜補代碼繼續撐過半個項目周期。回頭無處發泄還要大刀闊斧換廠商、換品牌。與其換幾片Nand-Flash還能負擔得起,但畢竟這是一個無底洞,不如去深入探明問題原因,不然散盡家財也無法彌補虧空。
器件數據手冊中通常描述Nand-Flash的塊擦寫壽命達10萬次,EMMC的塊擦寫最高也會有1萬次;同理,EEPROM、SD卡、CF卡、U盤、Flash硬盤等存儲介質在都存在寫壽命的問題。在文件系統向寫數據的底層存儲器塊寫數據時,常規會先將塊里的數據讀出來,擦除塊干凈后,將需要寫入的數據和之前讀出來的塊數據一起在回寫到存儲器里面去,如果文件系統寫平衡沒有處理好,特別是要求1分鐘以內要記錄一次數據這樣頻繁的擦寫塊操作,就有可能將Nand-Flash或EMMC的塊寫壞。
存儲器件掉電丟數據
文件系統向存儲器寫數據時,常規是先將塊里的數據讀出來,擦除塊干凈后,將需要寫入的數據和之前讀出來的塊數據一起在回寫到存儲器里面去。如果設備在擦除塊過程中或者在回寫數據過程中意外發生斷電甚至電壓不穩定,均會造出數據丟失或者損壞。如果丟失的數據是文件系統的FAT表,則會造成文件系統崩潰。這就是引起系統程序無法啟動災難性后果的原因。
系統數據保護方案
很多時候,產品在未出廠前燒錄程序、反復測試,無論怎樣折騰也不會出現丟程序的情況。這可能的因素是測試設備保證了穩定的運行中電源輸出,因此系統運行中正常的Flash保護機制是可靠執行的。
相對于用戶實際使用而言,想避免Flash損壞的情況。需要嚴格遵守產品說明使用,尤其注意避免在Flash擦除或寫入過程中人為地突然掉電。這是存儲器件用法的一個大忌,即使完好的器件,如此不規范的使用也會大大縮短其壽命。而且不同環境下的電源系統五花八門,在電源不滿足功率要求情況下程序對于電源低電量的檢測閾值較低,此時強制啟動系統或執行寫操作更會加劇系統耗電波動,巨大的紋波也會引起CPU對存儲的誤操作。
解決此問題對于軟件方面而言:
調試系統或現場使用時,建議使用軟件復位,避免人為頻繁的通過斷電實現復位操作;有斷電必要時,將打印信息添加如“系統加載完成”、“數據保存完畢”等指示說明后操作;
軟件采取Flash均衡保存算法,高效地調整更改數據時擦除的Flash區域大小;
可將數據先寫入內存或者鐵電存儲器,然后定期的再將數據搬移到大的存儲器里面,減少直接斷Nand-Flash、EMMC擦寫次數;
在程序中加入或者提高電源電量檢測的閾值,程序上保證所有電源系統下的芯片在此閾值上均可以正常工作;
讀寫過程中仔細對壞塊表進行維護更新,避免程序寫入壞塊。讀取數據時對ECC校驗,確保讀取數據無誤。
從硬件角度考慮需要注意:
用法上避免在Flash擦除或寫入過程中人為突然掉電;
設計好處理控制核心的電源系統,防止CPU等在啟動、運行中,電源系統因瞬時變化引起的紋波等情況;
搭配掉電檢測電路,在檢測到外部電源掉電的同時,及時迅速關閉文件系統,停止向文件系統內寫數據的操作;
添加文件系統電源域UPS電源,乃至整機掉電續航工作電源;
對于使用EEPROM等小容量存儲的用戶而言,可以考慮使用高可靠性的鐵電材料加工制成的鐵電非易失性存儲器FRAM來替換。FRAM可以像RAM一樣快速讀寫。數據在掉電后可以保存10年,且其讀寫壽命高達100億次,比EEPROM和其他非易失性記憶體系統可靠性更高,結構更簡單,功耗低等優點。
圖2 鐵電材料非易失性存儲器