非易失性存儲器對于嵌入式微控制器應用至關重要。本應用筆記解釋了如何使用基于事務的提交回滾機制來保護外部EEPROM存儲器器件的內容。雖然針對的是外部存儲器器件,但這里介紹的原理同樣適用于許多MAXQ微控制器的內部EEPROM。
介紹
對于嵌入式微控制器應用,非易失性存儲器通常是必不可少的。無論是維護因斷電而必須保留的設置,還是存儲公司的關鍵交易記錄,可靠的非易失性存儲器都是現代微控制器領域的基本要素。
通常,非易失性存儲采用外部串行存儲器的形式。從字面上看,數十億個這樣的內存組件多年來在該領域已被證明是可靠的。現在,密度從幾百字節到一兆字節甚至更多,幾乎可以在需要維護設置的所有設備中找到至少一種這些緊湊、廉價的設備。
任何類型的非易失性存儲(從EEPROM到閃存再到旋轉存儲)的一個問題是由于寫入周期中斷而導致的數據丟失。如果在執行寫入周期時電源出現故障,則在電源恢復后,數據損壞可能會導致數據損壞,而沒有任何簡單的恢復機制。
本文介紹一種基于事務的提交回滾機制,以保護外部串行EEPROM存儲器器件的內容。本文介紹的原理同樣適用于許多MAXQ>微控制器中包含的內部EEPROM。此應用程序的文件可供下載(ZIP,20.5kb)。
I2C EEPROM的特性
串行存儲器器件具有多種接口,但最常用的接口是I2C。這種總線具有許多優點:高度標準化;它只需要從控制器到內存的兩根電線;它具有非常靈活的時序要求,使其能夠由軟件驅動。一個I2C主機可以驅動多個I2C從器件,從而最大限度地減少主器件上的引腳數。
在所有EEPROM器件中,寫入周期明顯長于讀取周期。這是因為電荷在寫入周期中通過隧道機制穿過絕緣屏障傳輸,并且此操作需要時間。雖然增加電壓可以加速這一過程,但過大的電位會導致勢壘的介電擊穿,從而損壞器件。EEPROM 器件的典型寫入周期時間約為 10 毫秒;讀取周期通常發生在幾百納秒內。
許多I2C EEPROM器件試圖通過使用頁面模式來降低寫入周期時間的重要性。此模式允許將多個字節傳輸到緩沖區,然后一次寫入數組。I2C存儲器器件的典型頁面大小為32字節。因此,只需一個寫入周期即可填充 EEPROM 陣列的 32 個字節。
這一點很重要,因為串行EEPROM器件具有指定的耐久性:頁面可以容忍的生命周期寫入周期數的上限。寫入周期的典型耐久性范圍為 10,000 到 1,000,000。然而,即使有一百萬次寫入周期的耐久性,也很容易看出軟件如何快速磨損存儲設備。每秒僅執行 100 個寫入周期,在不到三個小時的時間內,設備寫入周期計數就耗盡了。
考慮到這些基本的EEPROM特性,嵌入式處理器的穩健非易失性存儲系統的設計人員必須牢記以下幾點:
任何一頁都不應成為重復寫入的目標。具體來說,將一個頁面設置為每次寫入另一個頁面時都必須更新的“目錄”是不可接受的。
如果在寫入周期內電源中斷,則必須提供一種機制來:(1) 檢測中斷的寫入:和 (2) 完成事務;或 (3) 將事務回滾到預寫條件。
必須通過某種類型的檢查數據機制(校驗和、CRC、消息摘要)來確保數據完整性。
設計目標
雖然上述EEPROM考慮因素可以通過許多非易失性文件系統來解決,但這種文件機制給小型嵌入式微控制器帶來了沉重的負擔。許多文件系統需要比小型微控制器更多的RAM,而完整的文件系統比大多數應用程序所需的RAM要多。
考慮到這一點,以下是EEPROM數據保護機制的目標:
輕量級:保護機制應為檢查數據保留不超過 10% 的 EEPROM 空間。它應該只需要少量的計算開銷。
塊大小:受保護塊的塊大小應與EEPROM中的本機寫入頁相同。由于EEPROM器件的頁面大小始終是2的偶數次冪,因此軟件編碼比從每個塊保留一個或兩個字節更容易。
耐久性:不應為每個受保護的周期寫入任何單個頁面。
穩健:每個電源故障實例都應該是可證明的可恢復的。
此處介紹的保護機制有六個接口功能:讀取、寫入、提交、回滾、檢查和清理。
read 函數接受塊號和指向 32 字節緩沖區的指針。如果緩沖區地址和塊號在有效范圍內,則例程會將指定的塊讀入緩沖區并檢查其有效性。它將返回條件有效讀取、無效讀取、無效緩沖區地址或無效頁碼或保護失敗。
寫入函數接受塊號和指向先前填充了要寫入的數據的 32 字節緩沖區的指針。如果緩沖區地址和塊號在有效范圍內,例程會將數據復制到非易失性保持緩沖區,并將緩沖區標記為準備提交。
提交和回滾函數是可以在寫入后執行的互補操作。commit 函數將最近寫入的緩沖區復制到其在內存數組中的最終位置,并為要寫入的下一個數據集準備緩沖區結構。回滾功能本質上是一個“撤消”。它反轉最近寫入操作的效果,并為下一次寫入準備緩沖區子系統。
檢查功能讀取存儲設備的每個塊并驗證存儲數據的有效性。它還檢查緩沖區子系統,以確保沒有掛起的寫入。任何無效塊或任何掛起的寫入都會導致檢查返回錯誤條件。
清理功能修復了損壞的EEPROM。特別是,它嘗試確定發生了哪些故障以及可以執行哪些操作來解決問題。
有關所有這些功能的更多詳細信息,請參閱下面的操作詳細信息。
圖1.EEPROM 陣列的結構。該數組分為三個區域:包含實際用戶數據的主數組;為主數組中的每一行包含一個 CRC 的檢查數組;以及包含四個緩沖區的緩沖區數組,用于存儲臨時寫入數據。
有關EEPROM的結構,請參閱上面的圖1。EEPROM包含三個主要領域:
主陣列:EEPROM的最大部分專用于數據存儲。在 16kB 的設備中,總共有 512 頁,每頁 32 字節。在這樣的設備中,前473頁專用于實際數據存儲。
檢查數組:EEPROM 的第二部分檢查主數組中每一行的單詞。檢查數組的每一頁都包含一組 15 位 16 位 CRC 值。每個頁面中的最終 CRC 值將檢查該頁面。校驗數組占用 473 頁(第 503 頁至第 <> 頁)。
緩沖陣列:EEPROM 的最后一部分包含 32 頁,構成 16 個寫入緩沖區。每個緩沖區由四個字段組成:一個數據字段,其中包含要在下一個提交指令處寫入主數組的 1 字節數據;標識緩沖區引用的頁面地址的地址字段;標識緩沖區狀態(即可用、已占用、已過期)的狀態字段;以及檢查整個寫入緩沖區的 <> 位 CRC 字段。有關緩沖結構,請參見上面的圖 <>。
這種EEPROM結構滿足了設計的大部分主要目標。首先,由于主數組中的每個頁面都在輔助位置進行檢查,因此頁面的所有位都可用于用戶數據。其次,由于主數組中的每個頁面都由 check 數組中的唯一字進行檢查,因此 check 數組中沒有單點故障,整個數組中沒有必須在每個寫入周期更新的單個頁面。最后,使用四個寫入緩沖區來分配寫入周期的磨損。
操作細節
在未受保護的EEPROM中,操作細節很簡單。讀取周期只是將字節從所選地址傳輸到主機;寫入周期將字節從主機傳輸到EEPROM,并等待操作完成(在大多數設備中為幾毫秒)。然而,在受保護的EEPROM環境中,讀取和寫入是更復雜的操作。在下一節中,將剖析每個操作,以準確發現調用函數時發生的情況。
讀
圖2.讀取操作的流程圖。
讀取操作是最簡單的接口函數,但仍然相當復雜。圖 2 說明了操作流程:
檢查頁面地址和緩沖區地址以驗證它們是否有效。否則,操作將在此處結束,函數返回無效的緩沖區地址或無效的頁碼錯誤。
所選頁將讀入緩沖區。
計算檢查頁的地址,并將校驗頁讀入暫存緩沖區。
計算檢查頁的CRC。如果無效,則返回保護失敗錯誤。
CRC是在數據緩沖區上計算的,并與存儲在與讀取頁對應的暫存緩沖區中的CRC進行比較。如果 CRC 匹配,則例程返回有效讀取;如果 CRC 不匹配,則例程返回無效讀取。在任何情況下,實際讀取的數據都保留在返回緩沖區中,供調用例程根據需要使用。
寫
圖3.寫入操作的流程圖。
如上所述,寫入操作實際上并沒有寫入主數組。相反,寫入操作將其數據存儲在四個緩沖區之一中。通過這種方式,主數組中的先前數據將被保留,直到確保寫入過程的有效性。圖 3 中的流程圖顯示:
檢查頁面地址和緩沖區地址以驗證它們是否有效。否則,操作將在此處結束,函數返回無效的緩沖區地址或無效的頁碼錯誤。
讀取每個寫入緩沖區的狀態字段。如果任何緩沖區的狀態已占用,則操作將失敗并顯示寫入序列錯誤。
四個寫入緩沖區中的一個應處于過期狀態。如果是這樣,則激活序列中的下一個緩沖區。
數據將復制到寫入緩沖區的數據字段。
頁面地址將寫入地址字段。計算 CRC 并將其寫入 CRC 字段。狀態將更新為已占用。以前的緩沖區設置為可用狀態(即,從過期更新)。
請注意,此時,讀取操作將返回新寫入頁面的舊值。在提交操作完成之前,不會返回新值。
圖4.提交操作的流程圖。
提交函數不需要任何參數。它唯一的工作是忠實地將數據從寫緩沖區傳輸到主數組,然后標記寫緩沖區已過期。提交函數的操作如圖 4 所示:
讀取每個寫入緩沖區的狀態字段。正好應該將一個緩沖區標記為已占用。如果不是這樣,則函數在此處以寫入序列錯誤結束。
使用CRC檢查占用的緩沖區。如果沒有匹配項,則會引發數據損壞錯誤。
提取地址,并將數據寫入主數組中的指定頁面。
CRC 是跨緩沖區的數據部分計算的。該值保存在臨時寄存器中。
檢查頁面已找到并讀取所選主頁。
使用先前計算的CRC更新檢查頁面,并為檢查頁面計算新的CRC。
檢查頁將寫回檢查數組。
寫入緩沖區將更新為過期狀態。
反轉
圖5.回滾操作的流程圖。
回滾函數(如圖 5 所示)是最簡單的函數之一。由于主數組不會在寫入操作后更新,而只會在提交操作完成后更新,因此回滾只需要使寫入緩沖區失效。
讀取每個寫入緩沖區的狀態字段。正好應該將一個緩沖區標記為已占用。如果不是這樣,則函數在此處以寫入序列錯誤結束。
所選寫入緩沖區的狀態字段被賦予值已過期。
檢查
圖6.檢查操作的流程圖。
在任何上電事件中,都應調用檢查功能以驗證EEPROM是否已準備好接受數據。檢查功能將驗證存儲系統的運行狀況并報告遇到的任何錯誤。它執行圖 6 中所示的檢查:
讀取每個寫入緩沖區。驗證只有一個緩沖區未處于可用狀態。如果只有一個緩沖區包含未定義的狀態代碼,則返回中斷寫入錯誤。如果所有緩沖區都包含未定義的狀態代碼,則返回未初始化的 EEPROM 錯誤。
如果只有一個緩沖區包含占用的狀態代碼,則 CRC 該緩沖區。如果 CRC 失敗,則返回中斷的寫入錯誤。
檢查檢查數組的每一頁。如果任何行未通過其 CRC 檢查,則返回保護失敗錯誤。
最后,根據其存儲的 CRC 檢查主數組的每一頁。如果任何單個頁面的 CRC 失敗,請標記中斷的提交錯誤。
清理
圖7.清理操作的流程圖。
清理功能可解決EEPROM系統存在的任何問題。當清理退出時,EEPROM 子系統應隨時可供使用,無論它處于何種狀態。將回滾所有未提交的寫入,并完成失敗的提交操作。
圖 7 顯示了清理的工作原理:
如果檢查返回未初始化的 EEPROM 錯誤,則初始化 EEPROM。清除所有數據頁,并初始化所有檢查頁。所有寫入緩沖區都將被清除并以可用狀態寫入 - 最后一個寫入緩沖區除外,該緩沖區以過期狀態初始化。
如果 check 返回中斷的寫入錯誤,請查找狀態不是可用的一個寫入緩沖區。將該狀態更改為已過期。
如果 check 返回中斷的提交錯誤,請查找 CRC 不匹配的主頁。計算其CRC并更新關聯的檢查頁面。
如果檢查返回保護失敗,則在提交操作中斷后更新檢查頁。讀取與缺陷檢查頁面關聯的所有主頁,并刷新檢查頁面。
安全證明
系統安全性的證明集中在識別寫入事務期間的易受攻擊時刻。(讀取事務本質上是安全的。在讀取操作期間不會寫入EEPROM的頁面,因此數據不會損壞。在確定了這些脆弱時刻之后,人們只需要確定一個恢復過程。如果恢復機制涵蓋了所有已識別的漏洞,并且如果我們假設檢查/清理周期將是任何可能破壞EEPROM寫入周期的操作(例如上電)之后的第一個事件,那么系統是可證明安全的。
通常在大多數串行EEPROM器件中,寫操作首先將受影響頁面中的每個位設置為已知值,然后更改必須更改的位以寫入請求的值。因此,當電源出現故障時,很可能在中斷的寫入操作期間頁面的所有字節都損壞。通常可以通過將新數據寫入損壞的頁面來從此故障事件中恢復。盡管如此,以前的數據還是會丟失。
寫入操作期間的易受攻擊時刻是(按時間順序):
在對數據字段的寫入操作期間:如果此時發生電源故障,則檢查操作不會檢測到錯誤。正在寫入的寫入緩沖區仍具有可用狀態,并且可用緩沖區不包含有效的 CRC 值。
當前寫入緩沖區的寫入狀態:此操作將狀態字段更改為已占用,設置 CRC,并填寫寫入操作的頁面地址。如果此過程中斷,則滿足以下條件之一:(1) 狀態將無效,導致寫入錯誤中斷;(2)狀態有效,但CRC失敗,再次導致寫入錯誤中斷;或 (3) 狀態和 CRC 字段將有效。在最后一種情況下,系統有一個未提交的寫入掛起。可以檢測到這種情況,因為一個緩沖區將被占用,另一個緩沖區將過期。如果子系統的其余部分簽出,則用戶代碼可以通過發出提交或回滾操作來繼續。無論如何,主陣列和檢查數組都是安全的。
將以前的緩沖區狀態清除為可用:緩沖區將具有損壞狀態或 CRC,下一個緩沖區將被占用。這意味著清除該緩沖區狀態的操作已中斷,可以提交或回滾。
在寫入和提交操作之間:只有一個寫入緩沖區具有占用狀態,其 CRC 將進行驗證。用戶代碼可以請求提交或回滾。寫緩沖數組、檢查數組和主陣列是安全的。
提交操作的易受攻擊時刻包括:
將數據字段復制到主陣列:如果寫入操作中斷,則主陣列的一頁可能會損壞。check 函數會將 (1) 有效的、占用的寫入緩沖區和 (2) 損壞的主數組頁的情況標識為中斷的提交。寫緩沖數組和檢查數組將是安全的。在這種情況下,清理將完成提交并返回已清理的系統。即使寫入完成,請注意檢查操作也會失敗,因為檢查數組中的 CRC 將與計算的 CRC 不同。
更新檢查數組中的CRC:如果對檢查數組中的頁面的寫入操作中斷,則整個頁面可能會損壞。這意味著主數組中的 15 個頁面將具有無效的 CRC 值。但是 check 可以發現這一點,因為 check 數組中的每個頁面都有自己的校驗和,并且在寫入中斷后這將失敗。在這種情況下,檢查將返回保護失敗。解決方法是,首先,重新計算所有 15 個受影響頁面的 CRC 值。然后將這些值寫入檢查數組中的頁面,以及頁面本身的有效 CRC 值。
更新寫入緩沖區數組中的狀態:如果在狀態變量從占用更改為過期時寫入周期中斷,則整行可能已損壞。但是,檢查數組和主數組將保持安全。檢查將發現一個頁面損壞,并將拋出中斷的寫入錯誤。當清理運行時,它將重置寫入緩沖區子系統,完成提交操作。
最后,回滾期間的脆弱時刻是:
更新寫入緩沖區數組中的狀態:類似于提交周期的最終狀態,這只是將寫入緩沖區中的占用狀態重置為過期狀態。如果這被中斷,檢查例程將返回中斷的寫入,清理將重新初始化整個寫入緩沖區數組。同樣,檢查數組和主數組是安全的。
因此,可以看出,無論何時斷電或處理器復位,存儲子系統都保持其完整性。電源故障后,存儲子系統將返回到準備寫入或讀取的狀態。如果提交操作被中斷,子系統將返回到提交或回滾成功的狀態。
從這里開始設計
用于MAXQ微控制器的EEPROM存儲系統已經完成。系統的增強由各個系統集成商自行決定。盡管如此,還是想到了一些想法:
C 包裝器:在大多數 C 方言中,有一種標準方法可以在匯編語言子例程之間傳輸數據。例如,在 IAR 環境中,參數在低編號累加器中傳入和傳出。為這些例程創建 C 包裝器就像編寫函數原型一樣簡單,因為參數已經在 A[0] 和 A[1] 中傳遞。在其他 C 環境中,參數在數據堆棧上傳遞,需要一個簡單的包裝器子例程。
并發事務:保證寫入周期的完整性至關重要,提供一種實現這種完整性的機制對于平臺的整體成功至關重要。但是,許多應用程序需要一種機制,通過該機制,可以將一系列寫入周期排隊,然后作為一個單元執行,并保證要么全部執行,要么不執行。此處介紹的機制不是這樣工作的。如果系統正在維護跨多個頁的記錄,則可以中斷寫入,以便在恢復后,記錄包含包含部分新條目的頁和包含部分舊條目的頁。避免此問題的一種方法是在執行提交之前允許多個寫入操作。此方法并不像聽起來那么簡單,因為部分提交的事務可能包含新記錄片段、舊記錄片段和損壞頁面的混合。
磨損均衡:閃存文件系統的一項功能,磨損均衡是指虛擬化頁面地址的做法,以便頻繁寫入的頁面可以物理地出現在陣列中的任何位置。這種做法的最佳方法并不明顯。這是因為最明顯的解決方案(位于固定位置的可移動扇區的目錄,每次寫入一次都會更新)會導致存儲目錄的頁面迅速磨損。相反,目錄本身必須虛擬化和分布式,就像數據頁一樣。
替代幾何形狀:此處介紹的系統假設 16kB 部分具有 32 字節頁面。如果所選部分具有較大的頁面(64 字節或 128 字節),則函數仍將工作,但會有一些額外的寫入磨損。(更新 32 字節頁面的一個 128 字節段將對整個 128 字節頁面執行寫入。但這些功能不適用于包含較小頁面的設備。可以構建一個系統,即時確定特定EEPROM器件的特性,并相應地配置系統參數。
增強的安全性:該系統可防止一種類型的故障:由于電源故障或意外系統重置而導致EEPROM操作中斷。但EEPROM器件可能會(偶爾)以其他方式失敗。這方面的一個例子是電路噪聲或電離輻射引起的軟故障。另一個例子是由于一個或多個電池的磨損而導致的硬故障。
處理這些問題的一種方法是計算和維護綜合征,而不是簡單的CRC檢查詞。綜合征類似于校驗字,但包含足夠的信息來糾正簡單的位錯誤。最簡單的綜合征系統可以用日志檢查n個數據位2n + 1 個校驗位。因此,對于 32 字節(256 位)的頁面大小,只有 <> 位的綜合征字可以糾正任何單位錯誤。隨著對數據完整性的要求變得更加嚴格,可以對問題產生更復雜的影響。
結論
外部串行EEPROM提供了一種在微控制器環境中存儲非易失性數據的可靠方法。使用此處介紹的技術,即使面對中斷的寫入周期,串行EEPROM也可以變得可靠。每當數據完整性對應用程序至關重要時,設計人員就應考慮這些技術。
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7496瀏覽量
151086 -
存儲器
+關注
關注
38文章
7455瀏覽量
163623 -
EEPROM
+關注
關注
9文章
1010瀏覽量
81414
發布評論請先 登錄
相關推薦
評論