<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®處理器的非易失存儲服務(wù)

充分利用MAXQ®處理器的非易失存儲服務(wù)

作者: 時(shí)間:2011-05-21 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要:需要非數據的應用通常都需要使用外部串行EEPROM。這篇文章介紹了僅使用MAXQ微控制器中已有的閃存提供非數據的方法。

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

引言

需要微控制器的應用通常也需要一些機制,即使在掉電的情況下也可以保存設置。例如,一臺收音機,假如在更換電池的時(shí)候會(huì )丟失之前的電臺設置,肯定不會(huì )在當今的市場(chǎng)上獲得成功??蛻?hù)期望喜歡的頻道、溫度預設值、參數首選項和其他持久性的信息能夠一直被保存。

為滿(mǎn)足客戶(hù)對非數據的要求,設計師通常會(huì )使用一個(gè)串行EEPROM。這些EEPROM器件體積很小、價(jià)格便宜、而且在市場(chǎng)上已經(jīng)被長(cháng)期使用,設計工程師使用這些器件非常便利。但是在當今對成本非常敏感的市場(chǎng)領(lǐng)域,增加一個(gè)并不昂貴的EEPROM可能會(huì )使設計超出預算。

很多使用閃存存儲程序代碼,使用靜態(tài)RAM存儲數據信息。盡管閃存未使用的部分作為非易失數據存儲很有吸引力,但是傳統的哈佛架構制約了這種應用。MAXQ架構屬于哈佛架構,具有獨立的代碼和數據總線(xiàn)。但MAXQ器件包含的硬件部分可以實(shí)現偽馮諾依曼架構,如同訪(fǎng)問(wèn)數據空間一樣訪(fǎng)問(wèn)代碼空間。這種額外的多功能性,結合MAXQ的效用函數,可實(shí)現存儲器的擦寫(xiě),為完整的可讀寫(xiě)非易失存儲子系統提供了解決方案。

關(guān)于閃存的基本考慮

閃存是一種電子可擦除存儲。通常也被認為是“主讀”。簡(jiǎn)言之,盡管閃存是可寫(xiě)的,但數據更新并不會(huì )很頻繁,多數的操作都是讀操作。多數閃存器件從字面意思來(lái)講都是可寫(xiě)的,但每次只能整塊擦除。這使得那些存儲器件通常都不適合用于易變存儲,只適合用作從不改變內容的固定數據存儲。

有兩種類(lèi)型的閃存:NAND閃存和NOR閃存。NAND閃存用在存儲卡和U盤(pán)中。通常,由于數據按時(shí)鐘串行傳輸,從NAND器件中讀數據需要數個(gè)周期。這種有序的操作使NAND閃存不適合用作程序代碼存儲,因為讀取時(shí)間會(huì )太長(cháng)。相反,NOR閃存類(lèi)似傳統字節寬度或字寬度存儲。讀取NOR閃存就像讀取ROM器件:先發(fā)器件選擇和地址命令,在等待足夠的存取時(shí)間之后,從總線(xiàn)上讀取數據。NOR閃存用于MAXQ中。

MAXQ的閃存

MAXQ處理器中使用的閃存單元被擦除時(shí)會(huì )變成“1”狀態(tài)。因此,在擦除后,存儲單元中的每個(gè)位置都將包含0xFFFF。對某一存儲位置進(jìn)行編程會(huì )把某些位從“1”變成“0”狀態(tài)。為了使被編程過(guò)的位重新變回“1”狀態(tài),整個(gè)單元必須被擦除。

任何電擦除的存儲器件必須面臨的問(wèn)題是持久性。根據特定的技術(shù),一個(gè)閃存單元在完全失效之前,可以忍耐的擦除次數少達1,000次,多達1,000,000次。因此,使用閃存做數據存儲的任何應用都必須保證寫(xiě)操作循環(huán)在整個(gè)陣列中均勻分布,不允許某一個(gè)位置的擦除編程次數比其他位置多很多。

多數閃存器件都允許把之前已經(jīng)編程過(guò)的位置中的沒(méi)有編程過(guò)的位從“1”變成“0”狀態(tài)。例如,對于多數器件,允許對某個(gè)位置編程,把數據從0xFFFE變?yōu)?x7FFE,在這個(gè)編程過(guò)程中,沒(méi)有任一個(gè)位從“0”變成“1”。然而,MAXQ系列器件中使用的閃存,不允許對已經(jīng)編程過(guò)的位置再編程,即使沒(méi)有發(fā)生從“0”到“1”的變化。這樣的寫(xiě)操作會(huì )失敗,保持數據在0xFFFE狀態(tài)。

MAXQ器件編程受限制的理由如下。正在被編程的存儲單元起初是作為代碼空間的,所以必須很謹慎,禁止對已寫(xiě)過(guò)的位置的任何寫(xiě)操作。0xFFFF指令指一條無(wú)效的源代碼,它不太可能出現在有效的代碼單元內。因此,阻止對已編程過(guò)的位置的寫(xiě)操作能夠幫助保持代碼單元的完整性。

使用MAXQ2000的設計方案

在這篇文章中,我們主要討論一個(gè)MAXQ器件:MAXQ2000。這個(gè)微處理器具有64kB的程序存儲空間,具體劃分為128個(gè)單元,每個(gè)單元具有256個(gè)16位的字。下面介紹兩種設計方案。第一種方案適用于信息寫(xiě)一次后在產(chǎn)品的生命周期內不會(huì )再頻繁改動(dòng),例如校準數據、版本信息和特征參數等等。第二種方案針對更普通的裝置,這種設計要允許數據頻繁改動(dòng),例如使用信息或者詳細記錄等。

方案1

問(wèn)題:校準數據需要存儲在產(chǎn)品中。產(chǎn)品會(huì )一直需要重新校準,所以校準數據必須保存在一個(gè)可改寫(xiě)的存儲空間中。

解決方案:這實(shí)際上是可以想象的到的最簡(jiǎn)單的情況。MAXQ2000程序存儲空間中預留了兩個(gè)單元用于存儲校準數據,一個(gè)是字地址0x7E00,另一個(gè)是0x7F00。當MAXQ2000第一次收到保存校準數據的命令,它就會(huì )檢查這兩個(gè)單元并確保它們是空的。校準數據被保存到第一個(gè)單元。

當MAXQ2000第二次收到保存校準數據的命令,它會(huì )再次檢查這兩個(gè)單元。當發(fā)現0單元已被使用,它會(huì )把校準數據復制到1單元,接著(zhù)擦除0單元。

當MAXQ2000收到讀校準數據的請求(例如在上電時(shí)),它會(huì )讀這兩個(gè)單元,看哪個(gè)正在被使用。沒(méi)有被擦除的單元用來(lái)配置器件到校準狀態(tài)。

這種方案的最主要優(yōu)點(diǎn)是簡(jiǎn)易性。當某些應用需要在上電時(shí)作配置時(shí)(或者其它恢復配置的情況),這種方法很適用。讀程序會(huì )接收到一個(gè)字指針,并返回這個(gè)地址的內容;寫(xiě)程序會(huì )接收一個(gè)字指針,并嘗試對這個(gè)地址寫(xiě)操作。擦除程序會(huì )擦除這兩個(gè)單元。

這種方案的缺點(diǎn)是:子程序極其不智能。無(wú)法判斷寫(xiě)操作是否成功。假如寫(xiě)操作失敗了,不會(huì )有任何動(dòng)作來(lái)解決問(wèn)題。為什么這種方案只適用于對已知的空單元寫(xiě)操作,以上這種限制就是其原因。

方案2

問(wèn)題:非易失存儲用來(lái)跟蹤用電量和其它會(huì )經(jīng)常改變的數據。更新的頻率從一周數次到一天數次。電表是一個(gè)很好的應用舉例。

解決方案:在這種情況下即時(shí)傳統的EEPROM也需要另求幫助。問(wèn)題在于:頻繁的更新、和可擦除存儲技術(shù)固有的有限電擦除壽命,排除了使用單個(gè)EEPROM頻繁寫(xiě)擦除操作的可能性。假如這種應用需要每小時(shí)更新一次。具有10,000次寫(xiě)擦除次數限制的EEPROM只能工作一年,遠遠低于電表應用所需的10年壽命設計目標。

這個(gè)問(wèn)題的解決方案是實(shí)現“損耗平衡”。也就是指不對單一位置重復寫(xiě)操作。相反,在整個(gè)存儲陣列中執行均勻分布的寫(xiě)操作。

正是基于此目的,損耗平衡技術(shù)被接受,并在閃存存儲設備中使用。它的算法非常復雜難以理解。但對于我們,介紹簡(jiǎn)單的機理就足夠了。

在這種設計中,存儲陣列中的數據條目并不是以地址作參考,而是以數據元編號為參考。數據元編號是一個(gè)和數據元素一一對應的任意8位數值。所以在這個(gè)方案中最大可以有255個(gè)數據元(數據元0預留)。每個(gè)數據元包含:包括數據元編號和數據元長(cháng)度的雙字節報頭(圖1);指示1、2、3或者4個(gè)16位字的兩位碼,以保留足夠的剩余空間進(jìn)行錯誤管理。

圖1. 數據單元報頭結構
圖1. 數據單元報頭結構

寫(xiě)數據單元時(shí),寫(xiě)子程序必須知道要寫(xiě)的數據、數據單元的長(cháng)度和數據要寫(xiě)的位置。很容易可以知道數據寫(xiě)在哪個(gè)地址;無(wú)論是新數據單元還是更新已有的數據單元,都會(huì )寫(xiě)在存儲陣列的末尾。寫(xiě)命令會(huì )搜索陣列的末尾,緊接著(zhù)在最后一個(gè)記錄后寫(xiě)入新的數據單元。假如在當前的存儲頁(yè)面沒(méi)有足夠的空間保存特定長(cháng)度的數據元,就會(huì )出現頁(yè)面結束標志并打開(kāi)一個(gè)新頁(yè)面。圖2是這種典型的數據頁(yè)面的結構。

在這個(gè)數據頁(yè)面中,先寫(xiě)數據單元1,并更新。接著(zhù)寫(xiě)數據單元4,但從不更新。隨后是數據單元3,共更新7次。最后寫(xiě)入數據單元2,從不更新。

頁(yè)面結束標志的出現表明曾執行寫(xiě)操作,但數據單元太長(cháng)不能填入當前頁(yè)面。會(huì )打開(kāi)一個(gè)新頁(yè)面以填寫(xiě)數據單元。在整個(gè)數據結構的末尾會(huì )分配一個(gè)空單元,這里本該是一個(gè)數據單元的報頭。

圖2. 典型的數據頁(yè)面
圖2. 典型的數據頁(yè)面


上一頁(yè) 1 2 下一頁(yè)

評論


相關(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>