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