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
NvM 읽기/쓰기 패턴 — 비휘발성 메모리를 안전하게 다루는 방법
19 / 19
Next
☆ Star
↗ Full
SchM Exclusive Area — 인터럽트와 Task 간 공유 자원 보호
#autosar
#schm
#schedule-manager
#exclusive-area
#critical-section
@devpc
|
2026-05-04 12:39:29
|
GET /api/v1/flows/24/nodes/440?fv=1&nv=1
Context:
Flow v1
→
Node v1
0
Views
1
Calls
# SchM Exclusive Area — 인터럽트와 Task 간 공유 자원 보호 ## 공유 자원 문제 멀티태스킹 환경에서 전역 변수나 하드웨어 레지스터를 여러 Task/ISR에서 동시에 접근하면 데이터가 깨진다. ```c /* 문제 상황 */ uint32 global_counter = 0; TASK(Task_10ms) { global_counter++; /* ← 읽기/수정/쓰기 중간에 ISR이 끼어들면? */ } ISR(Counter_ISR) { global_counter++; /* ← Task가 읽기 후 ISR이 수정 → Task 쓰기가 덮어씀 */ } ``` --- ## SchM Exclusive Area — AUTOSAR의 해결책 AUTOSAR에서는 `GetResource`(OS 레벨) 대신 SchM(Schedule Manager)의 Exclusive Area를 쓰는 것이 권장된다. SWC 코드가 OS에 직접 의존하지 않게 된다. ```c /* RTE 생성 코드가 이렇게 만들어줌 */ #define SchM_Enter_Module_EXCLUSIVE_AREA_0() \ SuspendAllInterrupts() #define SchM_Exit_Module_EXCLUSIVE_AREA_0() \ ResumeAllInterrupts() ``` ```c /* SWC 또는 BSW 모듈에서 사용 */ SchM_Enter_MyModule_EXCLUSIVE_AREA_0(); /* 공유 자원 안전 접근 */ shared_data = new_value; SchM_Exit_MyModule_EXCLUSIVE_AREA_0(); ``` --- ## SuspendAllInterrupts vs SuspendOSInterrupts | API | 중단 범위 | 사용 상황 | |-----|----------|---------| | `SuspendAllInterrupts` | 모든 인터럽트 (ISR1 포함) | 하드웨어 레지스터 직접 접근 | | `SuspendOSInterrupts` | OS 관리 인터럽트만 (ISR2) | Task 간 공유 데이터 보호 | | `GetResource` | Priority Ceiling | Task 간 보호 (ISR 영향 없음) | 임베디드 시스템에서 `SuspendAllInterrupts` 구간은 최대한 짧게 유지해야 한다. 타이머 틱을 놓치거나 CAN 수신 버퍼가 오버플로우될 수 있다. --- ## Exclusive Area 설정 arxml에서 어떤 API가 어떤 Exclusive Area를 사용하는지 선언한다: ``` SwcInternalBehavior ExclusiveArea: AREA_SHARED_BUFFER → Runnable_ProcessData: requires AREA_SHARED_BUFFER → Runnable_ReceiveData: requires AREA_SHARED_BUFFER ``` RTE 제너레이터가 이 정보를 기반으로 `SchM_Enter_*` / `SchM_Exit_*` 매크로를 생성한다. --- ## RTE Data Consistency — 다른 접근법 Exclusive Area 대신 RTE의 데이터 일관성 메커니즘을 쓸 수도 있다. **Buffered Port**: 수신/송신 포트에 버퍼를 두어 데이터 복사 시 원자성을 보장한다. 코드에서 따로 보호 코드를 쓸 필요가 없다. ```c /* Explicit Read — RTE가 원자적 복사를 보장 */ Rte_Read_Port_Signal(&local_copy); /* 이후 local_copy는 안전 */ process(local_copy); ``` Port가 `ExplicitCommunication`으로 설정되어 있고 SWC가 버퍼를 직접 공유하지 않는다면 Exclusive Area가 불필요하다. --- ## 실무 체크리스트 1. **공유 전역 변수는 무조건 Exclusive Area로 감싼다** — "설마 끊기겠어" 하고 지나친 코드가 필드에서 간헐적 오동작을 일으킨다. 2. **Exclusive Area 내에서 API 호출 금지** — NvM_WriteBlock, Com_SendSignal 등 블로킹 가능성이 있는 API는 임계 구역 밖에서 호출한다. 3. **중단 시간 측정** — 오실로스코프나 타이밍 분석 툴로 Exclusive Area의 실제 중단 시간을 측정한다. 1µs 이상이면 아키텍처를 재검토한다. 4. **GetResource vs SchM_Enter 선택 기준**: Task 간 보호만 필요하면 GetResource, ISR과 Task 간 보호가 필요하면 SuspendOSInterrupts 계열을 쓴다.
NvM 읽기/쓰기 패턴 — 비휘발성 메모리를 안전하게 다루는 방법
Next
// COMMENTS
Newest First
ON THIS PAGE
No content selected.