關(guān)于掉電保存數(shù)據(jù)的思考
我是搞儀表的,基本工作簡單說就是弄個(gè)人機(jī)界面把一些參數(shù)存儲(chǔ)到flash。程序就是根據(jù)這些參數(shù)運(yùn)行,實(shí)現(xiàn)一個(gè)個(gè)軟件功能。有些軟件模塊需要記憶一些變量,目的是再次上電后能繼續(xù)運(yùn)行。為了實(shí)現(xiàn)這個(gè)功能我們基本上有兩條路可以走。一是用電池給ram供電,掉電不丟;二是掉電進(jìn)掉電中斷,把你要保存的數(shù)據(jù)保存下來。 我們以前都是走第一條路的,走的還不錯(cuò)。主要的問題就是不同的時(shí)間點(diǎn)掉電,數(shù)據(jù)可能沒有完全修改完,這樣的數(shù)據(jù)是沒有意義的,需要恢復(fù)到正確值。辦法就是弄AB兩份,通過校驗(yàn),取正確的一份。麻煩是麻煩,但是總是能弄好。 最近出于對(duì)成本的考慮,領(lǐng)導(dǎo)想走第二條路。前幾年公司里有人這樣走過,但是沒走通,原因是時(shí)間不夠。以前用51的芯片,現(xiàn)在換成STM32的了,鳥槍換炮,再試試。 領(lǐng)導(dǎo)讓再試試我們做馬仔的只能硬著頭皮去試試。 我首先考慮的是怎么存的問題??隙ú荒芟竦谝粭l路那樣搞n多標(biāo)志位,以前咱不懂,但是年紀(jì)小精力足,愣是把這么亂的邏輯弄清楚了?,F(xiàn)在知道痛了肯定不能這么搞。原則一:邏輯要盡量簡單。 以前為了支持在任何地方掉電不錯(cuò),所以邏輯做的復(fù)雜了。那么現(xiàn)在能不能不讓他在任何地方掉電,讓他在我指定的幾個(gè)地方掉電呢?當(dāng)然可以?;舅悸烦鰜砹耍褐袛嗬镏脴?biāo)志位,在主循環(huán)里去查找。一旦發(fā)現(xiàn)就存儲(chǔ),存好就死在那里等掉電。 試驗(yàn)結(jié)果:沒戲!50%成功率都危險(xiǎn)。原因是有些軟件模塊耗時(shí)挺長的,等輪到檢測代碼時(shí)已經(jīng)掉電掉的差不多了??粗鱾€(gè)模塊里被插滿掉電檢查函數(shù)的時(shí)候,我知道這條路也不行。 存看來只能在中斷里存了。有些和flash無關(guān)的模塊當(dāng)然沒有問題,有些模塊本身是要操作flash的。這個(gè)難不倒我,做個(gè)互斥,和flash相關(guān)的模塊在處理完后趕緊去查詢掉電中斷,如果已置起就趕緊保存數(shù)據(jù)。 這么一搞成功率一下子升到95%。沒戲,我要的是200%。王八蓋子的,不能倒在勝利的大門前。開始肯定懷疑是最壞情況下時(shí)間不夠(正在處理flash時(shí)掉電),通過示波器觀察時(shí)間足夠。那是怎么回事? 思考了半天,難道我在開機(jī)時(shí)就進(jìn)了掉電中斷?試驗(yàn)了一下還真有這樣的情況。那就簡單了,延時(shí)一下,等電壓穩(wěn)定后再開中斷。初步掉電了200次都正確。周末在做掉電測試。欲知結(jié)果,聽下回分解吧
|
|