<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > MAXQ環(huán)境下EEPROM的保護措施

MAXQ環(huán)境下EEPROM的保護措施

——
作者: 時(shí)間:2007-01-26 來(lái)源:《Maxim公司》 收藏
介紹
在嵌入式微控制器應用中,通常都要用到非易失性存儲器。無(wú)論是掉電時(shí)維持需要保存的設置,還是存儲公司的重要記錄,可靠的非易失性存儲器都是現代微控制器領(lǐng)域的一個(gè)基本單元。
非易失性存儲常常采用外部串行存儲器實(shí)現。多年以來(lái),該領(lǐng)域用到了數十億顆類(lèi)似存儲器件,它們的可靠性得到了的廣泛認可。目前,存儲器可以做到幾百字節到1兆字節甚至更大的容量,在每一個(gè)需要保持設置的設備中,都能找到這樣一個(gè)緊湊、廉價(jià)的器件。

包括eeprom、閃存和旋轉式存儲器在內,所有類(lèi)型的非易失性存儲器都面臨一個(gè)共同的問(wèn)題:寫(xiě)周期被中斷時(shí),數據會(huì )丟失。一旦在寫(xiě)周期執行過(guò)程中掉電,那么即使再恢復電源,也很難修復損壞的數據。 本文提出了一種基于事務(wù)的提交-回退機制,用于保護一個(gè)外部串行eeprom存儲器件的內容。這些措施同樣適用于大多數maxq微控制器的內置eeprom??梢韵螺d本應用的代碼文件(zip,20.5kb)。

本文引用地址:http://dyxdggzs.com/article/21551.htm


i2c eeprom的特點(diǎn)
串行存儲器件有多種接口,但最常用的接口是i2c接口。這種總線(xiàn)接口有很多優(yōu)點(diǎn):高度標準化的接口;控制器和存儲器之間只需兩條線(xiàn);而且具有靈活的時(shí)序要求,可以由軟件驅動(dòng)。一個(gè)i2c主機可以驅動(dòng)很多i2c從機,從而最大程度減少了主機的引腳數。
在所有eeprom器件中,寫(xiě)周期都要比讀周期長(cháng)的多。因為在寫(xiě)周期過(guò)程中,電荷需要借助隧道效應并通過(guò)絕緣層進(jìn)行轉移,而這個(gè)過(guò)程很費時(shí)間。雖然增加電壓可以加快這個(gè)過(guò)程,但是過(guò)高的電壓會(huì )導致絕緣層的介質(zhì)擊穿,從而損壞器件。典型的eeprom器件寫(xiě)周期持續10毫秒左右;而讀周期通常需要幾百個(gè)納秒。

為了顯著(zhù)縮短寫(xiě)周期的時(shí)間,許多i2c eeprom器件采用頁(yè)面模式。該模式允許將多個(gè)字節傳送到緩存中,然后將數據一次性寫(xiě)入存儲區。i2c存儲器件的典型頁(yè)面尺寸為32字節。因此,可以在一個(gè)寫(xiě)周期內向eeprom填入32個(gè)字節。

這一點(diǎn)非常重要,因為串行eeprom器件都具有特定的耐久度:即每個(gè)頁(yè)面所能承受的寫(xiě)周期次數上限。典型的寫(xiě)周期次數從10,000到1,000,000次。然而,即使存儲器件能夠承受1百萬(wàn)次寫(xiě)周期,軟件也會(huì )很快將其損耗殆盡。軟件每秒僅執行100次寫(xiě)周期,那么不到3個(gè)小時(shí)就會(huì )耗盡器件的寫(xiě)周期次數。

考慮到這些基本的eeprom特性,設計者為一個(gè)嵌入式處理器設計可靠的非易失存儲系統時(shí),需切記以下幾點(diǎn):

不要在同一頁(yè)面上反復執行寫(xiě)操作。尤其是不要將某個(gè)頁(yè)面設置成寫(xiě)入任何其它頁(yè)面時(shí)都要更新的“目錄”。
如果在寫(xiě)周期過(guò)程中電源被中斷,必須提供以下機制:(1) 檢測被中斷的寫(xiě)操作;(2) 完成被中斷的操作;(3) 或者將事件回退至寫(xiě)操作之前的狀態(tài)。
必須通過(guò)某些數據校驗機制(校驗和、crc或消息摘要)來(lái)保證數據的完整性。

設計目標
雖然上面提到的eeprom問(wèn)題可通過(guò)多種非易失文件系統加以解決,但這樣的文件機制對于小型嵌入式微控制器來(lái)說(shuō)負擔過(guò)重。很多文件系統需要更多的ram,遠遠超出了小型微控制器所能提供的容量,而且對于多數應用,也不需要一個(gè)完整的文件系統。
考慮到這一點(diǎn),下面列出了eeprom數據保護機制的設計目標:

精簡(jiǎn):保護機制用于存儲校驗數據的空間不應超過(guò)eeprom的10%,它應該只需要少量的計算開(kāi)銷(xiāo)。
塊大?。罕槐Wo的塊大小,應該和eeprom的寫(xiě)操作頁(yè)面大小一樣。由于eeprom器件的頁(yè)面大小通常是2的偶數次冪,因此與每個(gè)塊保留1或2個(gè)字節的做法相比,相同的尺寸大小更便于軟件編碼。
耐久性:每個(gè)保護周期不要對同一頁(yè)面進(jìn)行寫(xiě)操作。
可靠性:每次掉電情況下,數據都應是可恢復的。
這里提到的保護機制有6個(gè)接口函數:讀、寫(xiě)、提交、回退、檢查和清理。

讀函數接收一個(gè)塊編號和一個(gè)指向32字節緩存的指針。如果緩存地址和塊編號處于有效范圍內,程序就會(huì )將指定的塊數據讀入緩存,并校驗數據的有效性。它會(huì )返回如下?tīng)顟B(tài):有效讀(valid read)、無(wú)效讀(invalid read)、無(wú)效緩存地址(invalid buffer address)、無(wú)效頁(yè)面編號(invalid page number)或保護失敗(protection failure)。

寫(xiě)函數接收一個(gè)塊編號和一個(gè)指向填好數據的32字節緩存的指針。如果緩存地址和塊編號處于有效范圍內,程序就會(huì )將數據寫(xiě)入非易失性緩存,并標記緩存狀態(tài)以準備提交。

提交和回退函數,是可以在寫(xiě)操作之后執行的互補型操作。提交函數將最近被寫(xiě)入的緩存數據復制到對應的存儲區最終位置,并為下一個(gè)待寫(xiě)入的數據塊準備好緩存結構?;赝撕瘮祵?shí)際上就是一個(gè)“取消”操作。它消除最近一次寫(xiě)操作產(chǎn)生的效果,并為下一個(gè)寫(xiě)操作準備好緩存子系統。 檢查函數讀取存儲器件的每個(gè)數據塊,并檢查存儲數據的有效性。該函數還檢查緩存子系統,以確保沒(méi)有未執行的寫(xiě)操作。任何無(wú)效塊或未執行的寫(xiě)操作都會(huì )使檢查函數返回一個(gè)錯誤狀態(tài)。

清理函數修復一個(gè)數據損壞的eeprom。實(shí)際上,它將試圖找出發(fā)生的錯誤,并采取相應的解決措施。

關(guān)于這些函數的更多細節,參見(jiàn)下面的操作詳解。


圖1. eeprom存儲器的結構。存儲器被劃分為3個(gè)區域:主存儲區,包含實(shí)際用戶(hù)數據;校驗存儲區,包含主存儲區每1頁(yè)的crc;緩存,包含存儲臨時(shí)寫(xiě)入數據的四個(gè)緩存。 eeprom結構
參考上面圖1給出的eeprom結構。eeprom包含三個(gè)主要區域:
主存儲區:eeprom的最大區域用于存儲用戶(hù)數據。在一個(gè)16kb器件內,包括512頁(yè)、每頁(yè)32字節的存儲空間。在這樣的器件中,開(kāi)始的473個(gè)頁(yè)面專(zhuān)門(mén)用來(lái)存儲數據。

校驗存儲區:eeprom的第二個(gè)部分,用于校驗主存儲區每個(gè)頁(yè)面的數據。校驗存儲區的每1頁(yè)都包含15個(gè)16位的crc值。每1頁(yè)的最后1個(gè)crc用于校驗本頁(yè)數據。校驗存儲區占用31頁(yè)(從473到503頁(yè))。

緩存:eeprom的最后部分,包含由8個(gè)頁(yè)面構成的4個(gè)寫(xiě)緩存。每個(gè)緩存包含4個(gè)域:數據域,它包含32字節數據,執行下一個(gè)提交命令時(shí),數據將被寫(xiě)入主存儲區;地址域,它表示緩存數據要寫(xiě)入的頁(yè)面地址;狀態(tài)域,它表示緩存的狀態(tài)(包括可用(available)、占用(occupied)和終止(expired)狀態(tài));16位crc域,用來(lái)校驗整個(gè)寫(xiě)緩存。緩存結構見(jiàn)圖1所示。

這種eeprom結構可以實(shí)現主要的設計目標。首先,由于主存儲區每1頁(yè)數據的校驗結果都存儲在另一個(gè)位置,所以頁(yè)面的所有位都用于存儲用戶(hù)數據。其次,由于主存儲區的每1頁(yè)都通過(guò)校驗存儲區的特定字來(lái)校驗,因此校驗存儲區不會(huì )有單點(diǎn)錯誤,并且也不會(huì )在每個(gè)寫(xiě)周期中都去更新整個(gè)校驗存儲區的同一頁(yè)面。最后,使用4個(gè)寫(xiě)緩存分散了寫(xiě)周期帶來(lái)的損耗。


操作詳解

對于一個(gè)不帶保護功能的eeprom,具體操作非常簡(jiǎn)單。一個(gè)讀周期簡(jiǎn)單地將字節從所選擇的地址傳送給主機;一個(gè)寫(xiě)周期將字節從主機寫(xiě)入eeprom,并等待操作完成(大多數器件需要幾個(gè)毫秒的時(shí)間)。然而,在一個(gè)提供保護的eeprom環(huán)境下,讀和寫(xiě)操作就比較復雜了。在以下各節中,對每個(gè)操作進(jìn)行了分解,以便了解函數被調用時(shí)到底是如何操作的。
讀操作


圖2. 讀操作的流程圖 讀操作這個(gè)最簡(jiǎn)單的接口函數,也是相當復雜的。圖2給出了操作流程:

檢查頁(yè)面地址和緩存地址,以檢驗它們的有效性。如果地址無(wú)效,則就此結束操作,函數返回一個(gè)無(wú)效緩存地址或無(wú)效頁(yè)面編號錯誤代碼。
將所選頁(yè)面讀入緩存。

計算校驗頁(yè)面的地址,并將相應的校驗頁(yè)面讀入暫存區。

計算校驗頁(yè)面的crc。如果校驗頁(yè)面的數據無(wú)效,則返回一個(gè)保護失敗錯誤代碼。

計算數據緩存的crc,并將其與暫存區中對應讀取頁(yè)面的crc進(jìn)行比較。如果crc匹配,則程序返回有效讀代碼;如果crc不匹配,則程序返回無(wú)效讀代碼。無(wú)論結果怎樣,實(shí)際讀取的數據都保存在返回緩存中,以供調用讀操作的程序使用。
寫(xiě)操作


圖3. 寫(xiě)操作的流程圖
如上所述,寫(xiě)操作并不是真正將數據寫(xiě)入主存儲區。實(shí)際上,寫(xiě)操作是將數據寫(xiě)入4個(gè)緩存之一。在這種方式下,主存儲區內原先的數據將一直保持到整個(gè)有效寫(xiě)操作流程完成后為止。圖3的流程說(shuō)明了以下幾點(diǎn):

檢查頁(yè)面地址和緩存地址,以檢驗其有效性。如果地址無(wú)效,操作在這里結束,函數返回一個(gè)無(wú)效緩存地址或無(wú)效頁(yè)面編號錯誤代碼。
讀取每個(gè)寫(xiě)緩存的狀態(tài)域。如果任何緩存處于占用狀態(tài),則操作失敗并返回寫(xiě)過(guò)程(write sequence)錯誤代碼。

4個(gè)寫(xiě)緩存之一應處于終止狀態(tài)。如果是這樣,激活下一個(gè)緩存。
數據被復制到寫(xiě)緩存的數據域。

頁(yè)面地址被寫(xiě)入地址域。計算crc校驗結果并將其寫(xiě)入crc域。將狀態(tài)改為占用。將前一個(gè)緩存置為可用狀態(tài)(即更新原來(lái)的終止狀態(tài))。

需要注意,此時(shí)對新寫(xiě)的頁(yè)面進(jìn)行讀操作,將返回頁(yè)面原來(lái)的數值。只有等提交操作完成后,才會(huì )返回新值。

提交操作


圖4. 提交操作的流程
提交函數不需要參數。它的工作就是如實(shí)地將數據從寫(xiě)緩存傳送到主存儲區,然后將寫(xiě)緩存標記為終止狀態(tài)。提交函數的操作流程如圖4所示:

讀取每個(gè)寫(xiě)緩存的狀態(tài)域。應該只有1個(gè)緩存標記為占用狀態(tài)。否則,函數在此結束,并返回一個(gè)寫(xiě)過(guò)程錯誤代碼。

對被占用的緩存進(jìn)行crc校驗。如果不匹配,則返回一個(gè)數據損壞錯誤代碼。
提取頁(yè)面地址,并將數據寫(xiě)入主存儲區的指定頁(yè)面。

計算緩存的數據部分的crc。該值被保存在一個(gè)臨時(shí)寄存器中。

找到對應所選主存儲區頁(yè)面的校驗頁(yè)面,并讀取該校驗頁(yè)面的內容。

用前面計算的crc更新校驗頁(yè)面,為校驗頁(yè)面計算新的crc。

將校驗頁(yè)面數據重新寫(xiě)回校驗存儲區。

將寫(xiě)緩存更新為終止狀態(tài)。

回退操作


圖5. 回退操作的流程圖 如圖5所示,回退函數是最簡(jiǎn)單的操作之一。由于主存儲區只有在完成一個(gè)提交操作后才更新數據,而不是在一個(gè)寫(xiě)操作之后更新的,所以回退操作只需將寫(xiě)緩存置為無(wú)效狀態(tài)即可。

讀取每個(gè)寫(xiě)緩存的狀態(tài)域。應該只有一個(gè)緩存被標記為占用。否則,函數在此結束,并返回一個(gè)寫(xiě)過(guò)程錯誤代碼。
將所選的寫(xiě)緩存狀態(tài)域置為終止。
檢查操作


圖6. 檢查操作的流程圖
在任何上電情況下,都需要調用檢查函數以確保eeprom可以接受數據。檢查函數檢驗存儲系統的可用性,并報告任何發(fā)現的錯誤。該函數的檢查操作如圖6所示:

讀取每個(gè)寫(xiě)緩存。確認只有一個(gè)緩存不是可用狀態(tài)。如果只有一個(gè)緩存含有未定義的狀態(tài)代碼,則返回一個(gè)寫(xiě)操作中斷(interrupted write)錯誤代碼。如果所有緩存均包含未定義的狀態(tài)代碼,則返回eeprom未初始化(uninitialized eeprom)錯誤代碼。

如果僅有一個(gè)緩存包含占用狀態(tài)代碼,計算此緩存的crc。如果crc不匹配,則返回一個(gè)寫(xiě)操作中斷錯誤代碼。

檢查校驗存儲區的每一個(gè)頁(yè)面。如果任何頁(yè)面沒(méi)有通過(guò)crc校驗,則返回保護失敗錯誤代碼。

最后,檢查主存儲區的每一頁(yè),并與存儲的各頁(yè)crc進(jìn)行對比。如果有1頁(yè)未通過(guò)crc校驗,則返回一個(gè)提交中斷(interrupted commit)錯誤代碼。
清理操作


圖7. 清理操作的流程 清理函數解決eeprom系統存在的任何問(wèn)題。在清理操作退出時(shí),無(wú)論eeprom子系統先前是何種狀態(tài),都應該可以繼續使用了。所有未提交的寫(xiě)操作將被回退,并且完成失敗的提交操作。

圖7演示了清理操作是如何工作的:

如果檢查操作返回一個(gè)eeprom未初始化的錯誤代碼,則初始化eeprom。清除所有數據頁(yè)面,并且初始化所有校驗頁(yè)面。除最后一個(gè)寫(xiě)緩存被初始化為終止狀態(tài)外,清除其它所有寫(xiě)緩存并置為可用狀態(tài)。

如果檢查操作返回一個(gè)寫(xiě)操作中斷錯誤代碼,則找到那個(gè)不是可用狀態(tài)的寫(xiě)緩存。將它的狀態(tài)改為終止狀態(tài)。

如果檢查操作返回一個(gè)提交中斷錯誤代碼,則找到crc不匹配的主頁(yè)面。計算出它的crc并更新相關(guān)校驗頁(yè)面。

如果檢查操作返回保護失敗錯誤代碼,則表示緊隨提交操作的更新校驗頁(yè)面操作被中斷。讀出所有與錯誤校驗頁(yè)面相關(guān)的主存儲區頁(yè)面,并刷新校驗頁(yè)面。

安全性證明

要證明系統的安全性,需要確定寫(xiě)操作過(guò)程中數據容易損壞的時(shí)刻。(讀操作從本質(zhì)上來(lái)說(shuō)是安全的。讀操作期間不會(huì )對eeprom頁(yè)面進(jìn)行寫(xiě)操作,因此數據不會(huì )被損壞。) 確定了這些易損時(shí)刻后,只需要再確定一個(gè)恢復過(guò)程。如果恢復機制涵蓋了所有可能的數據損失情況,而且如果我們假定在任何一個(gè)可能破壞eeprom寫(xiě)周期的事件之后,都將首先執行校驗/清理周期(例如上電),那么系統就是安全的。

在大多數串行eeprom器件中,一個(gè)寫(xiě)操作首先將頁(yè)面的每位數據都置為已知值,然后將所有需要改變的位設置為需要的值。因此在掉電時(shí),中斷的寫(xiě)操作極有可能破壞該頁(yè)的所有字節。通??梢酝ㄟ^(guò)向損壞頁(yè)面寫(xiě)入新數據,進(jìn)而從這一失效事件中恢復出來(lái)。但這會(huì )失去原來(lái)的數據。

寫(xiě)操作過(guò)程中數據容易損壞的時(shí)刻如下所述(按發(fā)生的時(shí)間順序排列):

對數據域進(jìn)行寫(xiě)操作:如果此時(shí)發(fā)生電源失效事件,檢查操作不會(huì )檢測到錯誤。正在被寫(xiě)入的寫(xiě)緩存仍顯示可用狀態(tài),但可用的緩存不包含有效的crc值。
向當前寫(xiě)緩存寫(xiě)入狀態(tài)信息:這個(gè)操作將狀態(tài)域改為占用狀態(tài),設定crc并為寫(xiě)操作填入頁(yè)面地址。如果這個(gè)過(guò)程被中斷,可能發(fā)生如下情況:(1) 狀態(tài)無(wú)效,從而導致一個(gè)寫(xiě)操作中斷錯誤;(2) 狀態(tài)有效,但crc錯誤,仍會(huì )導致一個(gè)寫(xiě)操作中斷錯誤;(3) 狀態(tài)和crc域有效。在最后這種情形下,系統有未提交處理的寫(xiě)操作??梢詸z測到這一狀態(tài),因為此時(shí)一個(gè)緩存將處于占用狀態(tài)而另一個(gè)緩存為終止狀態(tài)。如果子系統的其它部分檢查通過(guò),則用戶(hù)代碼可通過(guò)發(fā)出提交或回退操作繼續執行。無(wú)論發(fā)生何種情況,主存儲區和校驗存儲區都是安全的。

前一個(gè)緩存狀態(tài)清除為可用狀態(tài):緩存可能有損壞的狀態(tài)或crc,而下一個(gè)緩存為占用狀態(tài)。這意味著(zhù)清除該緩存的狀態(tài)時(shí)操作被中斷,這種情況下可以執行提交或回退操作。

在寫(xiě)操作和提交操作之間:只有一個(gè)寫(xiě)緩存將處于占用狀態(tài),并且通過(guò)了crc校驗。用戶(hù)代碼可以請求提交或回退操作。寫(xiě)緩存、校驗存儲區和主存儲區都是安全的。

提交操作過(guò)程中數據容易損壞的時(shí)刻如下所述:

將數據域復制到主存儲區:如果寫(xiě)操作被中斷,主存儲區的1個(gè)頁(yè)面數據可能被破壞。檢查函數會(huì )檢測到兩種狀態(tài):(1) 一個(gè)有效的占用寫(xiě)緩存;(2) 中斷的提交操作導致主存儲區頁(yè)面數據損壞。寫(xiě)緩存和校驗存儲區是安全的。在這種情況下,清理操作會(huì )完成提交操作并返回一個(gè)干凈的系統。注意:即使寫(xiě)操作已經(jīng)完成,檢查操作仍會(huì )因為校驗存儲區的crc與計算出的crc不匹配而報錯。

更新校驗存儲區的crc:如果對校驗頁(yè)面的寫(xiě)操作被中斷,則整個(gè)頁(yè)面的數據都可能被破壞。這意味著(zhù)主存儲區的15個(gè)頁(yè)面都對應著(zhù)無(wú)效的crc。但是由于校驗存儲區的每一頁(yè)都有自己的校驗和,而且在寫(xiě)操作中斷后會(huì )產(chǎn)生校驗和錯誤,因此檢查程序會(huì )發(fā)現這一點(diǎn)。在這種情況下,檢查程序會(huì )返回保護失敗。修復方法如下:首先重新計算所有受影響的15個(gè)頁(yè)面的crc值。然后將這些值和該頁(yè)自身的有效crc值一起寫(xiě)入校驗頁(yè)面。

更新寫(xiě)緩存的狀態(tài)信息:如果當狀態(tài)變量從占用狀態(tài)變?yōu)榻K止狀態(tài)時(shí),寫(xiě)周期被中斷,那么整個(gè)寫(xiě)緩存頁(yè)面的數據都可能被損壞。但是,校驗存儲區和主存儲區都是安全的。檢查操作會(huì )找到數據損壞的頁(yè)面,并返回寫(xiě)操作中斷錯誤代碼。當運行清理程序時(shí),它將復位寫(xiě)緩存子系統,并完成提交操作。
最后,在回退操作中數據容易損壞的時(shí)刻為:

更新寫(xiě)緩存的狀態(tài):與提交周期的最終狀態(tài)類(lèi)似,該操作只是簡(jiǎn)單地將寫(xiě)緩存的占用狀態(tài)復位至終止狀態(tài)。如果它被中斷,則檢查程序會(huì )返回寫(xiě)操作中斷,并且清理程序會(huì )重新初始化所有的寫(xiě)緩存區域。校驗存儲區和主存儲區仍是安全的。

可以看出,無(wú)論電源何時(shí)掉電或處理器何時(shí)被復位,存儲子系統都可保持數據的完整性。發(fā)生電源失效事件后,存儲子系統會(huì )返回到可進(jìn)行讀或寫(xiě)的狀態(tài)。如果一個(gè)提交操作被中斷,子系統會(huì )返回到可執行提交或回退操作的狀態(tài)。


設計起步

maxq微控制器的eeprom存儲系統功能完備。系統設計者可以根據需要來(lái)增強該系統的功能。但需要注意以下幾點(diǎn):

c封裝程序:在多數c語(yǔ)言標準中,與匯編語(yǔ)言子程序雙向傳送數據時(shí)都有一套標準的方法。例如在iar開(kāi)發(fā)環(huán)境下,參數在低編號的累加器中傳入和傳出。由于參數已經(jīng)傳入a[0]和a[1],為這些程序建立一個(gè)c封裝器,就像寫(xiě)函數原型一樣容易。在其它c(diǎn)環(huán)境下,參數傳遞是通過(guò)數據棧進(jìn)行的,需要一個(gè)簡(jiǎn)單的封裝子程序。

并發(fā)處理:首先要保證寫(xiě)周期的完整性,并且提供一套能夠保證完整性的機制,對于整個(gè)平臺的成敗至關(guān)重要。但很多應用都需要這樣一種機制,即可以讓一系列寫(xiě)周期排隊并一次執行完畢,從而保證全都執行或全都不執行。但本文討論的機制不能工作在這種方式下。如果一個(gè)系統存有跨越多個(gè)頁(yè)面的信息記錄,則可以中斷一個(gè)寫(xiě)操作,這使得恢復之后的記錄涵蓋了包含部分新數據的頁(yè)面和包含部分舊數據的頁(yè)面。有一種方法可避免該問(wèn)題,即在執行提交操作之前允許多重寫(xiě)操作。這種方法并不像聽(tīng)上去那么簡(jiǎn)單,因為一個(gè)部分提交的事務(wù),可能同時(shí)包括新紀錄片斷、舊記錄片斷和損壞的頁(yè)面。

平均讀寫(xiě)機制:平均讀寫(xiě)作為閃存文件系統的一個(gè)特點(diǎn),是指虛擬化頁(yè)面地址,使得被頻繁寫(xiě)入的頁(yè)面會(huì )出現在存儲器的任何物理位置。但是很難找到實(shí)現這一目標的最佳方法。這是因為,最直接的解決方法(活動(dòng)存儲塊的目錄處于固定的位置,并且每次寫(xiě)操作后都要對它進(jìn)行更新)會(huì )導致存儲目錄的頁(yè)面迅速損耗。所以,就像處理數據頁(yè)面那樣,還必須虛擬化和離散化目錄本身。
其它頁(yè)面尺寸:這里給出的系統假定采用一個(gè)16kb、每頁(yè)32字節的存儲器件。如果所選擇的器件具有更大的頁(yè)面尺寸(64字節或128字節),這些函數仍可工作,只是會(huì )伴隨一些額外的寫(xiě)入損耗。(更新128字節頁(yè)面中的32字節區段時(shí),會(huì )對整個(gè)128字節頁(yè)面執行寫(xiě)操作)。但這些函數無(wú)法對具有更小頁(yè)面尺寸的器件進(jìn)行操作??梢詷嫿ㄒ粋€(gè)能夠在線(xiàn)確定eeprom器件特性的系統,并可根據實(shí)際特性配置系統的參數。

增強的安全性:本系統對以下類(lèi)型的錯誤提供保護:由于電源失效或不可預期的系統復位而造成的eeprom操作中斷。但eeprom器件偶爾也會(huì )因為其它原因出錯。例如,由于電路噪聲或致電離輻射導致的軟件錯誤?;蛘哂捎谝粋€(gè)或多個(gè)存儲單元損耗而導致硬件錯誤。

一種解決方法是計算并維護校正子(syndrome),而不是采用簡(jiǎn)單的crc校驗字。校正子和校驗字類(lèi)似,但是包含了足夠的信息以修復簡(jiǎn)單的位錯誤。最簡(jiǎn)單的校正子系統可以用log2n + 1個(gè)校驗位來(lái)檢驗n個(gè)數據位。因此,對于一個(gè)32字節(256位)的頁(yè)面來(lái)說(shuō),一個(gè)僅包含9位的校正子就可以修正任何1位錯誤。對數據完整性的要求更加嚴格時(shí),可以采用更加復雜的系統來(lái)解決類(lèi)似問(wèn)題。


結語(yǔ)

外部串行eeprom為微控制器環(huán)境下存儲非易失數據提供了一種可靠的方法。利用本文提到的技術(shù),即使面臨寫(xiě)操作中斷的情況,串行eeprom依然能夠可靠地工作。在任何對數據完整性要求較高的應用中,設計者都可以考慮這些技術(shù)。



關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>