在一個(gè)單片機(jī)系統(tǒng)中,,往往要求系統(tǒng)能夠?yàn)橛脩舯4嬉恍﹨?shù)或數(shù)值,。這些數(shù)據(jù)被要求在系統(tǒng)斷電后不會(huì)“消失”,,并在下一次開(kāi)機(jī)后能夠被讀取和修改,。
隨著單片機(jī)內(nèi)部集成功能的不斷增加,,使用片外數(shù)據(jù)存儲(chǔ)器的做法逐漸被含有片內(nèi)可擦寫存儲(chǔ)單元的單片機(jī)所取代。早期用戶可將需要保存的數(shù)據(jù)存放在片內(nèi)Flash內(nèi),,但這種做法對(duì)Flash 內(nèi)程序代碼乃至整個(gè)系統(tǒng)存在安全性隱患,,在片內(nèi)集成獨(dú)立的數(shù)據(jù)存儲(chǔ)區(qū)成了單片機(jī)芯片設(shè)計(jì)的必然趨勢(shì)。例如Atmel 公司在AVR 系列單片機(jī)產(chǎn)品中,,就融入了先進(jìn)的E2 PROM 電可擦除技術(shù),,使該公司的單片機(jī)具備了優(yōu)秀的品質(zhì),在結(jié)構(gòu),、性能和功能等方面都有明顯的優(yōu)勢(shì),。但不管是將數(shù)據(jù)保存在Flash 內(nèi)還是保存在E2PROM 內(nèi),都存在一個(gè)存儲(chǔ)單元可擦寫次數(shù)的上限,。通常芯片廠家標(biāo)明的是1 000 000 次以上;而對(duì)于單片機(jī)系統(tǒng)的設(shè)計(jì)者來(lái)說(shuō),,有部分保存在E2PROM 內(nèi)的數(shù)據(jù)在系統(tǒng)運(yùn)行過(guò)程中是需要被頻繁擦寫的。當(dāng)存放這些數(shù)據(jù)的片內(nèi)存儲(chǔ)單元達(dá)到擦寫次數(shù)上限時(shí),,這個(gè)存儲(chǔ)單元就不能再使用了,,從而會(huì)導(dǎo)致系統(tǒng)出現(xiàn)故障。
另外,,單片機(jī)內(nèi)部的E2PROM 空間相對(duì)于有待保存的數(shù)據(jù)量來(lái)說(shuō)是有很大富余的,。也就是說(shuō),當(dāng)單片機(jī)由于
內(nèi)部E2PROM 擦寫次數(shù)超過(guò)極限而不能正常工作時(shí),,片內(nèi)仍然有較多的E2PROM 空間沒(méi)有被利用過(guò),,因而產(chǎn)生單片機(jī)內(nèi)部資源的極大浪費(fèi)。
本文以AVR 系列單片機(jī)中的ATmega8 為例,,從程序設(shè)計(jì)角度出發(fā),,提出一種切實(shí)可行的E2PROM 數(shù)據(jù)存儲(chǔ)策略,最大限度地提高片內(nèi)E2 PROM 空間的利用率,,從而解決上面提到的問(wèn)題,。
1、E2PROM數(shù)據(jù)動(dòng)態(tài)存儲(chǔ)的基本要求
一般,,把數(shù)據(jù)存儲(chǔ)方式設(shè)定為靜態(tài),,即為固定的地址指定惟一的變量,任何時(shí)候讀取和改寫此地址內(nèi)數(shù)據(jù)的操作均視為對(duì)該變量的讀取和改寫,。然而這樣的存儲(chǔ)方式若被用于E2PROM 內(nèi)的數(shù)據(jù)存儲(chǔ),當(dāng)E2PROM 的某一單元因過(guò)量擦寫而失效后,,這個(gè)固定地址內(nèi)所存放的變量就失去了有效的對(duì)應(yīng)物理空間,,這是在做E2PROM 數(shù)據(jù)存儲(chǔ)時(shí)不愿意看到的。
解決上述問(wèn)題的有效方法是對(duì)E2PROM 數(shù)據(jù)實(shí)行動(dòng)態(tài)存儲(chǔ),。其基本要求和目標(biāo)是:
?、?在整個(gè)系統(tǒng)使用壽命內(nèi),,使E2PROM 空間得到最大利用;
② 系統(tǒng)能夠辨別不能使用的E2PROM 單元,,從而保障數(shù)據(jù)安全,。
2 、策略分析
為方便敘述,,將整個(gè)E2PROM 空間分為以下幾個(gè)部分:統(tǒng)稱已經(jīng)分配給用戶使用的地址連續(xù)的E2PROM 區(qū)
域?yàn)?ldquo;占用塊”;稱未曾分配的地址連續(xù)的E2PROM 區(qū)域?yàn)?ldquo;可利用塊”或“空閑塊”,。另外,為記錄占用塊的使用情況,,還要在E2PROM 內(nèi)劃定一個(gè)地址連續(xù)的區(qū)域作為“目錄表”,。這個(gè)目錄表記錄的是占用塊中實(shí)際占用空間的地址。與此對(duì)應(yīng)的,, 占用塊中另外的部分就是廢棄空間(單元) ,。
采取這樣的策略,在高地址的空閑塊中先放入目錄表,。該目錄表的大小決定于占用塊中實(shí)際占用單元的多少,,目錄表記錄實(shí)際占用單元的地址;占用塊從低地址的空閑塊開(kāi)始分配,系統(tǒng)不再回收已經(jīng)分配的占用塊,,一直到占用塊中出現(xiàn)廢棄單元,,系統(tǒng)就為其把現(xiàn)有的占用塊擴(kuò)大,同時(shí)修改目錄表中的相關(guān)地址信息,。
在系統(tǒng)運(yùn)行初期,,如果地址信息與數(shù)據(jù)信息同類型,那么占用塊和目錄表所占空間大小是一樣的,,且目錄表是
一個(gè)低地址的序列,。如圖1 所示,如果單片機(jī)內(nèi)有N個(gè)E2PROM 存儲(chǔ)單元內(nèi),,則在高地址開(kāi)辟一個(gè)目錄表空間,,記錄m 個(gè)實(shí)際占用單元的地址,即0 ,,1 ,,2 , …,,m-1 ,。
當(dāng)系統(tǒng)運(yùn)行到一定時(shí)間后,占用塊中的某一個(gè)單元會(huì)因?yàn)镋2PROM 數(shù)據(jù)擦寫次數(shù)超過(guò)限次而失效被廢棄,,不妨假設(shè)這個(gè)單元地址是002H ,,那么,系統(tǒng)就開(kāi)始查找當(dāng)前目錄表中所記錄的最大地址值,如圖2 所示,。這個(gè)最大地址值加1 ,,便是為廢棄單元在空閑塊重新分配單元的地址,這里是(m-1)+1 = m,。同時(shí),,目錄表所記錄的該內(nèi)容的地址也做出相應(yīng)修改。
可以預(yù)想的是,,接著系統(tǒng)在一定時(shí)間后,,會(huì)出現(xiàn)第2個(gè)廢棄單元,假設(shè)這個(gè)單元地址是000H,。依次類推,,如圖3 所示,系統(tǒng)會(huì)為D0 分配地址m+1 所指向的空間,,同時(shí)目錄表內(nèi)原先表示D0 所在的地址值會(huì)被更改為m+1 ,。
隨著E2PROM 內(nèi)廢棄單元的逐漸增加,空閑塊的大小不斷縮小,。當(dāng)出現(xiàn)新的廢棄單元而沒(méi)有空閑塊可以利用時(shí),,系統(tǒng)會(huì)出現(xiàn)故障。采用這樣的策略后,,相對(duì)于首次出現(xiàn)廢棄單元系統(tǒng)便被摧毀來(lái)說(shuō),,實(shí)際上這個(gè)出現(xiàn)故障的時(shí)間已經(jīng)被大大延緩了。
設(shè)Di 在固定E2 PROM 單元可存放的壽命為ti ,。這個(gè)值與系統(tǒng)中要求Di 被修改的平均次數(shù)有關(guān),,其中i = 0 ,1 ,,2 ,, …, m - 1 ,。
在一個(gè)單片機(jī)系統(tǒng)中,,往往要求系統(tǒng)能夠?yàn)橛脩舯4嬉恍﹨?shù)或數(shù)值。這些數(shù)據(jù)被要求在系統(tǒng)斷電后不會(huì)“消失”,,并在下一次開(kāi)機(jī)后能夠被讀取和修改,。
隨著單片機(jī)內(nèi)部集成功能的不斷增加,使用片外數(shù)據(jù)存儲(chǔ)器的做法逐漸被含有片內(nèi)可擦寫存儲(chǔ)單元的單片機(jī)所取代,。早期用戶可將需要保存的數(shù)據(jù)存放在片內(nèi)Flash內(nèi),,但這種做法對(duì)Flash 內(nèi)程序代碼乃至整個(gè)系統(tǒng)存在安全性隱患,在片內(nèi)集成獨(dú)立的數(shù)據(jù)存儲(chǔ)區(qū)成了單片機(jī)芯片設(shè)計(jì)的必然趨勢(shì),。例如Atmel 公司在AVR 系列單片機(jī)產(chǎn)品中,,就融入了先進(jìn)的E2 PROM 電可擦除技術(shù),,使該公司的單片機(jī)具備了優(yōu)秀的品質(zhì),在結(jié)構(gòu),、性能和功能等方面都有明顯的優(yōu)勢(shì)。但不管是將數(shù)據(jù)保存在Flash 內(nèi)還是保存在E2PROM 內(nèi),,都存在一個(gè)存儲(chǔ)單元可擦寫次數(shù)的上限,。通常芯片廠家標(biāo)明的是1 000 000 次以上;而對(duì)于單片機(jī)系統(tǒng)的設(shè)計(jì)者來(lái)說(shuō),有部分保存在E2PROM 內(nèi)的數(shù)據(jù)在系統(tǒng)運(yùn)行過(guò)程中是需要被頻繁擦寫的,。當(dāng)存放這些數(shù)據(jù)的片內(nèi)存儲(chǔ)單元達(dá)到擦寫次數(shù)上限時(shí),,這個(gè)存儲(chǔ)單元就不能再使用了,從而會(huì)導(dǎo)致系統(tǒng)出現(xiàn)故障,。
另外,,單片機(jī)內(nèi)部的E2PROM 空間相對(duì)于有待保存的數(shù)據(jù)量來(lái)說(shuō)是有很大富余的。也就是說(shuō),,當(dāng)單片機(jī)由于
內(nèi)部E2PROM 擦寫次數(shù)超過(guò)極限而不能正常工作時(shí),,片內(nèi)仍然有較多的E2PROM 空間沒(méi)有被利用過(guò),因而產(chǎn)生單片機(jī)內(nèi)部資源的極大浪費(fèi),。
本文以AVR 系列單片機(jī)中的ATmega8 為例,,從程序設(shè)計(jì)角度出發(fā),提出一種切實(shí)可行的E2PROM 數(shù)據(jù)存儲(chǔ)策略,,最大限度地提高片內(nèi)E2 PROM 空間的利用率,,從而解決上面提到的問(wèn)題。
1,、E2PROM數(shù)據(jù)動(dòng)態(tài)存儲(chǔ)的基本要求
一般,,把數(shù)據(jù)存儲(chǔ)方式設(shè)定為靜態(tài),即為固定的地址指定惟一的變量,,任何時(shí)候讀取和改寫此地址內(nèi)數(shù)據(jù)的操作均視為對(duì)該變量的讀取和改寫,。然而這樣的存儲(chǔ)方式若被用于E2PROM 內(nèi)的數(shù)據(jù)存儲(chǔ),當(dāng)E2PROM 的某一單元因過(guò)量擦寫而失效后,,這個(gè)固定地址內(nèi)所存放的變量就失去了有效的對(duì)應(yīng)物理空間,,這是在做E2PROM 數(shù)據(jù)存儲(chǔ)時(shí)不愿意看到的。
解決上述問(wèn)題的有效方法是對(duì)E2PROM 數(shù)據(jù)實(shí)行動(dòng)態(tài)存儲(chǔ),。其基本要求和目標(biāo)是:
?、?在整個(gè)系統(tǒng)使用壽命內(nèi),使E2PROM 空間得到最大利用;
?、?系統(tǒng)能夠辨別不能使用的E2PROM 單元,,從而保障數(shù)據(jù)安全。
2 ,、策略分析
為方便敘述,,將整個(gè)E2PROM 空間分為以下幾個(gè)部分:統(tǒng)稱已經(jīng)分配給用戶使用的地址連續(xù)的E2PROM 區(qū)
域?yàn)?ldquo;占用塊”;稱未曾分配的地址連續(xù)的E2PROM 區(qū)域?yàn)?ldquo;可利用塊”或“空閑塊”,。另外,為記錄占用塊的使用情況,,還要在E2PROM 內(nèi)劃定一個(gè)地址連續(xù)的區(qū)域作為“目錄表”,。這個(gè)目錄表記錄的是占用塊中實(shí)際占用空間的地址。與此對(duì)應(yīng)的,, 占用塊中另外的部分就是廢棄空間(單元) ,。
采取這樣的策略,在高地址的空閑塊中先放入目錄表,。該目錄表的大小決定于占用塊中實(shí)際占用單元的多少,,目錄表記錄實(shí)際占用單元的地址;占用塊從低地址的空閑塊開(kāi)始分配,系統(tǒng)不再回收已經(jīng)分配的占用塊,,一直到占用塊中出現(xiàn)廢棄單元,,系統(tǒng)就為其把現(xiàn)有的占用塊擴(kuò)大,同時(shí)修改目錄表中的相關(guān)地址信息,。
在系統(tǒng)運(yùn)行初期,,如果地址信息與數(shù)據(jù)信息同類型,那么占用塊和目錄表所占空間大小是一樣的,,且目錄表是
一個(gè)低地址的序列,。如圖1 所示,如果單片機(jī)內(nèi)有N個(gè)E2PROM 存儲(chǔ)單元內(nèi),,則在高地址開(kāi)辟一個(gè)目錄表空間,,記錄m 個(gè)實(shí)際占用單元的地址,即0 ,,1 ,,2 , …,,m-1 ,。
當(dāng)系統(tǒng)運(yùn)行到一定時(shí)間后,占用塊中的某一個(gè)單元會(huì)因?yàn)镋2PROM 數(shù)據(jù)擦寫次數(shù)超過(guò)限次而失效被廢棄,,不妨假設(shè)這個(gè)單元地址是002H ,,那么,系統(tǒng)就開(kāi)始查找當(dāng)前目錄表中所記錄的最大地址值,,如圖2 所示,。這個(gè)最大地址值加1 ,便是為廢棄單元在空閑塊重新分配單元的地址,,這里是(m-1)+1 = m,。同時(shí),目錄表所記錄的該內(nèi)容的地址也做出相應(yīng)修改,。
可以預(yù)想的是,,接著系統(tǒng)在一定時(shí)間后,,會(huì)出現(xiàn)第2個(gè)廢棄單元,假設(shè)這個(gè)單元地址是000H,。依次類推,,如圖3 所示,系統(tǒng)會(huì)為D0 分配地址m+1 所指向的空間,,同時(shí)目錄表內(nèi)原先表示D0 所在的地址值會(huì)被更改為m+1 ,。
隨著E2PROM 內(nèi)廢棄單元的逐漸增加,空閑塊的大小不斷縮小,。當(dāng)出現(xiàn)新的廢棄單元而沒(méi)有空閑塊可以利用時(shí),系統(tǒng)會(huì)出現(xiàn)故障,。采用這樣的策略后,,相對(duì)于首次出現(xiàn)廢棄單元系統(tǒng)便被摧毀來(lái)說(shuō),實(shí)際上這個(gè)出現(xiàn)故障的時(shí)間已經(jīng)被大大延緩了,。
設(shè)Di 在固定E2 PROM 單元可存放的壽命為ti ,。這個(gè)值與系統(tǒng)中要求Di 被修改的平均次數(shù)有關(guān),其中i = 0 ,,1 ,,2 , …,, m - 1 ,。
3、實(shí)現(xiàn)流程
圖4 為實(shí)現(xiàn)上述策略的程序流程,。
在每一次E2PROM 數(shù)據(jù)存儲(chǔ)的過(guò)程中,,首先都需要從目錄表中查找該數(shù)據(jù)在占用塊內(nèi)的地址add[ i ] ,然后將新數(shù)據(jù)D[i]寫入該地址,。單從算法的角度考慮,,認(rèn)為不存在寫失敗或讀失敗的情況,那么隨后將寫好的數(shù)據(jù)再讀出,,通過(guò)驗(yàn)證數(shù)據(jù)的正確性就可以判別該占用單元是不是應(yīng)該廢棄,。如果驗(yàn)證通過(guò),修改操作完成;如果驗(yàn)證沒(méi)有通過(guò),,則廢棄該地址空間,,并通過(guò)查詢目錄表,向后開(kāi)辟新的占用單元,,之后重復(fù)存儲(chǔ)過(guò)程,。
4、示例
AVR 單片機(jī)在片內(nèi)集成了可以擦寫1 000 000 次的E2PROM 數(shù)據(jù)存儲(chǔ)器,,用于保存系統(tǒng)的設(shè)定參數(shù),、固定表格和掉電后的數(shù)據(jù)保存,,方便使用,減少系統(tǒng)的空間,,又大大提高了系統(tǒng)的保密性,。下面以AVR 系列中的ATmega8為例,介紹上述的E2 PROM 動(dòng)態(tài)存儲(chǔ)策略的C語(yǔ)言程序?qū)崿F(xiàn),。
結(jié) 語(yǔ)
集成獨(dú)立E2 PROM 數(shù)據(jù)存儲(chǔ)器是單片機(jī)設(shè)計(jì)的必然發(fā)展趨勢(shì),。對(duì)于單片機(jī)的用戶來(lái)說(shuō),怎樣更合理,、更科學(xué)地利用好單片機(jī)的這些內(nèi)部資源,,需要不斷地探索和總結(jié)。本文在這方面作了一些努力和有益的嘗試,。