<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MAXQ環(huán)境下EEPROM的保護(hù)措施

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/21551.htm


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


          操作詳解

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


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

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

          計(jì)算校驗(yàn)頁(yè)面的地址,并將相應(yīng)的校驗(yàn)頁(yè)面讀入暫存區(qū)。

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

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


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

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

          4個(gè)寫(xiě)緩存之一應(yīng)處于終止?fàn)顟B(tài)。如果是這樣,激活下一個(gè)緩存。
          數(shù)據(jù)被復(fù)制到寫(xiě)緩存的數(shù)據(jù)域。

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

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

          提交操作


          圖4. 提交操作的流程
          提交函數(shù)不需要參數(shù)。它的工作就是如實(shí)地將數(shù)據(jù)從寫(xiě)緩存?zhèn)魉偷街鞔鎯?chǔ)區(qū),然后將寫(xiě)緩存標(biāo)記為終止?fàn)顟B(tài)。提交函數(shù)的操作流程如圖4所示:

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

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

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

          找到對(duì)應(yīng)所選主存儲(chǔ)區(qū)頁(yè)面的校驗(yàn)頁(yè)面,并讀取該校驗(yàn)頁(yè)面的內(nèi)容。

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

          將校驗(yàn)頁(yè)面數(shù)據(jù)重新寫(xiě)回校驗(yàn)存儲(chǔ)區(qū)。

          將寫(xiě)緩存更新為終止?fàn)顟B(tài)。

          回退操作


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

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


          圖6. 檢查操作的流程圖
          在任何上電情況下,都需要調(diào)用檢查函數(shù)以確保eeprom可以接受數(shù)據(jù)。檢查函數(shù)檢驗(yàn)存儲(chǔ)系統(tǒng)的可用性,并報(bào)告任何發(fā)現(xiàn)的錯(cuò)誤。該函數(shù)的檢查操作如圖6所示:

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

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

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

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


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

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

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

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

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

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

          安全性證明

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

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

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

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

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

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

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

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

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

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

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

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


          設(shè)計(jì)起步

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

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

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

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

          增強(qiáng)的安全性:本系統(tǒng)對(duì)以下類(lèi)型的錯(cuò)誤提供保護(hù):由于電源失效或不可預(yù)期的系統(tǒng)復(fù)位而造成的eeprom操作中斷。但eeprom器件偶爾也會(huì)因?yàn)槠渌虺鲥e(cuò)。例如,由于電路噪聲或致電離輻射導(dǎo)致的軟件錯(cuò)誤?;蛘哂捎谝粋€(gè)或多個(gè)存儲(chǔ)單元損耗而導(dǎo)致硬件錯(cuò)誤。

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


          結(jié)語(yǔ)

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



          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();