관리 메뉴

Leo's Garage

NvM 개요 본문

자동차 및 자동차 SW/AUTOSAR

NvM 개요

LeoBehindK 2023. 7. 26. 00:10
728x90
반응형

ECU의 Memory 저장 및 관리 작업은 이 NvM 모듈에서 이뤄진다. 

제품 수명 주기 내에서 데이터를 지속적으로 저장하고 읽어야 하는 경우는 매우 흔하다. 바로 코 앞에 있는 쉬운 예는 차량의 진단 기능일 것이다. 차량에서 문제가 감지될 때마다 정비사(혹은 여유가 있는 사용자)가 읽을 수 있도록 '어떻게든' 저장해야 한다. 바로 이 때 NvM이 이 역할을 할 수 있다. 

이 특정 사례의 경우에, DEM(진단 이벤트 관리자)이 NvM과 상호작용하여 주행 중에 감지된 진단 오류를 저장하게 된다. 사실 이것은 진단에만 적용되는 것은 아니다. Application에서 데이터에 접근하여 수정하거나, 센서 또는 엑츄에이터를 보정하고, XCP의 특정 Command를 사용할 때 NvM이 관여하는 경우가 있다. 

정리하면, NvM은 비휘발성 메모리에 대한 읽기 및 쓰기를 처리하는데 동기 혹은 비동기 작업을 수행하는 API들과 Application 사이에서 상호작용할 수 있는 다양한 서비스 포트를 제공한다. 

NvM은 내부적으로 비휘발성 메모리가 저장되는 기본적인 저장 객체, 블록을 정의한다.

Nv Block : Nv Data와 메모리 무결성을 확인할 수있는 Selective CRC value가 포함된 메모리 영역을 의미한다.

RAM Block : CRC를 포함할 수도 있는 RAM의 메모리 영역이다. 여기에서는 임시 또는 영구 사용자 데이터를 가지고 있을 수 있다. 후자를 지정할 시, 주소를 알 수 있다. 이 Block들은 서로 인접해서 배치할 필요는 없다.

ROM Block : ROM에 있으며, Block이 비거나 손상된 경우에 기본 데이터를 제공하는 역할을 한다. 

Administrative Block : RAM에 위치하며, DataSet Nv Block과 연결할 때 사용되는 Block Index를 포함한다. 여기에 연결된 Nv Block의 속성과 오류 상태, 유효성 상태가 저장된다. 이 Block은 Application에게는 보이지 않는다.

이 Administrative Block에 연결되면서 Nv Block들에 속성에는 총 3가지가 있는데 이들은 데이터 손상 시, 이를 처리하는 방법에 차이가 있다. 

- Native NvM Block : 가장 단순한 형태이다. 최소한의 오버헤드를 가진 Block을 제공한다. Single Nv Block, RAM Block 그리고 선택적으로 ROM Block, Administrative Block을 포함한다.

- Redundant NvM Blcok : Native Block에 추가하여 데이터 손상에 따른 메커니즘을 제공한다. 기본 NvM Block에 비해서 여분의 Nv Block이 포함되어 중복성을 추가한다.

- DataSet NvM Block : 동일한 크기의 Block(Nv 또는 ROM)으로 구성된 배열형태이다. 그 안에 있는 각 블록의 인덱스의 위치는 Administrative Block에서 제공한다. 최대 블록 수는 Nv 블록과 ROM 블록의 합으로 255개이다.

NvM의 설정과 관련하여 EcuM(Ecu State Manager)은 NvM_Init API를 통해서 NvM을 초기화할 수 있는 유일한 모듈이다. RAM 데이터 블록을 초기화하려면 또 다른 API가 필요한데, 이 역시 EcuM이 담당하고 있는 NvM_ReadAll이다. 추가적으로 API들에 대해 알아보자.

 

NvM_Init : NvM 모듈을 초기화한다. 메모리 스택의 기본 모듈은 초기화하지 않는다. 이 기본 모듈들(fls, fee등)의 초기화 또한 EcuM이 관장하므로 NvM_Init이 호출되기 전에 수행시켜야 한다.

 

NvM_ReadAll : RAM 데이터 블록을 초기화한다. ECU 초기화의 초기 시점에 준비해야하는 중요한 블록의 경우에는 index를 낮게 설정해야 먼저 처리가 가능하다. 예를 들어 DEM 용 NvM 블록에 대해 이 작업을 할 수 있다.

 

NvM_WriteAll : 종료 시에 EcuM에 의해서 호출되는 NvM의 종료 프로시져이다. RAM에 있던 데이터를 NvRAM에 동기화시킨다.

Std_ReturnType NvM_ReadBlock(NvM_BlockIdType BlockID, const uint8* NvM_DstPtr) : NvM 블록을 NvM_DstPtr로 읽는다. 

 

Std_ReturnType NvM_WriteBlock(NvM_BlockIdType BlockID, const uint8* NvM_SrcPtr) : NvM 블록에 NvM_SrcPtr의 내용을 쓴다. 또한 블록 보호가 있는지 혹은 블록이 한 번만 쓰이게 되어있는지도 확인이 가능하다.

 

Std_ReturnType NvM_InvalidateNvBlock(NvM_BlockIdType BlockId) : 비휘발성 블록을 무효화하여 더 이상 블록을 읽을 수 없게 한다.


Std_ReturnType NvM_EraseNvBlock(NvM_BlockIdType BlockId) : NV 블록을 지운다. 블록이 중복되면 둘 다 지워진다.


Std_ReturnType NvM_RestoreBlockDefaults(NvM_BlockIdType BlockId, uint8* NvM_DestPtr) : 블록을 기본값으로 복원한다. 오류 복구 메커니즘으로 사용할 수 있다.


Std_ReturnType NvM_GetErrorStatus(NvM_BlockIdType BlockId, uint8* RequestResultPtr) : 블록의 관리 정보에 저장된 NvM 블록의 에러 상태를 조회한다.


Std_ReturnType NvM_SetBlockProtection(NvM_BlockIdType BlockId, boolean ProtectionEnabled) : NvM 블록의 쓰기 보호를 설정하거나 리셋한다.


포트와 인터페이스의 경우, NvM_SetBlockProtection을 제외한 모든 블록 관련 서비스에 대한 서비스 인터페이스를 마음대로 사용할 수 있으며, 알림 콜백을 위한 클라이언트-서버 인터페이스를 가질 수 있다. 블록의 관리 서비스와 관련된 CS 인터페이스용 포트도 가질 수 있다. 데이터를 읽고 쓰기 위해서는 이전 글에서 다룬 것처럼 Sender-Receiver 인터페이스가 있다.

NvData 발신자(왼쪽) 및 NvData 수신자(오른쪽) 포트 기호

728x90
반응형
Comments