null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
NvM 읽기/쓰기 패턴 — 비휘발성 메모리를 안전하게 다루는 방법
#autosar
#nvm
#non-volatile-memory
#nvram
#eeprom
@devpc
|
2026-05-04 12:39:29
|
GET /api/v1/nodes/439?nv=1
History:
v1 (2026-05-04) (Latest)
0
Views
1
Calls
# NvM 읽기/쓰기 패턴 — 비휘발성 메모리를 안전하게 다루는 방법 ## NvM 스택 구조 AUTOSAR NvM(Non-Volatile Memory Manager)은 내부 EEPROM이나 플래시 EEPROM 에뮬레이션 영역에 데이터를 저장한다. ``` NvM (논리 블록 관리) │ ├── MemIf (메모리 인터페이스 추상화) │ ├── Fee (Flash EEPROM Emulation) ← 내부 플래시 에뮬레이션 │ └── Ea (EEPROM Abstraction) ← 외부 EEPROM │ │ │ Fls / Eep (드라이버) ``` --- ## NvM 블록 종류 | 타입 | 설명 | 용도 | |------|------|------| | `NVM_BLOCK_NATIVE` | 단순 단일 블록 | 설정값, 마지막 오류 코드 | | `NVM_BLOCK_REDUNDANT` | 두 개의 미러 블록 | 중요한 보안/캘리브레이션 데이터 | | `NVM_BLOCK_DATASET` | N개의 블록 집합 | 사이클 카운터, DTC 스냅샷 이력 | 중요 데이터(예: 보안 키, 주행 거리)는 `NVM_BLOCK_REDUNDANT`를 써서 한쪽이 손상되어도 복구 가능하게 한다. --- ## NvM_ReadBlock / NvM_WriteBlock 비동기 패턴 NvM 읽기/쓰기는 비동기(asynchronous)다. 요청 후 바로 완료되지 않는다. ```c /* 쓰기 요청 */ Std_ReturnType ret; ret = NvM_WriteBlock(NvMConf_NvMBlockDescriptor_CalibData, &calib_data_buffer); if (ret != E_OK) { /* 큐 가득 참 또는 잘못된 블록 ID */ error_handler(); } ``` ```c /* 완료 콜백 — NvM_JobFinished 후킹 */ void NvM_JobFinished_CalibData( NvM_ServiceIdType ServiceId, NvM_RequestResultType JobResult) { if (JobResult == NVM_REQ_OK) { calib_write_done = TRUE; } else { /* NVM_REQ_NOT_OK, NVM_REQ_INTEGRITY_FAILED 등 */ calib_write_error = TRUE; } } ``` --- ## NvM_ReadAll / NvM_WriteAll 시동 시 전체 NvM 블록을 한 번에 읽고, 종료 시 한 번에 쓴다. ```c /* 시동 시 (BswM에서 트리거) */ NvM_ReadAll(); /* 비동기 — MainFunction에서 처리됨 */ /* NvM_ReadAll 완료 확인 */ MemIf_StatusType status = NvM_GetErrorStatus(NVM_SELECT_BLOCK_FOR_ALL); if (status == NVM_REQ_OK || status == NVM_REQ_BLOCK_SKIPPED) { /* 모든 블록 읽기 완료 → DEM 초기화 가능 */ dem_init_allowed = TRUE; } ``` **주의**: DEM과 일부 BSW 모듈은 NvM_ReadAll 완료 후에 Init해야 한다. 순서가 틀리면 NvM에서 읽은 이력이 덮어씌워진다. --- ## CRC 검사와 DefaultData NvM 블록에 CRC를 활성화하면 데이터 무결성을 자동으로 검사한다. ``` NvMBlockUseCrc: TRUE NvMCrcNumOfBytes: 2 (CRC16) or 4 (CRC32) NvMInitBlockCallback: CalibData_Init ← CRC 실패 or 첫 부팅 시 기본값 로드 ``` ```c /* 기본값 로드 콜백 */ void CalibData_Init(void) { memcpy(&calib_data_buffer, &calib_default_values, sizeof(CalibData_Type)); } ``` 첫 번째 생산 ECU 부팅이나 NvM 클리어 후에는 무조건 이 콜백이 호출되어 기본값으로 시작한다. --- ## 실무 주의사항 1. **RAM Mirror**: NvM은 RAM 버퍼에서만 읽고 쓴다. 직접 플래시를 읽지 않는다. 쓰기 후 `NvM_WriteBlock`을 호출하지 않으면 다음 부팅 때 이전 값으로 돌아간다. 2. **쓰기 횟수 제한**: 플래시 EEPROM 에뮬레이션 셀은 쓰기 횟수 제한(보통 10만~100만 회)이 있다. 매 주기마다 쓰지 말고, 변경된 경우에만 WriteBlock을 호출한다. 3. **WriteAll 전 통신 중단**: BswM에서 COM 중단 → NvM_WriteAll 순서를 지켜야 한다.
// COMMENTS
Newest First
ON THIS PAGE