范劍
(浙江臺(tái)州學(xué)院 機(jī)械工程學(xué)院,臺(tái)州 310018)
E2PROM是具有電可擦除特性的存儲(chǔ)器。其優(yōu)點(diǎn)是無(wú)需外加電源即可永久保存數(shù)據(jù)?;谶@種優(yōu)良特性,該器件廣泛應(yīng)用于對(duì)數(shù)據(jù)存儲(chǔ)安全性及可靠性要求較高的應(yīng)用場(chǎng)合。而且,越來(lái)越多的微控制器(MCU)生產(chǎn)廠(chǎng)家陸續(xù)推出了集成獨(dú)立E2PROM數(shù)據(jù)存儲(chǔ)器的產(chǎn)品,使其在結(jié)構(gòu)、性能和功能等方面都有明顯的提高。但是,E2PROM的缺點(diǎn)是數(shù)據(jù)的寫(xiě)入次數(shù)有限(指某一位由1寫(xiě)為0的次數(shù)),當(dāng)前的工藝技術(shù)已經(jīng)能做到不低于100萬(wàn)次。這雖然能夠滿(mǎn)足多數(shù)用戶(hù)的要求,但對(duì)于E2PROM內(nèi)的數(shù)據(jù)在系統(tǒng)運(yùn)行過(guò)程中有頻繁擦寫(xiě)的要求而言,當(dāng)存放這些數(shù)據(jù)的片內(nèi)存儲(chǔ)單元擦寫(xiě)次數(shù)達(dá)到上限時(shí),這個(gè)存儲(chǔ)單元就不能再使用了,從而需要另辟蹊徑,盡量提高E2PROM的寫(xiě)入壽命。姜金、李波等人利用空閑E2PROM空間,提出了一種存儲(chǔ)失效檢測(cè)和更新存儲(chǔ)空間的動(dòng)態(tài)E2PROM數(shù)據(jù)存儲(chǔ)策略[1];李維平、張濤等人提出了在E2PROM空間做N次遍歷存儲(chǔ)的方法[2]。本文首先綜合上述兩種方案的優(yōu)點(diǎn),針對(duì)不同更新頻率的變量,進(jìn)一步提出分區(qū)域遍歷輪循的數(shù)據(jù)動(dòng)態(tài)存儲(chǔ)策略,能有效延長(zhǎng)E2PROM的寫(xiě)入壽命。本文最后針對(duì)設(shè)計(jì)一種增量型計(jì)數(shù)器,提出了另一種“寫(xiě)零計(jì)數(shù)”的E2PROM數(shù)據(jù)遍歷輪循存儲(chǔ)策略。
一般情況下,系統(tǒng)的設(shè)計(jì)者會(huì)把數(shù)據(jù)存儲(chǔ)方式設(shè)定為靜態(tài),即為固定的地址存儲(chǔ)指定的變量值。但是,考慮到單片機(jī)內(nèi)部的E2PROM空間相對(duì)于有待保存的數(shù)據(jù)量來(lái)說(shuō)是有很大富余的[1],從而可以用軟件的方法,最大程度地利用E2PROM存儲(chǔ)空間資源,以整體存儲(chǔ)空間的使用壽命來(lái)擴(kuò)展某局部、若干的存儲(chǔ)器單元的使用壽命。所謂遍歷輪循數(shù)據(jù)存儲(chǔ),指的是在設(shè)定區(qū)域內(nèi),將同一變量每一次的更新值,從設(shè)定的存儲(chǔ)區(qū)域起始單元位置開(kāi)始,依次按更新順序逐個(gè)單元地保存,直到最末單元位置,即完成了一次該區(qū)域的遍歷存儲(chǔ)使用,然后又從該區(qū)域起始位置重新輪循。
根據(jù)系統(tǒng)的設(shè)計(jì)要求,大致估計(jì)每個(gè)變量的更新速度,將更新頻繁的若干變量分別預(yù)先分配到不同的遍歷輪循區(qū)域,更新快的設(shè)置較大的遍歷輪循存儲(chǔ)區(qū)域,更新慢的則設(shè)置較小的遍歷輪循存儲(chǔ)區(qū)域。對(duì)于更新很少和不更新的變量或數(shù)據(jù)表,將其設(shè)置在同一片存儲(chǔ)區(qū)域(對(duì)于STC單片機(jī)內(nèi)部集成的E2PROM,可以扇區(qū)為單位劃分存儲(chǔ)區(qū)域)。表1是以ATmega64為例對(duì)其內(nèi)部2KB E2PROM空間分配設(shè)置的一種情形。
表1 ATmega64E2PROM空間某種分配設(shè)置
比如,為保存上表中變量temp的新值,其存儲(chǔ)地址由地址變量addr_temp來(lái)確定,每一次保存完變量temp的值,存儲(chǔ)地址addr_temp加1,指向下一個(gè)存儲(chǔ)地址,指示下一次更新的數(shù)據(jù)放到這個(gè)指定的位置單元,直到更新數(shù)據(jù)寫(xiě)到了這個(gè)區(qū)域的最后一個(gè)字節(jié)。這時(shí)如有更新值需要寫(xiě)入,則對(duì)該區(qū)域執(zhí)行一次擦除操作(每個(gè)位上全部寫(xiě)1),并將addr_temp存儲(chǔ)地址重置為000H,再把更新數(shù)據(jù)寫(xiě)入到存儲(chǔ)單元,然后存儲(chǔ)地址addr_temp加1,如此循環(huán)。
由上述過(guò)程可以看出,將某個(gè)變量和指定的區(qū)域?qū)?yīng),采用軟件的方法重復(fù)使用該區(qū)域的存儲(chǔ)資源,當(dāng)指定區(qū)域各單元都寫(xiě)完一遍后,做一次區(qū)域整體擦除,從而使得原先是一個(gè)單元的寫(xiě)入壽命擴(kuò)展變通為一個(gè)區(qū)域的寫(xiě)入壽命。比如表1中,為變量temp分配了512字節(jié),那么寫(xiě)入壽命擴(kuò)展到了原先靜態(tài)存儲(chǔ)方式的512倍。如此類(lèi)推,可知表1中變量value的寫(xiě)入壽命能擴(kuò)展到1 024倍。程序設(shè)計(jì)者可以根據(jù)變量的實(shí)際可能更新頻率,合理配置E2PROM的存儲(chǔ)區(qū)域空間大小,延長(zhǎng)其寫(xiě)入壽命。
嵌入式系統(tǒng)上電后一般先進(jìn)行自檢和初始化,其中初始化的過(guò)程就包含讀取E2PROM數(shù)據(jù)的操作。那么在使用上述存儲(chǔ)策略的情況下,如何識(shí)別有效的數(shù)據(jù)信息并將更新的地址位置讀取出來(lái)呢?
仍以上述變量temp為例,假設(shè)斷電之前addr_temp指向的存儲(chǔ)地址是45H,那么該區(qū)域地址為44H的單元存儲(chǔ)的是斷電前的最后一個(gè)數(shù)值。由此可以斷定,這個(gè)區(qū)域中,地址為44H的單元之后的值全為擦寫(xiě)后的狀態(tài)值(即為FFH)。由此可以推斷:從指定區(qū)域開(kāi)始單元位置逐個(gè)查找判斷,如果找到FFH值,有可能到達(dá)了斷電前的最后一次更新值的位置。但另一方面,若系統(tǒng)在任何條件下的更新值都不可能是FFH值,則前述推斷成立;但如果之前有更新值可以是FFH值,那么,剛才的結(jié)論無(wú)疑就被推翻了。這種情況下,可以結(jié)合更新數(shù)據(jù)自身的特點(diǎn)設(shè)計(jì)一個(gè)數(shù)據(jù)存儲(chǔ)協(xié)議,比如使用“數(shù)據(jù)字節(jié)+特征字節(jié)”構(gòu)成數(shù)據(jù)包的方式來(lái)存儲(chǔ),如“數(shù)據(jù)字節(jié)+00”。這樣一來(lái),根據(jù)存儲(chǔ)數(shù)據(jù)包的特點(diǎn),將存儲(chǔ)區(qū)數(shù)據(jù)逐個(gè)分包讀取和判斷,當(dāng)讀取到字節(jié)包全為FFH值時(shí),即可確定已找到斷電前的最后一次更新值的地址位置。
存儲(chǔ)變量數(shù)據(jù)到E2PROM的過(guò)程可以設(shè)計(jì)一個(gè)子程序?qū)iT(mén)來(lái)完成這項(xiàng)工作。首先根據(jù)該變量的當(dāng)前存儲(chǔ)地址寫(xiě)入指定值(數(shù)據(jù)包),然后采用地址值自加的方式更新存儲(chǔ)地址指針值,以使其指向下一組數(shù)據(jù)的存儲(chǔ)地址單元。接著判斷該地址是否到達(dá)存儲(chǔ)區(qū)域的最高地址,如果到達(dá),就將地址設(shè)置成該區(qū)域的首字節(jié)的位置,否則就直接返回。該程序結(jié)構(gòu)清晰,編程設(shè)計(jì)也比較簡(jiǎn)單。上述過(guò)程實(shí)現(xiàn)了“分區(qū)域遍歷輪循的數(shù)據(jù)動(dòng)態(tài)存儲(chǔ)”策略,E2PROM數(shù)據(jù)動(dòng)態(tài)存儲(chǔ)模塊程序流程如圖1所示。
圖1 E2PROM數(shù)據(jù)動(dòng)態(tài)存儲(chǔ)模塊程序流程
該存儲(chǔ)策略專(zhuān)門(mén)針對(duì)一種增量型實(shí)時(shí)計(jì)數(shù)和記錄的特例而言,記錄的數(shù)值呈單方向遞增的特點(diǎn)。下面以筆者為某自動(dòng)化生產(chǎn)流水線(xiàn)設(shè)計(jì)的一款產(chǎn)品計(jì)數(shù)器為例進(jìn)行說(shuō)明。該計(jì)數(shù)器連接了一個(gè)傳感器(接近開(kāi)關(guān)),用于檢測(cè)流水線(xiàn)上產(chǎn)品經(jīng)過(guò)計(jì)數(shù)檢測(cè)口的信號(hào)。當(dāng)接收到傳感器下降沿信號(hào)時(shí),系統(tǒng)進(jìn)行加1計(jì)數(shù)。該模塊電路比較簡(jiǎn)單,此處從略。
為了充分利用MCU內(nèi)部的E2PROM存儲(chǔ)器,設(shè)計(jì)中采用了“寫(xiě)零計(jì)數(shù)”方法。假定該計(jì)數(shù)器的記錄上限值是10 000次。一般情況下,E2PROM存儲(chǔ)器出廠(chǎng)時(shí)全部單元的數(shù)據(jù)被設(shè)置為初始態(tài)FFH。軟件設(shè)計(jì)思路如下:首次使用時(shí),系統(tǒng)每檢測(cè)到1次傳感器的下降沿跳變信號(hào),就從存儲(chǔ)器單元的首位依次逐位寫(xiě)0到對(duì)應(yīng)的位上。比如,第一次到了就寫(xiě)FEH,第二次到了就寫(xiě)FCH,然后是F7H、F0H、E0H……(也就是逐次從低到高按位寫(xiě)0)。對(duì)于第一個(gè)字節(jié)來(lái)說(shuō),有8個(gè)位,用第一個(gè)起始字 58更新后,開(kāi)始監(jiān)測(cè)行信號(hào)到達(dá),之后使能/WE,開(kāi)始順序讀取圖像。讀完一幀圖像后關(guān)閉/WE,單片機(jī)使能/RE,開(kāi)始讀取首行圖像中的640個(gè)像素。本文采取邊讀邊處理的方式,較好地解決了一幀圖像多達(dá)3MB的問(wèn)題。點(diǎn)光源標(biāo)桿發(fā)出的紅外光線(xiàn)在圖像上呈現(xiàn)出若干個(gè)光暈區(qū)域,找到光暈中心就可以找到點(diǎn)光源的圖像坐標(biāo),為此在讀取的同時(shí)將各像素點(diǎn)與閾值進(jìn)行比較,小于閾值的為疑似點(diǎn)光源并記錄對(duì)應(yīng)坐標(biāo);當(dāng)讀取完一行像素時(shí),得到的將是一組疑似點(diǎn)光源坐標(biāo)的像素位置,將其進(jìn)行統(tǒng)計(jì)求平均,得出點(diǎn)光源在該行的坐標(biāo),最多12個(gè)字節(jié)(正面標(biāo)桿6個(gè),某側(cè)標(biāo)桿6個(gè)),遠(yuǎn)遠(yuǎn)小于整行640個(gè)字節(jié)。
圖9 程序設(shè)計(jì)流程圖
當(dāng)讀取完一幀像素時(shí),得到最多12×480個(gè)字節(jié),單片機(jī)64KB的容量完全可以存儲(chǔ),最后將行求平均,得出最終的點(diǎn)光源坐標(biāo)。經(jīng)驗(yàn)證,所需總時(shí)間在2.15幀圖像內(nèi)完成。
文中討論了基于FIFO芯片和單片機(jī)實(shí)現(xiàn)的點(diǎn)光源圖像采集系統(tǒng),描述了單目點(diǎn)光源測(cè)距原理、圖像采集系統(tǒng)硬件和軟件設(shè)計(jì)方法,著重介紹了FIFO芯片在圖像采集中的橋梁作用。通過(guò)系統(tǒng)樣機(jī)檢驗(yàn),能夠滿(mǎn)足要求,達(dá)到了預(yù)期效果。
[1]邵貝貝.單片機(jī)嵌入式應(yīng)用的在線(xiàn)開(kāi)發(fā)方法[M].北京:清華大學(xué)出版社,2009.
[2]Freescale Semiconductor.MC9S12DG128Device User Guide[EB/OL].[2011-11].http://www.freescale.com.cn.
[3]OmniVision Technologies.OV7670/OV7171CMOS VGA 圖像傳感器[EB/OL].[2011-11].http://www.ovt.com/technologies/.
[4]Aver Logic.AL422DataSheet[EB/OL].[2011-11].http://www.averlogic.com/.