天天看點

Autosar NvM 詳解

一、AutoSAR Memory Stack整體概述前言

在AutoSAR架構除了橫向看包含APP/RTE/BSW/MCAL等分層架構之外,對于BSW(包含MCAL)對縱向的不同功能協定棧也作了詳細的劃分,主要包括通信棧、記憶體棧、CDD、IO操作相關的縱向棧、系統服務棧、資訊安全相關的協定棧,今天介紹的NvM屬于記憶體棧的管理子產品,整個記憶體棧在AutoSAR的定義如下所示:

Autosar NvM 詳解

在記憶體棧中包含服務層(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用于檢測開發過程中相關的錯誤。

Autosar NvM 詳解

01、NvM資料操作block介紹

NvM中對資料的操作一般叫做Basic storage objects,Basic storage objects是NvM中存儲的最小單元,在NvM的概念中主要包括下面四種操作實體。

Autosar 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機制實作)。

Autosar NvM 詳解

顯式同步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資料的傳輸。

Autosar NvM 詳解

在顯式同步中,采用了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進行後續的操作。

Autosar NvM 詳解

下電寫:多數NVM相關的資料都是在下電的時候進行資料的存儲,在BswM的Shutdown階段調用WriteAll實作該功能。

在Nv Component中需要配置對應的ShutDown存儲方式;調用NvM_SetRamBlockStatus通知Rte表示資料發生了變化在下電的時候要存儲;調用Rte_Write的時候會将存儲Flag設定,同時設定對應的Evet Flag為TRUE,此時激活對應的函數NvM_SetRamBlockStatus設定變化位,以便執行下電的時候存儲;在BswM執行下電的時候,調用NvM_WriteAll進行所有資料的下電存儲。

Autosar NvM 詳解

立刻寫:對于一些重要的改變的資料,根據情況在資料發生重要變化的時候需要立馬存儲。在調用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中。

Autosar NvM 詳解

三、NvM配置簡介

在NvM的配置中主要包括BSW層NvM的Descriptor配置、APP層Nv Coponent中的Block配置相關的屬性和NvData Interface配置。

01、NvM的Descriptor定義

NvM的Descriptor定義操作使用的Block Descriptor(主要定義 Block的ID、Length、CRC校驗、優先級等)。

Autosar NvM 詳解

02、NvData Interface連接配接

在Nv Component中定義NvData Interface,在SWC中同樣定義NvData Interface,将SWC的NvData Interface與Nv Component的NvData Interface做Mapping。

Autosar NvM 詳解

03、Nv Component的接口屬性

Nv Component的接口屬性定義主要包括下面參數。

Autosar NvM 詳解

04、Nv Component的Block屬性

在使用Nv Component的定義的時候,除了定義BSW層的NvM Block相關的配置,在Nv Component中也要根據NvData Interface以及BSW定義的NvM的Block做相關的配置,主要包括下面參數:

Autosar NvM 詳解

當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定義的變量的讀寫操作

繼續閱讀