www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號(hào)精選 > 嵌入式IoT

flash模擬eeprom存儲(chǔ)日志的原理

  • 文章目的

  • 采用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,最簡單的方案可以利用flash模擬出eeprom,并且實(shí)現(xiàn)基本的日志文件系統(tǒng)操作,下面來描述一下基本的原理。

采用flash模擬eeprom的優(yōu)點(diǎn)

一般做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呢?

方案設(shè)計(jì)

為了非常容易的將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)有未初始化、有效、無效。具體場景是,當(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ǔ)。

注意事項(xiàng)

該方案的使用,在很多情況下都可以很好的操作,但是一旦用戶數(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。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉