《電子技術應用》
您所在的位置:首頁 > 微波|射頻 > 設計應用 > 基于AVR的E2PROM的數(shù)據(jù)動態(tài)存儲策略
基于AVR的E2PROM的數(shù)據(jù)動態(tài)存儲策略
摘要: 本文以AVR系列單片機中的ATmega8為例,從程序設計角度出發(fā),,提出一種切實可行的E2PROM數(shù)據(jù)存儲策略,,最大限度地提高片內E2PROM空間的利用率,從而解決上面提到的問題,。
Abstract:
Key words :

  在一個單片機系統(tǒng)中,,往往要求系統(tǒng)能夠為用戶保存一些參數(shù)或數(shù)值。這些數(shù)據(jù)被要求在系統(tǒng)斷電后不會“消失”,,并在下一次開機后能夠被讀取和修改,。

  隨著單片機內部集成功能的不斷增加,,使用片外數(shù)據(jù)存儲器的做法逐漸被含有片內可擦寫存儲單元的單片機所取代。早期用戶可將需要保存的數(shù)據(jù)存放在片內Flash內,,但這種做法對Flash 內程序代碼乃至整個系統(tǒng)存在安全性隱患,,在片內集成獨立的數(shù)據(jù)存儲區(qū)成了單片機芯片設計的必然趨勢。例如Atmel 公司在AVR 系列單片機產(chǎn)品中,,就融入了先進的E2 PROM 電可擦除技術,,使該公司的單片機具備了優(yōu)秀的品質,在結構,、性能和功能等方面都有明顯的優(yōu)勢,。但不管是將數(shù)據(jù)保存在Flash 內還是保存在E2PROM 內,都存在一個存儲單元可擦寫次數(shù)的上限,。通常芯片廠家標明的是1 000 000 次以上;而對于單片機系統(tǒng)的設計者來說,,有部分保存在E2PROM 內的數(shù)據(jù)在系統(tǒng)運行過程中是需要被頻繁擦寫的。當存放這些數(shù)據(jù)的片內存儲單元達到擦寫次數(shù)上限時,,這個存儲單元就不能再使用了,,從而會導致系統(tǒng)出現(xiàn)故障。

  另外,,單片機內部的E2PROM 空間相對于有待保存的數(shù)據(jù)量來說是有很大富余的,。也就是說,當單片機由于

  內部E2PROM 擦寫次數(shù)超過極限而不能正常工作時,,片內仍然有較多的E2PROM 空間沒有被利用過,,因而產(chǎn)生單片機內部資源的極大浪費。

  本文以AVR 系列單片機中的ATmega8 為例,,從程序設計角度出發(fā),,提出一種切實可行的E2PROM 數(shù)據(jù)存儲策略,最大限度地提高片內E2 PROM 空間的利用率,,從而解決上面提到的問題,。

  1、E2PROM數(shù)據(jù)動態(tài)存儲的基本要求

  一般,,把數(shù)據(jù)存儲方式設定為靜態(tài),,即為固定的地址指定惟一的變量,任何時候讀取和改寫此地址內數(shù)據(jù)的操作均視為對該變量的讀取和改寫,。然而這樣的存儲方式若被用于E2PROM 內的數(shù)據(jù)存儲,,當E2PROM 的某一單元因過量擦寫而失效后,這個固定地址內所存放的變量就失去了有效的對應物理空間,,這是在做E2PROM 數(shù)據(jù)存儲時不愿意看到的,。

  解決上述問題的有效方法是對E2PROM 數(shù)據(jù)實行動態(tài)存儲。其基本要求和目標是:

 ?、?在整個系統(tǒng)使用壽命內,,使E2PROM 空間得到最大利用;

 ?、?系統(tǒng)能夠辨別不能使用的E2PROM 單元,從而保障數(shù)據(jù)安全,。

  2 ,、策略分析

  為方便敘述,將整個E2PROM 空間分為以下幾個部分:統(tǒng)稱已經(jīng)分配給用戶使用的地址連續(xù)的E2PROM 區(qū)

  域為“占用塊”;稱未曾分配的地址連續(xù)的E2PROM 區(qū)域為“可利用塊”或“空閑塊”,。另外,,為記錄占用塊的使用情況,還要在E2PROM 內劃定一個地址連續(xù)的區(qū)域作為“目錄表”,。這個目錄表記錄的是占用塊中實際占用空間的地址,。與此對應的, 占用塊中另外的部分就是廢棄空間(單元) ,。

  采取這樣的策略,,在高地址的空閑塊中先放入目錄表。該目錄表的大小決定于占用塊中實際占用單元的多少,,目錄表記錄實際占用單元的地址;占用塊從低地址的空閑塊開始分配,系統(tǒng)不再回收已經(jīng)分配的占用塊,,一直到占用塊中出現(xiàn)廢棄單元,,系統(tǒng)就為其把現(xiàn)有的占用塊擴大,同時修改目錄表中的相關地址信息,。

  在系統(tǒng)運行初期,,如果地址信息與數(shù)據(jù)信息同類型,那么占用塊和目錄表所占空間大小是一樣的,,且目錄表是

  一個低地址的序列,。如圖1 所示,如果單片機內有N個E2PROM 存儲單元內,,則在高地址開辟一個目錄表空間,,記錄m 個實際占用單元的地址,即0 ,,1 ,,2 , …,,m-1 ,。

  

  當系統(tǒng)運行到一定時間后,占用塊中的某一個單元會因為E2PROM 數(shù)據(jù)擦寫次數(shù)超過限次而失效被廢棄,,不妨假設這個單元地址是002H ,,那么,系統(tǒng)就開始查找當前目錄表中所記錄的最大地址值,,如圖2 所示,。這個最大地址值加1 ,,便是為廢棄單元在空閑塊重新分配單元的地址,這里是(m-1)+1 = m,。同時,,目錄表所記錄的該內容的地址也做出相應修改。

  

  可以預想的是,,接著系統(tǒng)在一定時間后,,會出現(xiàn)第2個廢棄單元,假設這個單元地址是000H,。依次類推,,如圖3 所示,系統(tǒng)會為D0 分配地址m+1 所指向的空間,,同時目錄表內原先表示D0 所在的地址值會被更改為m+1 ,。

  

  隨著E2PROM 內廢棄單元的逐漸增加,空閑塊的大小不斷縮小,。當出現(xiàn)新的廢棄單元而沒有空閑塊可以利用時,,系統(tǒng)會出現(xiàn)故障。采用這樣的策略后,,相對于首次出現(xiàn)廢棄單元系統(tǒng)便被摧毀來說,,實際上這個出現(xiàn)故障的時間已經(jīng)被大大延緩了。

  設Di 在固定E2 PROM 單元可存放的壽命為ti ,。這個值與系統(tǒng)中要求Di 被修改的平均次數(shù)有關,,其中i = 0 ,1 ,,2 ,, …, m - 1 ,。

  

  

  在一個單片機系統(tǒng)中,,往往要求系統(tǒng)能夠為用戶保存一些參數(shù)或數(shù)值。這些數(shù)據(jù)被要求在系統(tǒng)斷電后不會“消失”,,并在下一次開機后能夠被讀取和修改,。

  隨著單片機內部集成功能的不斷增加,使用片外數(shù)據(jù)存儲器的做法逐漸被含有片內可擦寫存儲單元的單片機所取代,。早期用戶可將需要保存的數(shù)據(jù)存放在片內Flash內,,但這種做法對Flash 內程序代碼乃至整個系統(tǒng)存在安全性隱患,在片內集成獨立的數(shù)據(jù)存儲區(qū)成了單片機芯片設計的必然趨勢,。例如Atmel 公司在AVR 系列單片機產(chǎn)品中,,就融入了先進的E2 PROM 電可擦除技術,使該公司的單片機具備了優(yōu)秀的品質,在結構,、性能和功能等方面都有明顯的優(yōu)勢,。但不管是將數(shù)據(jù)保存在Flash 內還是保存在E2PROM 內,都存在一個存儲單元可擦寫次數(shù)的上限,。通常芯片廠家標明的是1 000 000 次以上;而對于單片機系統(tǒng)的設計者來說,,有部分保存在E2PROM 內的數(shù)據(jù)在系統(tǒng)運行過程中是需要被頻繁擦寫的。當存放這些數(shù)據(jù)的片內存儲單元達到擦寫次數(shù)上限時,,這個存儲單元就不能再使用了,,從而會導致系統(tǒng)出現(xiàn)故障。

  另外,,單片機內部的E2PROM 空間相對于有待保存的數(shù)據(jù)量來說是有很大富余的,。也就是說,當單片機由于

  內部E2PROM 擦寫次數(shù)超過極限而不能正常工作時,,片內仍然有較多的E2PROM 空間沒有被利用過,,因而產(chǎn)生單片機內部資源的極大浪費。

  本文以AVR 系列單片機中的ATmega8 為例,,從程序設計角度出發(fā),,提出一種切實可行的E2PROM 數(shù)據(jù)存儲策略,最大限度地提高片內E2 PROM 空間的利用率,,從而解決上面提到的問題,。

  1、E2PROM數(shù)據(jù)動態(tài)存儲的基本要求

  一般,,把數(shù)據(jù)存儲方式設定為靜態(tài),即為固定的地址指定惟一的變量,,任何時候讀取和改寫此地址內數(shù)據(jù)的操作均視為對該變量的讀取和改寫,。然而這樣的存儲方式若被用于E2PROM 內的數(shù)據(jù)存儲,當E2PROM 的某一單元因過量擦寫而失效后,,這個固定地址內所存放的變量就失去了有效的對應物理空間,,這是在做E2PROM 數(shù)據(jù)存儲時不愿意看到的。

  解決上述問題的有效方法是對E2PROM 數(shù)據(jù)實行動態(tài)存儲,。其基本要求和目標是:

 ?、?在整個系統(tǒng)使用壽命內,使E2PROM 空間得到最大利用;

 ?、?系統(tǒng)能夠辨別不能使用的E2PROM 單元,,從而保障數(shù)據(jù)安全。

  2 ,、策略分析

  為方便敘述,,將整個E2PROM 空間分為以下幾個部分:統(tǒng)稱已經(jīng)分配給用戶使用的地址連續(xù)的E2PROM 區(qū)

  域為“占用塊”;稱未曾分配的地址連續(xù)的E2PROM 區(qū)域為“可利用塊”或“空閑塊”。另外,為記錄占用塊的使用情況,,還要在E2PROM 內劃定一個地址連續(xù)的區(qū)域作為“目錄表”,。這個目錄表記錄的是占用塊中實際占用空間的地址。與此對應的,, 占用塊中另外的部分就是廢棄空間(單元) ,。

  采取這樣的策略,在高地址的空閑塊中先放入目錄表,。該目錄表的大小決定于占用塊中實際占用單元的多少,,目錄表記錄實際占用單元的地址;占用塊從低地址的空閑塊開始分配,系統(tǒng)不再回收已經(jīng)分配的占用塊,,一直到占用塊中出現(xiàn)廢棄單元,,系統(tǒng)就為其把現(xiàn)有的占用塊擴大,同時修改目錄表中的相關地址信息,。

  在系統(tǒng)運行初期,,如果地址信息與數(shù)據(jù)信息同類型,那么占用塊和目錄表所占空間大小是一樣的,,且目錄表是

  一個低地址的序列,。如圖1 所示,如果單片機內有N個E2PROM 存儲單元內,,則在高地址開辟一個目錄表空間,,記錄m 個實際占用單元的地址,即0 ,,1 ,,2 , …,,m-1 ,。

  

  當系統(tǒng)運行到一定時間后,占用塊中的某一個單元會因為E2PROM 數(shù)據(jù)擦寫次數(shù)超過限次而失效被廢棄,,不妨假設這個單元地址是002H ,,那么,系統(tǒng)就開始查找當前目錄表中所記錄的最大地址值,,如圖2 所示,。這個最大地址值加1 ,便是為廢棄單元在空閑塊重新分配單元的地址,,這里是(m-1)+1 = m,。同時,目錄表所記錄的該內容的地址也做出相應修改,。

  

  可以預想的是,,接著系統(tǒng)在一定時間后,會出現(xiàn)第2個廢棄單元,假設這個單元地址是000H,。依次類推,,如圖3 所示,系統(tǒng)會為D0 分配地址m+1 所指向的空間,,同時目錄表內原先表示D0 所在的地址值會被更改為m+1 ,。

  

  隨著E2PROM 內廢棄單元的逐漸增加,空閑塊的大小不斷縮小,。當出現(xiàn)新的廢棄單元而沒有空閑塊可以利用時,,系統(tǒng)會出現(xiàn)故障。采用這樣的策略后,,相對于首次出現(xiàn)廢棄單元系統(tǒng)便被摧毀來說,,實際上這個出現(xiàn)故障的時間已經(jīng)被大大延緩了。

  設Di 在固定E2 PROM 單元可存放的壽命為ti ,。這個值與系統(tǒng)中要求Di 被修改的平均次數(shù)有關,,其中i = 0 ,1 ,,2 ,, …, m - 1 ,。

  

  

  3,、實現(xiàn)流程

  圖4 為實現(xiàn)上述策略的程序流程。

  

  在每一次E2PROM 數(shù)據(jù)存儲的過程中,,首先都需要從目錄表中查找該數(shù)據(jù)在占用塊內的地址add[ i ] ,,然后將新數(shù)據(jù)D[i]寫入該地址。單從算法的角度考慮,,認為不存在寫失敗或讀失敗的情況,,那么隨后將寫好的數(shù)據(jù)再讀出,通過驗證數(shù)據(jù)的正確性就可以判別該占用單元是不是應該廢棄,。如果驗證通過,修改操作完成;如果驗證沒有通過,,則廢棄該地址空間,,并通過查詢目錄表,向后開辟新的占用單元,,之后重復存儲過程,。

  4、示例

  AVR 單片機在片內集成了可以擦寫1 000 000 次的E2PROM 數(shù)據(jù)存儲器,,用于保存系統(tǒng)的設定參數(shù),、固定表格和掉電后的數(shù)據(jù)保存,方便使用,減少系統(tǒng)的空間,,又大大提高了系統(tǒng)的保密性,。下面以AVR 系列中的ATmega8為例,介紹上述的E2 PROM 動態(tài)存儲策略的C語言程序實現(xiàn),。

  

  

  結 語

  集成獨立E2 PROM 數(shù)據(jù)存儲器是單片機設計的必然發(fā)展趨勢,。對于單片機的用戶來說,怎樣更合理,、更科學地利用好單片機的這些內部資源,,需要不斷地探索和總結。本文在這方面作了一些努力和有益的嘗試,。

此內容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權禁止轉載。