NVRAM Manager (NvM)AUTOSAR Memory Stack Services Layer의 유일한 모듈. Application이 하드웨어 종류를 몰라도 block 단위로 non-volatile data를 읽고 쓸 수 있도록 추상화를 제공한다. NvM은 block 설정에 따라 request를 MemIf로 전달하고, 비동기 작업 완료를 callback/polling으로 알리며, RAM block 일관성 유지에 대한 규약을 application에 부여한다.

Basic Storage Object

NvM이 다루는 block은 저장 위치·용도에 따라 4종으로 구분된다.

Object저장 위치구성
NV BlockEEPROMNV data + (선택) CRC + (선택) block header
RAM BlockRAMRAM data + (선택) CRC + (선택) block header. 전역변수로 선언해야 함
ROM BlockFlashDefault 값. NV Block이 비어있거나 손상됐을 때 App에 제공
Administrative BlockNvM 내부NvM이 block의 상태·에러 정보 관리용으로 사용

Note

“Block”은 EEPROM에 읽고 쓰는 단위를 의미한다.

RAM Block 일관성 제약: Write 요청 후 NvM은 RAM Block의 data를 별도로 저장하지 않는다. 따라서 작업 완료 통지 전까지 application은 RAM Block을 수정해선 안 된다 (읽기는 허용).

Block Type

NvM이 제공하는 block management type은 3종이며, 각 type이 요구하는 NV/RAM/ROM/Administrative block 개수가 다르다.

Management TypeNV BlocksRAM BlocksROM BlocksAdministrative Blocks
NVM_BLOCK_NATIVE110..11
NVM_BLOCK_REDUNDANT210..11
NVM_BLOCK_DATASET1..(m<256)10..n1
  • NATIVE — Write 시 RAM Block data를 EEPROM에 한 번 저장
  • REDUNDANT — Write 시 RAM Block data를 EEPROM에 두 번 저장 (redundancy 확보)
  • DATASET — 여러 개의 NV Block과 ROM Block으로 구성. 원하는 block index를 선택해 read/write. 최대 개수는 NvMDatasetSelectionBits로 지정

NvM Block과 Fee/Ea Block의 연결

NvM Block(논리)은 NvMNvBlockBaseNumber 파라미터로 Fee/Ea Block(물리)에 연결된다. NvMDatasetSelectionBits 설정값을 이용해 하나의 NvM Block에 복수의 물리 block을 할당할 수 있다.

연결 공식

동등 표현:

예시 — NvMDatasetSelectionBits = 2 (NvM Block당 최대 4개 물리 block)

TypeBaseNumberFee/Ea Block Number
Native28
Redundant312, 13 (DataIndex 0/1)
Dataset416, 17, 18 (DataIndex 0/1/2, NvMNvBlockNum=3)

예시 — NvMDatasetSelectionBits = 3 (NvM Block당 최대 8개 물리 block)

TypeBaseNumberFee/Ea Block Number
Native216
Redundant324, 25
Dataset432, 33, 34

Note

Bits 값을 1 올리면 같은 BaseNumber에 대한 물리 block 번호가 2배로 이동한다(shift).

Job Prioritization

NvM은 Block 우선순위 기능을 설정으로 켜고 끌 수 있다.

  • 미사용 — 모든 request를 FCFS(First Come, First Service)로 처리
  • 사용 — 두 개의 Queue 운용:
    • Immediate Write Queue — Priority 0(Crash Data 저장 용도). Immediate Write Job만 수용
    • Standard Queue — Priority others. Immediate read/erase를 포함한 나머지 모든 job

NvM 에러 코드

아래 7종 에러는 DEM(Diagnostic Event Manager)으로 보고된다.

Error Code발생 상황
NVM_E_INTEGRITY_FAILEDAPI request integrity 검증 실패
NVM_E_REQ_FAILEDAPI request 자체가 실패
NVM_E_VERIFY_FAILEDWrite verification 실패
NVM_E_LOSS_OF_REDUNDANCYRedundancy 손실 (REDUNDANT block)
NVM_E_QUEUE_OVERFLOWNVRAM Manager의 job queue overflow
NVM_E_WRITE_PROTECTEDWrite-protected block에 write 시도
NVM_E_WRONG_BLOCK_IDStatic ID check 실패

API Configuration Class

NvM은 HW 자원 수준에 맞춰 3개 Class로 API 집합을 나눈다.

Class특징
Class 1최소 집합. 제한적 HW 리소스 시스템용. 반드시 필요한 API만 포함
Class 2중간 집합
Class 3전체 집합. 모든 지정된 API 호출 가능. 최대 기능 지원

Request type별 분류:

  • Type 1(synchronous, affects one RAM block): NvM_SetDataIndex, NvM_GetDataIndex, NvM_SetBlockProtection, NvM_GetErrorStatus, NvM_SetRamBlockStatus, NvM_SetBlockLockStatus
  • Type 2(asynchronous, affects one NVRAM block; result via callback/polling): NvM_ReadBlock, NvM_WriteBlock, NvM_RestoreBlockDefaults, NvM_EraseNvBlock, NvM_InvalidateNvBlock, NvM_CancelJobs
  • Type 3(asynchronous, handled by NVRAM manager task via request list, affects all NVRAM blocks with permanent RAM data): NvM_ReadAll, NvM_WriteAll, NvM_CancelWriteAll
  • Type 4(synchronous, basic initialization): NvM_Init

Service Implemented by NvM

기본 구조

RTE를 통해 NvM을 사용하기 위한 3가지 dependency:

  1. Application이 NvM의 API(C function)를 호출
  2. Application이 callback을 통해 asynchronous 결과 통지 수신 (optional)
  3. Application이 NvM이 save/restore하는 RAM block에 접근

Synchronization 방식

Application과 NvM이 RAM Block에 접근하는 방식은 2종.

Implicit synchronization

  • Application과 NvM이 같은 RAM Block에 동시 접근 가능
  • RAM Block은 하나의 SW-C에 매핑되는 것을 원칙으로 하며, 공유 시 data 일관성은 application 책임
  • NvM 작업 중 RAM Block의 data를 변경해서는 안 됨

Explicit synchronization

  • NvM이 RAM mirror를 정의하여 application의 RAM block과 데이터 교환
  • Write 흐름: Application이 RAM Block 작성 → NvM write API 호출 → NvM이 RAM mirror 읽기 → mirror → RAM Block → NV Block 순으로 복사
  • Read는 반대 방향. 데이터 전송은 NvM이 호출하는 callback routine으로 양방향 전달

Write·Read 시퀀스 규칙

Write (NvM_WriteBlock):

  1. Application이 EEPROM에 쓸 data를 RAM Block에 기록
  2. NvM_WriteBlock API 호출 (제어권 NvM으로 이관)
  3. Write 완료 전까지 RAM Block을 수정 금지 (읽기는 가능)
  4. NvM_GetErrorStatus polling 또는 callback으로 완료 여부 확인
  5. 완료 후 RAM Block 재사용 가능

Read (NvM_ReadBlock):

  1. Application이 RAM Block을 제공 (NV data가 채워질 공간)
  2. NvM_ReadBlock API 호출
  3. Read 완료 전까지 RAM Block을 읽거나 쓰면 안 됨
  4. NvM_GetErrorStatus polling 또는 callback으로 완료 여부 확인
  5. 완료 후 RAM Block에 새 data로 접근 가능

Warning

같은 RAM Block을 여러 SW-C가 공유하는 경우, NvM은 RAM Block의 data integrity를 보장하지 않는다. Application 측이 상호 접근을 동기화해야 한다.

Ports and Port Interfaces

NvM은 Client/Server Interface로 RTE에 노출되며, Block ID는 API 인자 대신 port defined argument values로 전달된다. 각 NVRAM block마다 하나의 service port를 만든다.

NvM_RequestResultType (결과 코드)

  • NVM_REQ_OK (0) / NVM_REQ_NOT_OK (1)
  • NVM_REQ_PENDING (2)
  • NVM_REQ_INTEGRITY_FAILED (3)
  • NVM_REQ_BLOCK_SKIPPED (4) / NVM_REQ_NV_INVALIDATED (5)
  • NVM_REQ_CANCELED (6) / NVM_REQ_REDUNDANCY_FAILED (7)
  • NVM_REQ_RESTORED_FROM_ROM (8)

4종 Port Interface

Interface용도
NvMService메인 service. GetErrorStatus (항상 제공) / SetDataIndex·GetDataIndex (DataSet 전용) / SetRamBlockStatus (optional config) / ReadBlock·WriteBlock·RestoreBlockDefaults (Class 2·3) / EraseBlock·InvalidateNVBlock (Class 3)
NvMNotifyJobFinishedNvM → SW-C 비동기 완료 통지. JobFinished(ServiceId, JobResult)
NvMNotifyInitBlockInitBlock() — block 초기화 알림
NvMMirrorExplicit synchronization용. ReadRamBlockFromNvm(SrcPtr) / WriteRamBlockToNvm(DstPtr) — RAM mirror 양방향 전송

같이 보기