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 Block | EEPROM | NV data + (선택) CRC + (선택) block header |
| RAM Block | RAM | RAM data + (선택) CRC + (선택) block header. 전역변수로 선언해야 함 |
| ROM Block | Flash | Default 값. NV Block이 비어있거나 손상됐을 때 App에 제공 |
| Administrative Block | NvM 내부 | 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 Type | NV Blocks | RAM Blocks | ROM Blocks | Administrative Blocks |
|---|---|---|---|---|
| NVM_BLOCK_NATIVE | 1 | 1 | 0..1 | 1 |
| NVM_BLOCK_REDUNDANT | 2 | 1 | 0..1 | 1 |
| NVM_BLOCK_DATASET | 1..(m<256) | 1 | 0..n | 1 |
- 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)
| Type | BaseNumber | Fee/Ea Block Number |
|---|---|---|
| Native | 2 | 8 |
| Redundant | 3 | 12, 13 (DataIndex 0/1) |
| Dataset | 4 | 16, 17, 18 (DataIndex 0/1/2, NvMNvBlockNum=3) |
예시 — NvMDatasetSelectionBits = 3 (NvM Block당 최대 8개 물리 block)
| Type | BaseNumber | Fee/Ea Block Number |
|---|---|---|
| Native | 2 | 16 |
| Redundant | 3 | 24, 25 |
| Dataset | 4 | 32, 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_FAILED | API request integrity 검증 실패 |
NVM_E_REQ_FAILED | API request 자체가 실패 |
NVM_E_VERIFY_FAILED | Write verification 실패 |
NVM_E_LOSS_OF_REDUNDANCY | Redundancy 손실 (REDUNDANT block) |
NVM_E_QUEUE_OVERFLOW | NVRAM Manager의 job queue overflow |
NVM_E_WRITE_PROTECTED | Write-protected block에 write 시도 |
NVM_E_WRONG_BLOCK_ID | Static 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:
- Application이 NvM의 API(C function)를 호출
- Application이 callback을 통해 asynchronous 결과 통지 수신 (optional)
- 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):
- Application이 EEPROM에 쓸 data를 RAM Block에 기록
NvM_WriteBlockAPI 호출 (제어권 NvM으로 이관)- Write 완료 전까지 RAM Block을 수정 금지 (읽기는 가능)
NvM_GetErrorStatuspolling 또는 callback으로 완료 여부 확인- 완료 후 RAM Block 재사용 가능
Read (NvM_ReadBlock):
- Application이 RAM Block을 제공 (NV data가 채워질 공간)
NvM_ReadBlockAPI 호출- Read 완료 전까지 RAM Block을 읽거나 쓰면 안 됨
NvM_GetErrorStatuspolling 또는 callback으로 완료 여부 확인- 완료 후 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) |
| NvMNotifyJobFinished | NvM → SW-C 비동기 완료 통지. JobFinished(ServiceId, JobResult) |
| NvMNotifyInitBlock | InitBlock() — block 초기화 알림 |
| NvMMirror | Explicit synchronization용. ReadRamBlockFromNvm(SrcPtr) / WriteRamBlockToNvm(DstPtr) — RAM mirror 양방향 전송 |