OSEK Counter와 AlarmVDX의 시간 기반 동작 메커니즘. Counter는 하드웨어 타이머를 추상화한 카운터 값, Alarm은 Counter 값이 특정 시점에 도달하면 미리 정의된 동작(이벤트 설정·Task 활성화·콜백 호출)을 수행하는 객체다. Alarm은 반드시 어떤 Counter에 연결된다.

Counter — 하드웨어 클럭 틱의 추상화

역할

  • 외부 HW 타이머 인터럽트를 OS 관점의 증가형 카운터로 변환.
  • ISR 핸들러 안에서 CounterTick(myCounter)을 호출해 수동으로 카운터를 증가시킨다.

핵심 파라미터

파라미터의미
TicksPerBase카운터 값을 1 증가시키는 데 필요한 인터럽트 발생 횟수
MaxAllowedValue카운터의 최대값. 이 값에 도달하면 0으로 리셋
MinCycleAlarm 두 번 트리거 사이의 최소 간격 (주기 알람의 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)

CYCLETIMEMinCycle 이상이어야 한다.

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 반복.

전형적 사용 패턴

  1. HW 타이머 인터럽트 → 해당 ISR이 CounterTick(myCounter) 호출 → 카운터 증가
  2. 카운터 값이 Alarm의 ALARMTIME에 도달 → Alarm이 지정 Task를 활성화 또는 이벤트 설정
  3. Task는 주기 태스크로 실행됨

이 메커니즘이 주기 태스크 모델주기 태스크 활성화를 OSEK 런타임에서 실제로 구현하는 방식이다.

같이 보기