您好,登錄后才能下訂單哦!
本篇內容介紹了“flash模擬eeprom存儲日志的原理是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
文章目的
采用flash模擬eeprom的優點
方案設計
注意事項
做mcu開發時,涉及到數據存儲時,往往都會考慮使用flash、eeprom,或者鐵電存儲器。從數據儲存的角度上來說,安全性最高的肯定是FRAM,接著才會考慮使用EEPROM,對于一般的數據儲存,flash就足夠了。考慮到一般的MCU都不會攜帶EEPROM,最簡單的方案可以利用flash模擬出eeprom,并且實現基本的日志文件系統操作,下面來描述一下基本的原理。
一般做mcu開發時,都會存儲數據,如果有文件系統,可以寫到文件中,但是一般不用文件系統時,則直接操作flash的讀寫。根據flash的操作特點,一方面是flash是只能從1變為0,不能從0寫到1。只有當擦除一個頁的時候,才能將該頁上的數據從0變為1。以一個頁為4K大小來計算,如果每次存幾十個字節,并且多次重復操作,那么每次都需要擦除一個頁之后再寫數據。
假如用戶數據是一連串的狀態信息,每次都只會改變其中的一個狀態,或者一個字節,那么每次操作都會將flash上所有的用戶數據讀到內存中,然后將內存中的數據的變化的狀態位改變,然后再擦除page,接著再將內存中的數據寫到flash的page上。
由于flash的讀寫壽命有限,在10w次左右,并且擦除page消耗的時間很長。所以上述方案存在缺陷,那么如何才能讓flash像eeprom一樣讀寫,而且操作也不用每次擦除flash呢?
為了非常容易的將flash當作eeprom來使用,需要確保兩個條件
1.讀寫的數據量至少小于1/2的flash的一個page數據量的大小
2.準備至少兩個pages
然后就可以開始設計數據的搬運了。
每個page的數據結構可以按照上圖所示進行設計。
首先每個pages的頭部都會有一個標志,用于描述當前的pages的狀態,其狀態有未初始化、有效、無效。具體場景是,當未初始化時,由于flash的電氣特性,其flags為0xff,此時需要初始化該page,往其標志位寫有效即可。然后依次向下存放數據,此時由于知道每次寫的數據量的大小,只需要確定其偏移量即可。
而這樣也會帶來一個問題,就是如何確保每次斷電后再上電也能知道當前寫數據的偏移?
要想解決這個問題,可以在每次上電的時候,遍歷該page0,通過讀取特定的用戶數據的標志位來確保得到當前數據的偏移量,然后就可以記錄在內存中,接著執行了。
當數據在一個page0中存滿后,此時需要將數據轉移到page1了。這個過程比較可以好好分解一下:
因為是日志型的數據類型,一定會存在數據被刪除或者更新的情況,所以page0中會有兩個同為index=0
的用戶數據。而且是最新的在后面。
一旦程序在pages上進行數據的寫操作時,檢查到剩余的pages空間不足則會將page0的狀態設置成無效,接著開始將page1的flags設置為有效狀態,同時開始將pages0中的數據轉移到page1,注意在轉移的時候,需要檢查page0中的index
,用最新的數據取代舊的數據。最后擦除page0即可。
依次按照上面的順序進行數據的搬運即可實現日志型數據操作的存儲。
該方案的使用,在很多情況下都可以很好的操作,但是一旦用戶數據量很大,接近1/2的page數據量時,頻繁的擦寫flash的問題也會存在。
隨著page個數的增加,也可以減少擦除的次數,帶來的問題是程序設計的更加復雜。
實際使用的過程中每個pages的flag標志不一定只有有效和無效的狀態,比如在轉移過程中,突然斷電了,為了保證數據的不丟失,一定要考慮到每個page異常情況下的狀態,并能夠恢復數據。達到掉電安全狀態。
有了這些后臺管理機制,再寫日志時,上層便可以直接使用讀寫函數進行操作,而不用管底層到底是flash還是eeprom。
“flash模擬eeprom存儲日志的原理是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。