一、AutoSAR Memory Stack整體概述前言
在AutoSAR架構除了橫向看包含APP/RTE/BSW/MCAL等分層架構之外,對于BSW(包含MCAL)對縱向的不同功能協定棧也作了詳細的劃分,主要包括通信棧、記憶體棧、CDD、IO操作相關的縱向棧、系統服務棧、資訊安全相關的協定棧,今天介紹的NvM屬于記憶體棧的管理子產品,整個記憶體棧在AutoSAR的定義如下所示:
在記憶體棧中包含服務層(NvM)、抽象層(MemIf、EA、EEP、Fee)、MCAL(Fls、SPI等)幾個子產品。
AutoSAR中對NV資料的存儲主要包括片記憶體儲和外部存儲兩種方式。片記憶體儲,是用晶片内部的DFLASH進行資料存儲;外部存儲,是通過外部EEPROM進行存儲,一般會調用SPI、IIC等通信方式外挂EEPROM晶片。
NVM主要提供抽象資料存儲,在上電讀取下電存儲資料,支援Immediately存儲資料,将NV data在ROM和RAM之間建立關聯;MemIf實作存儲資料Block在内部Flash或者外部EEP的分離操作;FEE實作對Flash的資料Block的抽象和動态資料的Layout;Flash Driver提供操作Flash的接口;EA定義外部EEPROM的存儲抽象和資料的Layout;EEP提供外部EEPROM的操作接口和驅動。
二、NvM功能介紹
NvM子產品負責管理和從非易失性記憶體中讀寫資料。在系統啟動和關閉階段,同步應用程式RAM區的資料。此子產品還提供其他服務,例如用于上層資料保護的備援資料單元。同時,RTE提供了簡單靈活和接口(NvData Interface)用于非易失記憶體的資料處理。在AuoSAR架構中NvM的主要功能可以概述為以下幾點:
- 提供了三種Block的管理類型(Native、Redundant、DataSet)
- 支援16bit和32bit的CRC校驗
- 支援資料操作的優先級機制,支援Immediately寫操作
- 給APP提供服務接口,NV Data類型的資料接口在APP層可以直接操作
- NvM與APP的同步機制
- 用于DCM診斷的資料操作
- 支援操作資料讀寫操作的完成以及錯誤的回調通知
- 可以配置的ID處理
在AutoSAR中NvM與多個子產品存在關聯。RTE提供與APP互動的接口;CRCLib用于NV Data存儲時CRC校驗;SchM用于NvM API排程;MemIf提供下層的内部還是外部存儲的區分;BswM在上、下電階段調用ReadAll和WriteAll接口;Dem負責相關DTC等診斷資料的存儲;Det用于檢測開發過程中相關的錯誤。
01、NvM資料操作block介紹
NvM中對資料的操作一般叫做Basic storage objects,Basic storage objects是NvM中存儲的最小單元,在NvM的概念中主要包括下面四種操作實體。
NV Block一般包含了使用者定義的資料,其中相關的header以及CRC作為可選項使用。NV RAM一般和NV Block對應,實作資料到NV Block的讀寫操作,在空間配置設定中可以不用考慮NV RAM的記憶體配置設定位址。NV RAM資料被配置設定到一個SWC或者BSW子產品。
NV ROM資料存在DFlash或者外部的EEPROM中,在程式執行中資料不會改變,在空的或者破壞的ROM中為預設的資料。Administrative Block是NV RAM中必須使用的,包含了DataSet類型的NvM資料管理相關的NV RAM Block的屬性、狀态以及錯誤資訊,能管理NV Block的寫保護,以及上次資料操作的錯誤以及狀态資訊。
02、NvM資料操作類型介紹
NvM資料的管理主要包括三種管理類型,分别是Native NVRAM block、redundant NVRAM block、Dataset NVRAM block。具體對各個Block的使用情況如下所示。
管理類型 | NV 塊 | RAM 塊 | ROM 塊 | 管理塊 |
NVM_BLOCK_NATIVE | 1 | 1 | 0..1 | 1 |
NVM_BLOCK_REDUNDANT | 2 | 1 | 0..1 | 1 |
NVM_BLOCK_DATASET | <256 | 1 | 0..n | 1 |
Native NVRAM block是最簡單的Block形式,該類型包括1個NV Block,1個RAM Block,1個Administrative Blocks;Redundant NVRAM block該類型包括2個NV Block,1個RAM Block,1個Administrative Blocks,通過該類型可以實作資料的備援備份存儲。
Dataset NVRAM是由多個大小相等的資料組成,APP在一次操作中獲得其中的一個元素,每一個DataSet的位置可以通過Administrative Blocks獲得,NvM可以讀取選擇的ROM Block。Dataset NVRAM類型的設計可以根據需要對一個資料在NvRAM中以一定的循環偏移進行存儲,每一次存儲位置可以不同,實作對NvRAM的壽命延長。
03、NvM資料操作同步機制介紹
在NvM對資料的操作過程中存在兩種同步機制,隐式同步和顯式同步。
隐式同步中APP中直接調用NVM的接口對資料進行操作,此種方式不推薦使用共享的RAM Block操作,在NVM中確定RAM Block資料的一緻性(主要同步CRC機制實作)。
顯式同步NVM定義了一個RAM Mirror用于和APP進行資料交換,APP調用NvM_WriteBlock的時候寫資料到RAM Block中,此時資料仍然可以被修改,因為資料還沒有寫到最終的Nv Block,調用NVM資料操作NvMWriteRamBlockToNvM的時候資料被Copy到内部的Mirror中,最後将資料寫到Nv Block。
NVM在讀的時候調用API從NvM_ReadBlock讀取資料,在NvM調用了NvMReadRamBlockFromNvM後資料才真正的從RAM Mirror中Copy到了RAM Block。NvM提供了雙向的控制Callback的路由,實作APP資料的傳輸。
在顯式同步中,采用了Mirror機制更好的防止資料一緻性破壞,但是需要額外的RAM開銷。
04、NvM資料操作類型介紹
NvM在使用的時候需要BSW的NvM進行配置,對資料的操作中在APP可以使用兩種類型的模式,可以定義一個應用層的Nv Component和内置的NvData Inteface實作,在Nv Component中會自動關聯到底層的NvM中定義的Block,在APP也可以采用CS接口直接調用NvM的服務接口。對于資料的操作分為周期寫、下電寫、立刻寫三種。
周期寫:一般很少使用該功能,無論是EEPROM還是内部的Dflash都有一定的刷寫次數的限制。在Nv Component中需要配置對應的周期觸發函數;調用Rte_Write函數的時候會将資料存儲的Flag設定為TRUE;周期到了觸發NvM_WriteBlock操作,同時清除存儲标志;在NvM_MainFunction進行後續的操作。
下電寫:多數NVM相關的資料都是在下電的時候進行資料的存儲,在BswM的Shutdown階段調用WriteAll實作該功能。
在Nv Component中需要配置對應的ShutDown存儲方式;調用NvM_SetRamBlockStatus通知Rte表示資料發生了變化在下電的時候要存儲;調用Rte_Write的時候會将存儲Flag設定,同時設定對應的Evet Flag為TRUE,此時激活對應的函數NvM_SetRamBlockStatus設定變化位,以便執行下電的時候存儲;在BswM執行下電的時候,調用NvM_WriteAll進行所有資料的下電存儲。
立刻寫:對于一些重要的改變的資料,根據情況在資料發生重要變化的時候需要立馬存儲。在調用Rte_Write的時候,資料會存儲到NV Block中,同時會把Direct Flag設定為TRUE,此時的觸發Event Flag被設定為TRUE;此時由于Event的Flag被設定了,作為一個觸發源會去激活相應的Task;
在Task中調用Nvm_WriteBlock的函數,将資料存儲,此時會清除Direct Flag和Event Flag;NvM_WriteBlock的傳遞參數為NULL,一般需要一個永久的RAM(Global的變量.Mirror);在NvM的MainFunction檢視Mirror的狀态;NvMWriteRamBlockToNvM調用将資料放到NvM中,調用EA或者FEE的接口函數,存儲到EEPROM或者FLASH中。
三、NvM配置簡介
在NvM的配置中主要包括BSW層NvM的Descriptor配置、APP層Nv Coponent中的Block配置相關的屬性和NvData Interface配置。
01、NvM的Descriptor定義
NvM的Descriptor定義操作使用的Block Descriptor(主要定義 Block的ID、Length、CRC校驗、優先級等)。
02、NvData Interface連接配接
在Nv Component中定義NvData Interface,在SWC中同樣定義NvData Interface,将SWC的NvData Interface與Nv Component的NvData Interface做Mapping。
03、Nv Component的接口屬性
Nv Component的接口屬性定義主要包括下面參數。
04、Nv Component的Block屬性
在使用Nv Component的定義的時候,除了定義BSW層的NvM Block相關的配置,在Nv Component中也要根據NvData Interface以及BSW定義的NvM的Block做相關的配置,主要包括下面參數:
當NVM觸發NvRAM讀寫資料,都是通過Rte_GetMirror/Rte_SetMirror 更新RAM Block,這些功能在RTE内實作,選擇Support DirctFlag(FALSE:Rte不支援直接觸發寫操作,需要SWC額外的CS接口實作;True)調用寫操作的時候,直接觸發操作寫的Flag)。
具體的配置Workflow大概如下:
- 在ASW中建立一個NvMemoryBlock類型的ASW,并建立對應的SWC
- 在SWC中建立對應的Nv Block的Descriptor(與服務層的Nv Block的内容一緻),并建立對應的資料結構體
- 配置對應的RAM Block、ROM Block以及相關的操作屬性(操作類型、觸發函數、同步方式等)
- 建立Nv Data Interface并建立與RAM Block的Mapping
- 配置周期觸發的函數用于觸發周期的存儲操作
- 在NvM服務層Check對應的ASW的Block配置
- 生成Rte産生周期調用的函數以及SetMirror and GetMirror(主要是對NvBuffer的資料到RAM Block操作的Copy操作) callback 來讀寫Rte中的RamMirror,在操作過程中一般采用加鎖操作避免資料操作過程中被修改。
- 在SWC調用Nv Data Interface的時候實作了資料從RAM Block到SWC定義的變量的讀寫操作