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