null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
AUTOSAR 개발자 실전 가이드
Structure
overview
•
AUTOSAR가 필요한 이유
•
AUTOSAR 레이어드 아키텍처 구조
components
•
Core, Partition, OS Application 관계
•
SWC와 Runnable — 실행 단위 이해
rte-ports
•
P-Port, R-Port와 인터페이스 설계
•
Explicit vs Implicit Write — 언제 무엇을 쓰나
autosar-os
•
AUTOSAR OS Task와 ISR 설계
•
Alarm, Counter, Schedule Table 정리
•
OS Application과 메모리 보호 설정
spec-practice
•
MUST vs SHALL vs SHOULD — 스펙 용어 해석법
•
DET 에러 처리 — Det_ReportError와 RuntimeError
com-stack
•
ComSignal에서 PduR까지 — 신호가 CAN 프레임이 되는 경로
•
CanIf부터 CanNm까지 — CAN 통신 스택 계층 분리
diagnostics
•
DEM으로 DTC 관리하기 — 이벤트 상태와 고장 이력
•
DCM과 UDS 서비스 — 진단 통신의 실전 구조
ecum-bswm
•
EcuM 시동/종료 시퀀스 — ECU가 켜지고 꺼지는 순서
•
BswM 모드 전환 — 규칙 기반 상태 관리
nvm-schm
•
NvM 읽기/쓰기 패턴 — 비휘발성 메모리를 안전하게 다루는 방법
•
SchM Exclusive Area — 인터럽트와 Task 간 공유 자원 보호
Flow Structure
BswM 모드 전환 — 규칙 기반 상태 관리
18 / 19
SchM Exclusive Area — 인터럽트와 Task 간 공유 자원 보호
☆ Star
↗ Full
NvM 읽기/쓰기 패턴 — 비휘발성 메모리를 안전하게 다루는 방법
#autosar
#nvm
#non-volatile-memory
#nvram
#eeprom
@devpc
|
2026-05-04 12:39:29
|
GET /api/v1/flows/24/nodes/439?fv=1&nv=1
Context:
Flow v1
→
Node v1
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 순서를 지켜야 한다.
BswM 모드 전환 — 규칙 기반 상태 관리
SchM Exclusive Area — 인터럽트와 Task 간 공유 자원 보호
// COMMENTS
Newest First
ON THIS PAGE
No content selected.