OSEK 알람은 OSEK OS에서 counter가 미리 정한 값에 이르면 만료되어 정해 둔 동작을 하는 객체다. 만료될 때 할 동작은 정적으로 정한다. 알람은 시스템 생성 때 counter 하나에 정적으로 배정되며, 한 counter에 알람을 여럿 붙일 수 있다.[1]

Counter

타이머 인터럽트나 축의 엔코더처럼 반복되는 사건은 구현이 제공하는 counter에 등록된다. counter는 틱 단위로 잰 counter 값과 counter별 상수로 나타낸다. counter를 직접 다루는 표준 API(Application Programming Interface)는 없다. OSEK/VDX OS 2.0 명세는 1.0 명세에 있던, 애플리케이션이 counter에 접근하는 API를 하드웨어에 크게 기대는 기능이라는 이유로 없앴다. 타이머에서 나오는 counter는 적어도 하나 있으며, 그 타이머는 하드웨어일 수도 소프트웨어일 수도 있다.[1]

counter마다 아래 상수를 둔다.[1][2]

  • MAXALLOWEDVALUE: counter 값으로 허용되는 최댓값(틱 단위)
  • TICKSPERBASE: counter별 단위 하나에 이르는 데 드는 틱 수. 해석은 구현이 정한다.
  • MINCYCLE: 그 counter에 딸린 주기 알람의 주기로 허용되는 가장 작은 틱 수.[1][2] 이 값은 extended status 시스템에서만 쓰인다.[1]

counter마다 GetAlarmBase로 읽는 값을 상수 OSMAXALLOWEDVALUE_x, OSTICKSPERBASE_x, OSMINCYCLE_x(x는 counter 이름)로도 제공하므로, counter 이름을 알면 GetAlarmBase를 부르지 않아도 된다. 시간 counter인 시스템 counter의 상수는 OSMAXALLOWEDVALUE, OSTICKSPERBASE, OSMINCYCLE로도 읽는다. OSTICKDURATION은 시스템 counter의 틱 하나의 길이를 나노초로 준다.[1]

OSEKturbo OS/ARM7에서는 counter 값이 MAXALLOWEDVALUE에 이르면 0부터 다시 센다.[3]

만료 동작

알람이 만료되면 아래 가운데 정해 둔 동작 하나를 한다. 알람 하나에는 동작을 하나만 정할 수 있다.[2]

  • 태스크를 활성화한다.
  • 태스크의 이벤트를 설정한다.
  • 알람 callback 루틴을 부른다.[1][2]

알람 callback 루틴은 애플리케이션이 제공하는 짧은 함수다. 그 안에서 부를 수 있는 시스템 서비스는 인터럽트를 막았다가 되살리는 SuspendAllInterrupts와 ResumeAllInterrupts뿐이다. 알람 callback 루틴은 category 2 인터럽트를 막은 채 돈다. 인자도 반환값도 없으며, ALARMCALLBACK(name) 꼴로 정의한다. 알람 callback 루틴이 도는 처리 레벨은 구현에 따라 스케줄러의 레벨이거나 ISR의 레벨이다.[1]

실행 중에 정하는 것은 알람이 만료될 counter 값과 주기 알람의 주기뿐이다.[1]

한 번과 주기

알람은 한 번만 만료되는 단일 알람으로도, 주기적으로 만료되는 주기 알람으로도 정할 수 있다. SetRelAlarm은 지정한 틱 수가 지난 뒤에, SetAbsAlarm은 counter가 지정한 절댓값에 이르면 알람이 처음 만료되게 한다. 두 서비스 모두 주기를 받는다. 주기가 0이면 단일 알람이고, 0이 아니면 만료 직후 그 주기만큼 뒤로 다시 걸린다.[1]

SetAbsAlarm에 준 절댓값을 호출 전에 이미 지났으면, counter가 넘친 뒤 그 값에 다시 이를 때 알람이 만료된다.[1]

이미 쓰이고 있는 알람에 SetRelAlarm이나 SetAbsAlarm을 부르면 그 호출은 무시되고 E_OS_STATE를 돌려준다. 그래서 쓰이고 있는 알람의 값을 바꾸려면 먼저 취소해야 한다. SetRelAlarm의 increment가 0일 때의 동작은 구현이 정한다. increment가 아주 작으면 서비스가 돌아오기 전에 알람이 만료될 수 있다.[1]

CancelAlarm은 알람을 취소한다. GetAlarm은 만료까지 남은 틱 수를 돌려주고, GetAlarmBase는 알람이 딸린 counter의 상수를 읽는다.[1]

Autostart

시스템 생성 때 알람을 autostart로 정해 두면, StartOS가 현재 application mode의 autostart 알람을 켠다. autostart 알람의 값은 모두 상대값이다.[1] OIL에서는 ALARM 객체의 AUTOSTART 속성으로 정하며, 처음 만료 시각(ALARMTIME), 주기(CYCLETIME), application mode(APPMODE)를 함께 준다.[2]

[1]
“OSEK/VDX Operating System Specification, Version 2.2.3,” OSEK/VDX, 2005. Accessed: Sep. 30, 2026. [Online]. Available: https://web.archive.org/web/20060219185811/http://osek-vdx.org/mirror/os223.pdf
[2]
“OSEK/VDX System Generation, OIL: OSEK Implementation Language, Version 2.5,” OSEK/VDX, 2004. Accessed: Sep. 30, 2026. [Online]. Available: https://web.archive.org/web/20041012220755/http://www.osek-vdx.org:80/mirror/oil25.pdf
[3]
“OSEKturbo OS/ARM7 v.2.2 Technical Reference,” Freescale Semiconductor, 2002. Accessed: Sep. 30, 2026. [Online]. Available: https://web.archive.org/web/20190823222927/https://www.nxp.com/docs/en/reference-manual/OSEKturboTIRM.pdf