OSEK 리소스 (Resource) — VDX의 임계 영역(critical section) 보호 메커니즘. Task끼리, 또는 Task와 ISR Category 2 사이에 공유되는 데이터에 대한 상호 배제(mutual exclusion)를 제공한다. 내부 메커니즘은 IPCP (Immediate Priority Ceiling Protocol) — 리소스마다 정적으로 할당된 ceiling priority로 우선순위 역전과 데드락을 동시에 방지한다 (OSEK OS 2.2.3 §8.5). OIL로 리소스를 선언하고, 해당 리소스를 사용하는 Task/ISR이 리소스를 명시적으로 참조한다.
왜 필요한가 — 공유 변수 경쟁
다음 예시는 두 Task가 같은 정수 변수를 증가시킬 때 race condition이 발생하는 상황이다.
int counter = 0;
TASK(t1) {
...
counter++;
// MOV R1, counter
// ADD R1, #1
// MOV counter, R1
...
TerminateTask();
}
TASK(t2) {
...
counter++; // 동일 3-명령 시퀀스
...
TerminateTask();
}counter++가 읽기–덧셈–쓰기 3단계 기계 명령으로 분해되기 때문에, t1의 읽기와 쓰기 사이에 t2가 선점되면 한쪽 증가가 누락되어 counter가 예상값과 달라질 수 있다. 이 문제를 방지하려면 두 Task의 counter++가 원자적(atomic)으로 수행되어야 한다.
OIL 선언
Resource 자체
RESOURCE myResource {
RESOURCEPROPERTY = STANDARD;
};RESOURCEPROPERTY = STANDARD가 일반 리소스. OSEK은 세 가지 유형을 정의한다.
| 유형 | 특징 |
|---|---|
| Standard | GetResource / ReleaseResource로 명시 점유·해제. 일반적인 임계 영역 보호 |
| Internal | GetResource / ReleaseResource 호출 불가. Task가 Running에 진입할 때 자동 획득, Non-preemptive 스케줄링의 rescheduling 지점에서 자동 release. IPCP 동작은 Standard와 동일 |
| Linked | Resource 간 중첩 점유가 불가능하므로, 원래 resource와 동일 동작을 하는 link를 추가해 중첩 없이 여러 경로에서 같은 임계 영역을 참조할 수 있게 함 |
API — GetResource / ReleaseResource
Standard Resource는 두 API 쌍으로 임계 영역을 감싼다.
GetResource(myResource); // ceiling priority로 상승
// === 임계 영역 ===
ReleaseResource(myResource); // 원래 priority 복귀 + reschedulingGetResource 호출 시 Task의 priority가 Resource의 ceiling priority로 즉시 상승하며, ReleaseResource 시 원래 priority로 돌아온다 (Preemptive 정책이면 이때 rescheduling 발생). 이 즉시 상승이 IPCP의 핵심이다.
Resource를 사용하는 Task/ISR 선언
TASK myTask {
PRIORITY = 2;
AUTOSTART = FALSE;
ACTIVATION = 1;
SCHEDULE = NON;
RESOURCE = myResource; // 이 Task가 사용할 수 있는 Resource 명시
STACKSIZE = 32768;
};
ISR myISR {
CATEGORY = 2;
PRIORITY = 1;
RESOURCE = myResource; // ISR도 Resource 사용 가능
STACKSIZE = 32768;
SOURCE = SIGUSR1;
};사용 포인트: 해당 Task/ISR 코드 내에서 GetResource(myResource) ~ ReleaseResource(myResource) 사이가 임계 영역이 된다. OIL의 RESOURCE = ... 선언은 어떤 Task/ISR이 어떤 리소스를 점유할 수 있는지를 정적으로 명세하는 역할.
Task와 ISR2 간 공유 허용
리소스는 Task끼리만이 아니라 Task ↔ ISR Category 2 간 공유에도 사용된다. ISR1은 OS를 우회하므로 리소스 메커니즘을 쓸 수 없다 (ISR Category 비교 참고).
Multi-Core 제약 — OSEK Resource는 단일 코어 내 동기화 수단이다. 서로 다른 코어의 Task 간에는 사용할 수 없다. Multi-Core 환경에서의 공유는 AUTOSAR OS Multi-Core 확장의 Spinlock 등 별도 메커니즘이 필요.
사용 제약
Resource는 다음 규칙을 지켜야 한다. 위반 시 [[OSEK Error Handling|E_OS_ACCESS / E_OS_NOFUNC / E_OS_RESOURCE]] 등으로 감지된다.
- 동일 Resource 중첩 점유 금지 — 이미 점유한 Resource를 같은 Task가 다시
GetResource불가 - Task/ISR은 Resource 점유한 채 종료 불가 —
TerminateTask,ChainTask,Schedule,WaitEvent호출 불가 - 다중 Resource 점유는 LIFO(stack) 순서 — A → B → C get이면 release는 C → B → A
- ceiling priority ≥ 점유 Task priority — Resource에 할당된 우선순위보다 Task priority가 높을 수 없음
Scheduler as a Resource — RES_SCHEDULER
Task가 다른 Task에 의한 선점을 명시적으로 차단하려면, 스케줄러 자체를 리소스로 잠글 수 있다.
- OSEK:
RES_SCHEDULER라는 이름의 Standard Resource가 자동 생성됨 - AUTOSAR:
RES_SCHEDULER가 자동 생성되지 않음 — 필요 시 사용자가 명시 선언
GetResource(RES_SCHEDULER);
// === Task 간 rescheduling 차단 ===
// (인터럽트는 계속 허용됨 — ISR은 Task보다 상위 레벨)
ReleaseResource(RES_SCHEDULER);Interrupt보다 상위 수준에서 선점을 막는 것이 아니라 Task 간 스케줄링만 정지시키는 메커니즘. 여러 Resource를 잡는 것보다 가볍고 단순하다.