1. 程式人生 > >讓嵌入式工程師毛骨悚然的掉電丟資料事故可以這樣解決!

讓嵌入式工程師毛骨悚然的掉電丟資料事故可以這樣解決!

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

Nand-Flash/eMMC(帶有Flash控制器的Nand-Flash)作為一種非線性巨集單元模式儲存器,為固態大容量儲存的實現提供了廉價有效的解決方案。Nand-Flash儲存器具有容量大,改寫速度快等優點,適用於大量資料的儲存,因而越來越廣泛地應用在如嵌入式產品、智慧手機、雲端儲存資料庫等業界各領域。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

圖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和其他非易失性記憶體系統可靠性更高,結構更簡單,功耗低等優點。

0?wx_fmt=png

圖2 鐵電材料非易失性儲存器

下面簡介一款基於法拉電容的UPS電路設計思路,要點如下:

  • 由於電容存在個體差異,電容儲存電荷的速率不一樣,存在過充造成電壓超過耐壓值的問題,電路中存在多顆法拉電容時需要做均壓處理;

  • 為保證電容能夠充滿電能,源端需採用恆流源充電;

  • 為維持電容電壓穩定,並降低充電電路功耗,需增加過壓檢測電路;

  • 若對電壓高於法拉電容本身電壓上限的電源系統提供掉電續航時,Vcc_backu端需通過BOOST升壓電路後以實現,且注意系統正常時(充電過程中)關斷EN腳。

0?wx_fmt=png

圖3 基於法拉電容的UPS核心電路

系統電源正常時,充電電路即給UPS充電。系統電源掉電時,UPS放電給系統提供備用電能,建議UPS在掉電後能持續給檔案系統供電能力不低於10秒,在10秒續航期間內,系統可以將電源異常狀態上報、及時保持臨時重要資料、關閉檔案系統,保證系統穩定性,避免檔案系統在掉電情況下出現損害,影響應用程式的正常啟動。

0?wx_fmt=png

圖4 建議UPS充放電時序

此外系統掉電情況需要掉電檢測電路實現。使用一顆比較器器件即可,注意使用Output_VCC端供電,以確保外部掉電時,比較器仍然可以工作。比較器負端連線一個參考電壓,參考電壓由穩壓二極體提供。正常供電時,比較器輸出電壓由升壓電路的反饋端分壓決定;掉電時,比較器輸出低電平,此時處理器仍未掉電,收到狀態資訊可及時響應處理。另一路掉電檢測可供其它功能使用。

640?

0?wx_fmt=gif

免責宣告:本文系網路轉載,版權歸原作者所有。如涉及作品版權問題,請與我們聯絡,我們將根據您提供的版權證明材料確認版權並支付稿酬或者刪除內容。