본문 바로가기
mobilgene/NvM

[NvM] NvM이란 무엇인가? (Block / Job / Queue 구조 완전 이해)

by Autosar 2026. 4. 23.
반응형

AUTOSAR 프로젝트를 진행하다 보면 전원이 꺼져도 반드시 유지되어야 하는 데이터가 존재한다.

ECU가 동작하는 동안만 필요한 값이 아니라,

차량이 Key Off 된 뒤 다시 시동되더라도 그대로 남아 있어야 하는 정보들이다.

 

대표적인 예시는 다음과 같다.

- 사용자 설정값

- 생산 설정값(EOL Data)

- 진단 관련 데이터

- 누적 동작 횟수

- 보정값(Calibration Value)

- 마지막 동작 상태

 

이러한 데이터를 일반 RAM 변수에만 저장하면 전원이 차단되는 순간 모두 사라진다.

따라서 EEPROM, Flash와 같은 비휘발성 메모리(Non-Volatile Memory) 에 저장해야 한다.

 

하지만 Application 코드가 직접 Flash Driver를 제어하면서 저장과 복구를 처리하면 구조가 복잡해지고,

ECU마다 메모리 구조가 달라질 때마다 코드 수정이 발생한다.

 

AUTOSAR는 이런 문제를 해결하기 위해 NvM(Non-Volatile Memory Manager) 이라는 표준 모듈을 제공한다.

 

이번 글에서는 NvM이 왜 필요한지, 그리고 실무에서 반드시 이해해야 하는 Block / Job / Queue 구조를 중심으로 자세히 정리해본다.

 

1. NvM이란 무엇인가?

 

NvM은 AUTOSAR Basic Software(BSW)에 포함된 메모리 관리 모듈이다.

이름 그대로 비휘발성 메모리에 저장되는 데이터를 관리하는 역할을 담당한다.

 

쉽게 말하면 Application이 직접 Flash나 EEPROM을 다루지 않아도,

NvM을 통해 필요한 데이터를 저장하고 다시 읽어올 수 있도록 중간에서 관리해주는 계층이다.

 

NvM은 단순히 저장 기능만 제공하는 모듈이 아니다. 실제로는 다음과 같은 역할까지 함께 수행한다.

 

- 저장 요청 관리

- 읽기 요청 관리

- 데이터 무결성 검사(CRC)

- 초기값 복구

- 다중 요청 순서 제어

- 시스템 시작 시 전체 데이터 로드

- 시스템 종료 시 전체 데이터 저장

 

즉 NvM은 단순 저장 함수가 아니라, 차량 데이터를 체계적으로 운영하기 위한 관리자라고 보는 것이 맞다.

 

2. 왜 NvM이 필요한가?

 

비휘발성 메모리에 데이터를 저장한다고 해서 무조건 단순한 작업은 아니다.

실제 Flash 또는 EEPROM 제어에는 생각보다 많은 요소가 포함된다.

 

예를 들어 Application이 직접 메모리를 제어한다면 아래와 같은 문제를 모두 고려해야 한다.

 

- 어느 주소에 저장할 것인가?

- 기존 데이터를 지워야 하는가?

- 저장 도중 전원이 꺼지면 어떻게 할 것인가?

- 데이터가 손상되었는지 어떻게 확인할 것인가?

- 동시에 여러 저장 요청이 오면 어떤 순서로 처리할 것인가?

- 버전이 바뀌면 이전 데이터는 어떻게 처리할 것인가?

 

기능이 많아질수록 Application 코드가 저장 로직으로 오염되기 쉽다.

 

NvM을 사용하면 Application은 단순히 “이 데이터를 저장해달라” 또는 “이 데이터를 읽어달라”고 요청하면 된다.

 

예를 들어:

NvM_WriteBlock(BlockId, DataPtr);
NvM_ReadBlock(BlockId, DataPtr);

 

저장 방식, 처리 순서, 무결성 검사는 NvM이 담당한다.

덕분에 Application은 기능 로직에 집중할 수 있다.

 

3. NvM 전체 구조 이해

AUTOSAR_CP_EXP_LayeredSoftwareArchitecture.pdf 본문에서 발췌

 

AUTOSAR에서 NvM은 단독으로 동작하는 모듈이 아니다.

Application이 요청한 저장/읽기 작업을 실제 메모리 하드웨어까지 전달하기 위해 여러 계층과 함께 동작한다.

 

즉 NvM은 메모리 스택의 상위 관리자이고, 하위 계층은 실제 장치 접근과 하드웨어 제어를 담당한다.

 

일반적인 AUTOSAR 메모리 구조는 아래와 같다.

Application / SWC
            ↓
         NvM
            ↓
        MemIf
            ↓
Fee / Ea / MemAcc
            ↓
Memory Driver / HW

 

1. Application / SWC

실제 기능 로직이 동작하는 계층이다.
사용자 설정 저장, 학습값 복구, 카운터 업데이트 등 데이터 저장이 필요한 시점에 NvM API를 호출한다.

즉 “무엇을 저장할지”를 결정하는 계층이다.

 

2. NvM

Non-Volatile Memory Manager의 핵심 계층이다.

Application에서 들어온 요청을 Block 단위로 관리하며, 내부적으로 Job / Queue / 상태 관리 / CRC 검사 등을 수행한다.

 

NvM은 직접 Flash를 제어하지 않고, 상위 요청을 논리적으로 관리하는 역할에 집중한다.

즉 “어떤 데이터를 어떤 정책으로 관리할지”를 담당한다.

 

3. MemIf

Memory Abstraction Interface 계층이다.

NvM과 하위 메모리 드라이버 사이의 공통 인터페이스 역할을 한다.

 

NvM 입장에서는 실제 저장 장치가 Flash인지 EEPROM인지 알 필요가 없다.

MemIf가 공통 API를 제공하기 때문에 동일한 방식으로 하위 계층을 호출할 수 있다.

 

이 구조 덕분에 하드웨어가 변경되어도 상위 NvM 구조는 그대로 유지할 수 있다.

 

4. Fee / Ea / MemAcc

이 계층은 실제 저장 장치 특성에 맞게 데이터를 처리하는 중간 계층이다.

 

- Fee (Flash EEPROM Emulation)

Flash 메모리를 EEPROM처럼 사용할 수 있도록 관리하는 모듈이다.

실제 EEPROM이 없는 MCU에서 매우 자주 사용된다.

 

- Ea (EEPROM Abstraction)

실제 EEPROM 장치를 사용하는 경우 접근을 추상화하는 모듈이다.

 

- MemAcc

최신 AUTOSAR 플랫폼에서 메모리 접근 기능을 확장하기 위해 사용하는 계층이다.

프로젝트 구조에 따라 사용 여부가 달라질 수 있다.

 

즉, 이 계층은 “저장 장치 종류에 맞게 실제 접근 방식을 맞춰주는 계층”이라고 이해하면 된다.

 

5. Memory Driver / HW

가장 하위 계층이며 실제 하드웨어를 제어한다.

(예: Flash Driver (Fls), EEPROM Driver (Eep), 기타 Memory Controller)

실제 Erase, Write, Read 동작은 이 계층에서 수행된다.

 

즉, 최종적으로 데이터가 저장되는 실제 장치 영역이다.

 

4. Block이란 무엇인가?

 

NvM에서 가장 먼저 이해해야 할 핵심 개념은 Block 이다.

 

Block은 NvM이 데이터를 관리하는 최소 단위이다.

즉, NvM은 변수 하나씩 관리하지 않고, 관련 있는 데이터를 묶어서 Block 단위로 저장하고 읽는다.

 

예를 들어 사이드미러 사용자 설정을 생각해보자.

AutoFold = ON
ReverseTilt = OFF
MemoryMode = 2

 

이 값을 각각 따로 저장하는 것이 아니라, 하나의 UserSetting Block 으로 관리할 수 있다.

 

즉, Block은 단순 데이터 묶음이 아니라, 하나의 저장 대상 객체이다.

 

5. Job이란 무엇인가?

 

Block이 저장 대상이라면, Job 은 NvM에게 요청하는 작업 단위이다.

즉, 무엇을 저장할지(Block)와 무엇을 수행할지(Job)는 다른 개념이다.

 

예를 들어 같은 UserSetting Block이라도 다음과 같은 여러 작업이 가능하다.

- 저장(Write)
- 읽기(Read)
- 기본값 복구(Restore Defaults)
- 상태 확인(Get Error Status)

 

즉 Block은 대상이고, Job은 행동이다.

대표적인 Job 예시

- Read Job: 저장된 데이터를 메모리에서 읽어 RAM으로 가져오는 작업이다.

NvM_ReadBlock(USER_BLOCK_ID, &UserSetting);

 

- Write Job: 현재 RAM 데이터를 메모리에 저장하는 작업이다.

NvM_WriteBlock(USER_BLOCK_ID, &UserSetting);

 

- ReadAll Job: 시스템 시작 시 필요한 모든 Block을 한 번에 읽어오는 작업이다.

 

- WriteAll Job: 시스템 종료 전 변경된 데이터를 전체 저장하는 작업이다.

 

- Restore Defaults Job: 저장 데이터가 손상되었거나 초기화가 필요할 때 기본값으로 되돌리는 작업이다.

 

6. Queue란 무엇인가?

 

Queue는 여러 Job이 들어왔을 때 작업들을 순서대로 대기시키는 목록이다.

쉽게 말해 저장 요청이 기다리는 줄이라고 생각하면 된다.

 

예를 들어 동시에 아래 요청이 들어왔다고 가정하자.

 

1. UserSetting 저장

2. LearningValue 저장

3. Counter 읽기

4. DiagnosticData 저장


NvM은 이 요청들을 한 번에 모두 처리하지 않고 Queue에 등록한 뒤 순차적으로 처리한다.

즉, Queue는 단순한 자료구조가 아니라, 시스템 부하를 제어하고 동시 요청 충돌을 방지하는 핵심 장치이다.

 

7. MainFunction은 어떤 역할을 하는가?

 

NvM은 일반적으로 NvM_MainFunction() 에서 Queue에 쌓인 Job을 처리한다.

이 함수는 OS Alarm 또는 Scheduler에 의해 주기적으로 호출된다.

 

예를 들어 5ms마다 MainFunction이 호출된다면:

5ms마다 Queue 확인
→ 대기 Job 실행
→ 상태 갱신
→ 다음 Job 준비

 

즉, Queue에 Job을 넣는 것만으로 끝나는 것이 아니라, MainFunction이 주기적으로 돌아야 실제 작업이 진행된다.

 

그래서 NvM 설정에서 MainFunction 주기는 매우 중요하다.

너무 짧으면 CPU 부하 증가 가능

너무 길면 저장 완료 지연

 

프로젝트 요구사항에 맞게 조정해야 한다.

 

8. 초보자가 자주 헷갈리는 이유

 

NvM을 처음 접하면 Block, Job, Queue가 모두 비슷하게 느껴질 수 있다. 하지만 역할은 명확히 다르다.

 

Block은 저장할 데이터의 단위이고,

Job은 그 데이터에 대해 수행할 작업이며,

Queue는 작업들이 기다리는 순서 목록이다.

 

즉 아래처럼 이해하면 가장 쉽다.

 

Block = 저장 대상

Job   = 요청 작업

Queue = 작업 대기열

 

이 세 가지가 분리되어 있기 때문에 AUTOSAR는 복잡한 저장 구조도 안정적으로 처리할 수 있다.

 

정리

 

NvM은 단순히 데이터를 저장하는 라이브러리가 아니다.

차량의 중요한 데이터를 안전하고 체계적으로 관리하는 표준 메모리 관리자이다.

 

이 구조를 이해하기 위해서는 아래 세 가지 개념을 정확히 구분해야 한다.

 

Block = 저장 데이터 단위

Job   = 수행 요청 단위

Queue = 작업 대기 구조

 

이 세 가지를 이해하고 나면 NvM Overview 설정, Block 설정, Read/Write API 구조까지 훨씬 자연스럽게 보이기 시작한다.

 

다음 글에서는 실제 Mobilgene에서 NvM Common / Block 설정 방법을 보면 이해도가 훨씬 높아질 것이다.


추천 태그 10개

#AUTOSAR
#NvM
#Block
#Queue
#Job
#Embedded
#Mobilgene
#자동차전장
#EEPROM
#FlashMemory

반응형