AUTOSAR存儲模塊的解釋文章很多,本文整理存儲模塊基礎(chǔ)知識。
存儲基礎(chǔ)知識
FEE(Flash EEPROM Emulation),即Flash模擬EEPROM。目前主流的應(yīng)用,為什么要用Flash模擬EEPROM?
下面我們來看下兩者之間的區(qū)別。
Non-volatile memory,非易失性存儲器,就是斷電后可以保存數(shù)據(jù)的存儲器,Flash和EEPROM都屬于這類存儲器,可是它們兩者之間還是有很多不同,主要有以下幾個方面:
1.擦寫方式不同
Flash:分為若干個Page,擦除的時候會整片擦除,寫的時候必須該位為1才可以寫進(jìn)去,所以說,每次在Flash里修改數(shù)據(jù)的時候,要先擦除再寫入。
EEPROM:寫之前可以不需要擦除直接修改,可以修改單字節(jié),讀寫速度較慢一點。
2.擦寫次數(shù)
Flash較EEPROM較少。
3.從經(jīng)濟(jì)角度來看
很多芯片取消了EEPROM,用Flash模擬EEPROM來代替EEPROM以降低成本。
4.面向的需求不同
Flash:一般存儲一些不容易改變的數(shù)據(jù),如車輛的一些出廠數(shù)據(jù)(VIN碼)等,因為這些數(shù)據(jù)不需要時常改變,所以存在Flash里就可以。
EEPROM:一般存儲一些容易改變的數(shù)據(jù),如故障診斷中的DTC,如果將其存在Flash里面就會不停地去擦寫Flash,并且擦除面積較大,不利于操作。
FEE: 在MCU 中有一塊非易失性存儲器我們稱之為Data Flash , 在AUTOSAR FEE/FLS 規(guī)范中,通過DATA FLASH 模擬EEP的形式將數(shù)據(jù)存儲在Data Flash中。
Flash的基本概念
頁(Page)、扇區(qū)(Sector)、塊(Block)
Page:
由若干個字節(jié)所組成,是讀寫的最小單元, 比如 Page:8 bytes, 也就意味著即使向DATA FLASH 寫入一個字節(jié),也會占用Page 這么大的空間。
邏輯扇區(qū),擦除的最小單元,其由若干Page所構(gòu)成,比如 Logical Section :2K 意味著擦除的最小單元式2K Bytes
Physical Section:
物理扇區(qū)由多個邏輯扇區(qū)所構(gòu)成 比如 Physical Section :20K,那么其由10個邏輯扇區(qū)所構(gòu)成,一個Physical Sector包含多個Logical Sector。
塊:
比扇區(qū)更高一個等級,一般1塊包含多個扇區(qū)和扇區(qū)一個級別的SubSector,和塊一個級別的Bank、Bulk等。
塊(bank) > 扇區(qū)(sector) > 頁(page)
寫入操作
EEPROM通常是以一個Byte或者Word為單位寫入和擦除的,即擦寫是以Byte或Word為邊界,這樣就使得EEPROM擦寫比較獨立自由,也不會影響其他數(shù)據(jù)。另外,EEPROM的擦寫壽命是比較高的,達(dá)百萬次。
在每個存儲單元保存一位信息的 EEPROM 和Flash中,存儲單元的默認(rèn)擦除狀態(tài)讀取為二進(jìn)制 1。對存儲單元進(jìn)行編程會將其值從二進(jìn)制 1 更改為二進(jìn)制 0,并且擦除存儲單元會更改其值 值從 0 到 1。
編程不能反向工作:只有擦除操作才能將存儲單元的值從 0 更改為 1 。
Flash通常是以Word或Double-Word為寫入單位,但是擦除卻以Block為單位,這個Block大小往往又是以KB衡量的。這些都是半導(dǎo)體制造工藝或設(shè)計特性有關(guān),這也使得Flash的容量非常大,但擦寫壽命很短。
Flash Memory 具有質(zhì)量輕、能耗低、體積小、抗震能力強(qiáng)等的優(yōu)點,但也有不少局限性,主要如下:
需要先擦除再寫入
Flash Memory 寫入數(shù)據(jù)時有一定的限制。它只能將當(dāng)前為 1 的比特改寫為 0,而無法將已經(jīng)為 0 的比特改寫為 1,只有在擦除的操作中,才能把整塊的比特改寫為 1。
塊擦除次數(shù)有限
Flash Memory 的每個數(shù)據(jù)塊都有擦除次數(shù)的限制(十萬到百萬次不等),擦寫超過一定次數(shù)后,該數(shù)據(jù)塊將無法可靠存儲數(shù)據(jù),成為壞塊。
為了最大化的延長 Flash Memory 的壽命,在軟件上需要做擦寫均衡(Wear Leveling),通過分散寫入、動態(tài)映射等手段均衡使用各個數(shù)據(jù)塊。同時,軟件還需要進(jìn)行壞塊管理(Bad Block Management,BBM),標(biāo)識壞塊,不讓壞塊參與數(shù)據(jù)存儲。
讀寫干擾
由于硬件實現(xiàn)上的物理特性,F(xiàn)lash Memory 在進(jìn)行讀寫操作時,有可能會導(dǎo)致鄰近的其他比特發(fā)生位翻轉(zhuǎn),導(dǎo)致數(shù)據(jù)異常。這種異??梢酝ㄟ^重新擦除來恢復(fù)。Flash Memory 應(yīng)用中通常會使用 ECC 等算法進(jìn)行錯誤檢測和數(shù)據(jù)修正。
電荷泄漏
存儲在 Flash Memory 存儲單元的電荷,如果長期沒有使用,會發(fā)生電荷泄漏,導(dǎo)致數(shù)據(jù)錯誤。不過這個時間比較長,一般十年左右。此種異常是非永久性的,重新擦除可以恢復(fù)。
AUTOSAR標(biāo)準(zhǔn)化的存儲模塊
AutoSAR中對NVM數(shù)據(jù)的存儲主要包括片內(nèi)存儲和外部存儲兩種方式: 片內(nèi)存儲,是用芯片內(nèi)部的DFLASH進(jìn)行數(shù)據(jù)存儲; 外部存儲,是通過外部EEPROM進(jìn)行存儲,一般會調(diào)用SPI、IIC等通信方式外掛EEPROM芯片。
AUTOSAR分層架構(gòu)中的存儲器堆棧由以下模塊組成,它為上層應(yīng)用層和基礎(chǔ)軟件提供基本的內(nèi)存管理服務(wù)。
非易失性存儲器管理器 - NVM(服務(wù)層)
存儲器接口 - MemIf(ECU抽象層)
Flash EEPROM模擬 - FEE(ECU抽象層)
EEPROM抽象 - EA (ECU 抽象層)
Flash 驅(qū)動程序 - Fls(MCAL 層)
EEPROM 驅(qū)動程序 - Eep(MCAL 層)。
NVM主要提供抽象數(shù)據(jù)存儲,在上電讀取下電存儲數(shù)據(jù),支持Immediately存儲數(shù)據(jù),將NV data在ROM和RAM之間建立關(guān)聯(lián); MemIf實現(xiàn)存儲數(shù)據(jù)Block在內(nèi)部Flash或者外部EEP的分離操作; FEE實現(xiàn)對Flash的數(shù)據(jù)Block的抽象和動態(tài)數(shù)據(jù)的Layout; Flash Driver提供操作Flash的接口; EA定義外部EEPROM的存儲抽象和數(shù)據(jù)的Layout; EEP提供外部EEPROM的操作接口和驅(qū)動。
詳細(xì)簡要各模塊
NVM模塊
Autosar NVM位于基礎(chǔ)軟件的服務(wù)層,并為為所有NV data的(初始化、讀、寫、控制)維護(hù)以及管理作提供了各種同步/異步服務(wù)。
無論是EEPROM還是Flash模擬,都在這層被抽象為同一類型,直到MemIf層才會做出區(qū)分,NVM模塊上層是RTE,下層是對接Flash Driver或者EEPROM Driver的接口,NVM就是屬于一個連接上層APP和底層的一個接口,應(yīng)用層在執(zhí)行一些和存儲相關(guān)的服務(wù)如寫數(shù)據(jù)或者更新DTC的時候,會調(diào)用NVM里面的函數(shù),而NVM又根據(jù)不同的需求,整合了分別調(diào)用Flash模擬和EEPROM的接口。
NvM數(shù)據(jù)操作過程中的同步機(jī)制
NvM模塊為應(yīng)用程序或基礎(chǔ)軟件提供基本的同步和異步服務(wù)。
同步服務(wù):
同步服務(wù)是一種阻塞式服務(wù)調(diào)用,其中程序輪詢服務(wù)是否完成,只有在服務(wù)完成時才返回執(zhí)行。APP中直接調(diào)用NVM的接口對數(shù)據(jù)進(jìn)行操作,此種方式不推薦使用共享的RAM Block操作,在NVM中確保RAM Block數(shù)據(jù)的一致性(主要同步CRC機(jī)制實現(xiàn))。
異步服務(wù):
異步服務(wù)是一種非阻塞服務(wù)調(diào)用,其中對服務(wù)的請求被放置在隊列中,并且通過在塊配置期間配置的回調(diào)例程通知上層服務(wù)完成。
NVM定義了一個RAM Mirror用于和APP進(jìn)行數(shù)據(jù)交換,APP調(diào)用NvM_WriteBlock的時候?qū)憯?shù)據(jù)到RAM Block中,此時數(shù)據(jù)仍然可以被修改,因為數(shù)據(jù)還沒有寫到最終的Nv Block,調(diào)用NVM數(shù)據(jù)操作NvMWriteRamBlockToNvM的時候數(shù)據(jù)被Copy到內(nèi)部的Mirror中,最后將數(shù)據(jù)寫到Nv Block。
NVRAM 數(shù)據(jù)操作Block
NvM中對數(shù)據(jù)的操作一般叫做Basic storage objects,Basic storage objects是NvM中存儲的最小單元。
Memory Service 通過將數(shù)據(jù)元素抽象成Block 進(jìn)行統(tǒng)一管理,NvM所有的功能都是以Block為單元。
NvM管理的Block包含四種 NVRAM Block,分別為NV Block,RAM Block,ROM Block,Administrative Block。
NV block
是存儲NV變量的基本結(jié)構(gòu),位于非易失性存儲器中, 用于保存非易失數(shù)據(jù)。
RAM Block
由于NV變量的寫入與讀取都是一件相對較慢的操作,而應(yīng)用層邏輯操作周期速度又太快。直接操作NV block顯然不合適,所以在進(jìn)行讀寫之前,我們會建議一個同樣大小的Ram空間來操作、使用、存放這些還沒有被寫入或者讀取的NV值。
ROM block
用于存儲默認(rèn)值,以便當(dāng)NV block數(shù)據(jù)出現(xiàn)損壞時予以替換。
Administrative block
是專門用于對NVRAM Block 與RAM blcok 的數(shù)據(jù)安全性進(jìn)行管理而設(shè)計的,Administrative Block是NV RAM中必須使用的,包含了DataSet類型的NvM數(shù)據(jù)管理相關(guān)的NV RAM Block的屬性、狀態(tài)以及錯誤信息,能管理NV Block的寫保護(hù),以及上次數(shù)據(jù)操作的錯誤以及狀態(tài)信息,它對應(yīng)用層并不可見。
NvM數(shù)據(jù)的管理主要包括三種管理類型:
NVM_BLOCK_NATIVE
NVM_BLOCK_REDUNDANT
NVM_BLOCK_DATASET
Native NVRAM block
是最簡單的Block形式,該類型包括:
1個NV Block,1個RAM Block,1個Administrative Blocks
NVM_BLOCK_REDUNDANT
類型的Block 包含兩個 NV Block,1個RAM Block,1個Administrative Blocks,且兩 NV Block 中保存的數(shù)據(jù)互為備份, 提高了數(shù)據(jù)安全性。
NVM_BLOCK_DATASET
類型的 Block 可根據(jù)需求配置多個 NV Block 或 ROM Block 并通過索引選擇操作對象,提高了系統(tǒng)的靈活性,每一個DataSet的位置可以通過Administrative Blocks獲得,NvM可以讀取選擇的ROM Block。
Dataset NVRAM類型的設(shè)計可以根據(jù)需要對一個數(shù)據(jù)在NvRAM中以一定的循環(huán)偏移進(jìn)行存儲,每一次存儲位置可以不同,實現(xiàn)對NvRAM的壽命延長。
MemIf模塊
Memory Abstraction Interface (MemIf)作為接口抽象層, 為 NvM 提供訪問 Fee/Ea 模塊的函數(shù),NvM借此抽象成硬件無關(guān)的模塊。
MemIf 通過Device Id將Fee 與EA 的相關(guān)接口抽象成MemIf接口供NvM訪問。
MemIf 可以同時管理EA 和FEE,通過NvM Block 的 DeviceId 配置屬性,進(jìn)行識別,在訪問對應(yīng)的Device Api :
EA 的Device ID 0 和Fee 的Device ID 1
FEE模塊
Fee(Flash Eeprom Emulation), 顧名思義就是Flash 模擬Eeprom. 那么為何不直接使用Eeprom,或者說Flash為什么需要模擬Eeprom。
Flash 與 EEP 都屬于非易失存儲器(Non-Valatile Memory),主要存在以下幾點區(qū)別:
成本
同樣的存儲空間,EEP比Flash貴上許多,因此一般MCU上Flash空間要比EEPROM 空間大
擦寫方式
Flash 以Page為單位,擦除的時候 必須按照Page 為單位擦住,同時寫入的時候,只能寫1,也就是由0->1,因此如果要改寫某個Page的一個Byte,那么必須先將Page的內(nèi)容全部讀到Ram,然后改寫Ram中對應(yīng)的變量,然后擦除該Page,最后把Ram修改后的值寫入到Page,也就是需要以下三步:讀->改->寫
Eeprom 支持按照Byte直接修改
Fee,就是將Flash的寫入操作,通過軟件的模擬成EEP。
模擬EEP寫入方式
Fee 通過 Fls 模塊操作 DataFlash, DataFlash 具有如下物理特性:
按頁寫入,寫數(shù)據(jù)需為物理頁的整數(shù)倍, 否則需做字節(jié)補(bǔ)齊。
寫入前需確保此段空間未被寫入過數(shù)據(jù), 否則需要擦除后再寫入數(shù)據(jù)。最小擦除單位為整個物理扇區(qū)。
Fee 的寫入單元是Block,Fee Block 是繼承自NvM Block,在NvM Block 數(shù)據(jù)的基礎(chǔ)上加上Fee Block Header數(shù)據(jù),形成Fee Block。
Fee 寫入Block 按照先寫入,地址就靠前的原則,下次寫入Block 就依次往后排。這樣確保每次寫入都不需要擦除。
Fee翻頁機(jī)制
Fee 通過對Flash空間整體劃分為兩個邏輯Sector, 一個作為Active Sector,一個作為Inactive Sector。這兩個Sector 由一個或者多個物理Sector組成。
在任意時間,只能有一個Logical Sector在作為 Active Sector只有當(dāng)Active Sector,如何寫入下一個Block,或者達(dá)到配置的剩余空間,那么就會進(jìn)行翻頁操作。
翻頁操作一般會經(jīng)歷如下幾個步驟:
將所有Block的最新數(shù)據(jù)寫入到Inactive Sertor
擦除Active,設(shè)置Inactive Sector為Active
注意,這里翻頁操作時,并沒有將所有的數(shù)據(jù)都由Active Sector搬運到Inactive Sector,而是將所有Block的最新數(shù)據(jù)搬運到Inactive Sector。
假設(shè)我們的MCU的Data Flash有兩個扇區(qū),將兩個扇區(qū)分別標(biāo)記為邏輯扇區(qū)1(logical sector 1)和邏輯扇區(qū)2(logical sector 2)。
假設(shè)我們要用Flash模擬EEPROM來存儲DTC,我們都知道DTC是個很小的數(shù)據(jù),但是更新可能會比較頻繁,如下圖:
首先,邏輯扇區(qū)1(logical sector 1)是空白的等待我們寫入數(shù)據(jù),屬于工作片區(qū)(Actived)。
假設(shè)Flash一次性可以寫8個字節(jié),我們可以這樣劃分:前4個字節(jié)來存儲DTC標(biāo)識,后4個字節(jié)來存儲具體DTC,每次DTC有更新我們就接著往沒有被寫到的空間更新數(shù)據(jù),直到邏輯扇區(qū)1(logical sector 1)被寫滿,我們將最新的DTC數(shù)據(jù)復(fù)制進(jìn)邏輯扇區(qū)2(logical sector 2)里面,然后擦除整片邏輯扇區(qū)1(logical sector 1)。
這時,邏輯扇區(qū)1(logical sector 1)狀態(tài)變成(Not Actived)待工作片區(qū),邏輯扇區(qū)2(logical sector 2)變成(Actived)工作片區(qū),等邏輯扇區(qū)2(logical sector 2)寫滿再將最新數(shù)據(jù)復(fù)制到邏輯扇區(qū)1(logical sector 1),然后擦除邏輯扇區(qū)2(logical sector 2),這樣來回反復(fù),大致工作流程是這樣的。
Fee 初始化讀取地址
Fee 提供地址管理機(jī)制,F(xiàn)ee 會在Ram中實施記錄所有Block的當(dāng)前地址和狀態(tài),在Block寫入新的數(shù)據(jù)時,又會更新這個地址。
這些地址主要用于Fee讀取Block數(shù)據(jù)。
在Fee進(jìn)行初始化之前,這些Block地址是未知的,因此需要在Fee 初始化階段,需要從Flash 遍歷得到當(dāng)前Blcok的地址。
EA模塊
由于EEP是可以支持直接寫入的,因此存儲在Eep的Block地址都是固定的,EA模塊為EEPROM 硬件抽象層, 通過訪問下層 Eep 模塊提供的 API 操作 EEPROM 硬件, EEPROM 具有如下物理特性:
可按字節(jié)寫入,寫入前不需執(zhí)行數(shù)據(jù)擦除操作。
Ea 可為每個 Block 確定具體的硬件存儲地址并劃分存儲空間,NvM 在執(zhí)行讀/寫等服務(wù)時,通過 Ea 完成相應(yīng) Block 的地址映射即可操作EEPROM 硬件中數(shù)據(jù)。
EA地址管理
通過獲取 NvM Block 的類型、 長度等配置, Ea 按照各 Block 的長度為其分配地址空間,從 0 地址起依次向后排列。
EA Block 寫入管理
EA Block 中包含塊狀態(tài)標(biāo)識位,該標(biāo)識位會存入 Eeprom 中,通過該字段可以判斷當(dāng)前 Block 是否有效。
在讀任務(wù)若發(fā)現(xiàn)標(biāo)識位為無效的狀態(tài),則直接向上層返回 MEMIF_BLOCK_INVALID 失敗狀態(tài);
若發(fā)現(xiàn)標(biāo)識位不為有效/無效值,則直接向上層返回 MEMIF_BLOCK_INCONSISTENT失敗狀態(tài)。
FLS模塊
Flash驅(qū)動提供獨立于硬件訪問Flash內(nèi)存的機(jī)制,提供用于讀寫和擦除Flash的服務(wù)驅(qū)動。
審核編輯:湯梓紅
評論