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가 예상값과 달라질 수 있다. 이 문제를 방지하려면 두 Taskcounter++원자적(atomic)으로 수행되어야 한다.

OIL 선언

Resource 자체

RESOURCE myResource {
    RESOURCEPROPERTY = STANDARD;
};

RESOURCEPROPERTY = STANDARD가 일반 리소스. OSEK은 세 가지 유형을 정의한다.

유형특징
StandardGetResource / ReleaseResource로 명시 점유·해제. 일반적인 임계 영역 보호
InternalGetResource / ReleaseResource 호출 불가. Task가 Running에 진입할 때 자동 획득, Non-preemptive 스케줄링의 rescheduling 지점에서 자동 release. IPCP 동작은 Standard와 동일
LinkedResource 간 중첩 점유가 불가능하므로, 원래 resource와 동일 동작을 하는 link를 추가해 중첩 없이 여러 경로에서 같은 임계 영역을 참조할 수 있게 함

API — GetResource / ReleaseResource

Standard Resource는 두 API 쌍으로 임계 영역을 감싼다.

GetResource(myResource);     // ceiling priority로 상승
// === 임계 영역 ===
ReleaseResource(myResource); // 원래 priority 복귀 + rescheduling

GetResource 호출 시 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를 잡는 것보다 가볍고 단순하다.

같이 보기