OSEK Counter와 Alarm — VDX의 시간 기반 동작 메커니즘. Counter는 하드웨어 타이머를 추상화한 카운터 값, Alarm은 Counter 값이 특정 시점에 도달하면 미리 정의된 동작(이벤트 설정·Task 활성화·콜백 호출)을 수행하는 객체다. Alarm은 반드시 어떤 Counter에 연결된다.
Counter — 하드웨어 클럭 틱의 추상화
역할
- 외부 HW 타이머 인터럽트를 OS 관점의 증가형 카운터로 변환.
- ISR 핸들러 안에서
CounterTick(myCounter)을 호출해 수동으로 카운터를 증가시킨다.
핵심 파라미터
| 파라미터 | 의미 |
|---|---|
TicksPerBase | 카운터 값을 1 증가시키는 데 필요한 인터럽트 발생 횟수 |
MaxAllowedValue | 카운터의 최대값. 이 값에 도달하면 0으로 리셋 |
MinCycle | Alarm 두 번 트리거 사이의 최소 간격 (주기 알람의 cycle 하한) |
선언 (C + OIL)
ISR(timer_handler) {
CounterTick(myCounter); // HW 타이머 ISR 안에서 카운터 증가
}COUNTER myCounter {
TICKSPERBASE = 10; // 인터럽트 10회마다 카운터 +1
MAXALLOWEDVALUE = 65535; // 65535 도달 후 0으로 복귀
MINCYCLE = 128; // Alarm 트리거 최소 간격
};해당 HW 타이머 인터럽트는 OS가 자동 연동하지 않으며, 사용자가 ISR (ISR) 내부에서 CounterTick을 직접 호출해야 한다.
Alarm — 시간 기반 액션
Alarm은 Counter에 연결되어, Counter 값이 Alarm의 지정 값에 도달했을 때 세 가지 액션 중 하나를 수행.
| Action | 의미 |
|---|---|
SETEVENT | 특정 Extended Task에 이벤트 설정 |
ACTIVATETASK | 특정 Task 활성화 (ready 상태로) |
ALARMCALLBACK | 지정된 콜백 함수 호출 (호출 중 Cat2 Interrupt disable) |
INCREMENTCOUNTER | 다른 Counter 값을 증가 (AUTOSAR 확장, OSEK 스펙에는 없음) |
선언 (OIL)
ALARM myAlarm {
COUNTER = myCounter; // 이 Alarm이 연결될 Counter
ACTION = ACTIVATETASK {
TASK = myTask; // 액션 대상
};
AUTOSTART = TRUE {
ALARMTIME = 10; // 최초 트리거 = 카운터 값 10
CYCLETIME = 5000; // 이후 매 5000 틱마다 주기 트리거
APPMODE = std;
};
};| 파라미터 | 의미 |
|---|---|
COUNTER | 참조할 Counter |
ACTION | 트리거 시 수행할 액션 (SETEVENT / ACTIVATETASK / ALARMCALLBACK) |
ALARMTIME | 최초 트리거 시점 (카운터 값) |
CYCLETIME | 주기 트리거 간격. 0이면 1회성 (one-shot) |
CYCLETIME은 MinCycle 이상이어야 한다.
Alarm API
런타임 조작은 다음 5개 API로 한다.
| API | 동작 |
|---|---|
GetAlarmBase(AlarmID, AlarmBaseRef) | Alarm이 연결된 Counter의 기본 정보(MaxAllowedValue/TicksPerBase/MinCycle) 조회 |
GetAlarm(AlarmID, TickRef) | Alarm이 expire하기까지 상대적으로 남은 tick 조회 |
SetRelAlarm(AlarmID, Increment, Cycle) | 현재 tick에서 Increment 후 expire, 이후 Cycle 주기 반복. Cycle=0이면 1회성 |
SetAbsAlarm(AlarmID, Start, Cycle) | Counter 값이 Start에 도달할 때 expire, 이후 Cycle 주기 반복 |
CancelAlarm(AlarmID) | Alarm을 expire되지 않도록 해제 |
사용 예 — 현재 tick=0, MaxAllowedValue=149인 Counter에 SetRelAlarm(ALARM0, 75, 50)을 호출하면, tick 75에 최초 expire 후 매 50 tick마다 expire 반복.
전형적 사용 패턴
- HW 타이머 인터럽트 → 해당 ISR이
CounterTick(myCounter)호출 → 카운터 증가 - 카운터 값이 Alarm의
ALARMTIME에 도달 → Alarm이 지정 Task를 활성화 또는 이벤트 설정 - Task는 주기 태스크로 실행됨
이 메커니즘이 주기 태스크 모델의 주기 태스크 활성화를 OSEK 런타임에서 실제로 구현하는 방식이다.