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