본문 바로가기
Operating System/RTOS

[OSEK OS] Task와 Event

by 임아톰 2021. 7. 10.

Task란

 Task는 OS가 제어하는 프로그램의 기본 단위입니다. 복잡한 제어 소프트웨어의 실시간 요구사항을 나누어 여러 task로 구성하게 됩니다. OSEK OS는 task를 스케줄링하여 각 task의 실시간 요구사항(시간 제약)을 지킬 수 있도록 합니다.

 

Task 만들기

C code의 task body에 task의 내용을 작성하고 TerminateTask()를 호출해서 Task를 끝냅니다. OIL 코드에는 Task의 우선순위, 스택 공유 여부, 자동으로 시작하는지, 선점형인지 비선점형인지 등을 설정할 수 있습니다.

 

Task state model

Task는 실행되면서 상태가 변합니다. OSEK은 2가지의 Task State model (Basic Tasks, Extended Tasks)을 제공합니다. Basic Tasks와 Extended Tasks의 차이는 waiting 상태입니다. waiting을 통해 task 사이의 수행 순서를 맞춰야 하는 경우는 Extended Tasks 모델을 사용하고 그렇지 않은 경우는 Basic Tasks를 사용하면 됩니다.

 

Basic Task

Basic Task의 task state model은 running, ready, suspended 3가지의 상태를 가집니다.

running은 task가 cpu를 점유하고 있는 상태입니다.

ready는 running 상태가 되기 위해 거쳐야 하는 상태이고 scheduler는 ready 상태의 task 중 실행할 task를 결정합니다.

TerminateTask() 함수를 호출하면 Task의 상태는 suspended가 됩니다. 다음 주기가 되면 task는 activate 되어 ready 상태가 됩니다.  Task는 Terminate됨으로써 OS의 task 관리의 복잡성을 줄여줍니다.

 

Extended Task

Basic task의 Task state model에서 waiting 상태가 추가됐습니다.

waiting은 특정 event를 기다리는 상태입니다. 즉, 특정 event가 발생하기 전까지 동작하지 않는 상태입니다. 이벤트가 발생하면 ready가 되서 다시 스케줄링하게 됩니다.

task는 OS의 시스템 콜인 WaitEvent를 호출해서 waiting 상태가 될 수 있습니다. 논리적으로 지금 자신이 cpu를 놓아야 하는 경우에 사용하고 특정 event가 발생해야 해당 task는 다시 동작합니다.

 

 

Task Scheduling

시작할 task를 결정하는데 필요한 OSEK OS 내부 활동을 스케줄러라고 합니다. 스케줄링 정책에 의해 task switch가 가능할 때 스케줄러가 activate 됩니다.

시스템은 여러 개의 task를 동시에(concurrently) 실행합니다. Multi-Tasking을 위해서 레디 큐에 있는 task 중 어느 task에 CPU를 할당할지 스케줄링을 수행합니다.

 

Task priority

RTOS에서는 우선순위 기반의 스케줄링 방식인 RM(Rate Monotonic) 스케줄링 방식을 많이 사용합니다. OSEK OS에서도 우선순위 기반의 스케줄링 방식을 지원합니다.

 우선순위는 0부터 시작하며 숫자가 클수록 우선순위가 높습니다. 운영체제에 따라 같은 우선순위도 있을 수 있습니다. 같은 우선순위를 허용하는 경우, 우선순위마다 task를 보관하는 큐가 있어 우선순위가 동일한 경우 FIFO 방식으로 activation 됩니다.

 

 

Full Preemptive / Non Preemptive

 OSEK OS에서는 Full preemptive scheduling과 Non Preemptive scheduling을 지원하며 운영체제에서 배우는 선점형/ 비선점형 스케줄링 방식과 동일한 개념입니다. 

 

 선점형 방식(Full preemptive)은 우선순위가 높은 task가 항상 먼저 수행되어야 할 때 사용합니다. 대신에 레디 큐가 바뀔 때마다 스케줄링을 다시해야 하기 때문에 오버헤드가 비선점형 방식 보다 큽니다.

 비선점형 방식(Non Preemptive)은 우선순위가 높은 task가 activate되더라도 스케줄링이 다시 일어나지 않습니다. running이 바뀔 때만 스케줄링을 다시하므로 선점형 방식보다 오버헤드가 작습니다.

 

Full Preemptive

Task T2가 실행되는 중에 높은 우선순위를 가지는 T1이 activation되어 T1이 선점하여 실행하게 됩니다. 

 

Non Preemptive

반면에 Non Preemptive에서는 T1이 activation되더라도 T2가 termination 된 후에 T1이 실행하게 됩니다.

 

 

Task Hook

Task Hook을 이용하면 디버깅이나 타이밍 정보를 측정하고 싶을 때 task 동작 전후로 사용자가 작성한 함수를 끼워 넣을 수 있습니다. 사용자가 Task Hook을 설정하면 OSEK OS가 이를 호출해줍니다. 

 

동작 순서는 PreTaskHook -> Task running -> PostTaskHook 순서로 실행됩니다. running 상태에 들어간 직후 PreTaskHook이 동작하고 running 상태에서 나오기 직전 PostTaskHook이 동작합니다. TaskHook 동작 시 Task의 상태는 running 상태를 유지합니다. 

 

 

Task API

  • StatusType ActiveTask(TaskType <TaskID>)
     : <TaskID>를 가진 task를 ready 상태로 변경
  • StatusType TerminateTask(void)
     : 현재 running 중인 task를 suspend 상태로 변경
  • StatusType ChainTask(TaskType <TaskID>)
     : <TaskID>를 가진 task를 activate 시키고 현재 task를 terminate 시킴
  • StatusType Schedlue(void)
     : Scheduling을 수행
  • StatusType GetTaskID(TaskRefType <TaskID>)
     : 현재 running 중인 task의 ID를 획득
  • StatusType GetTaskState(TaskType <TaskID>, TaskRefTye<State>)
     : Task ID를 가진 task의 상태 정보를 획득

 

 

Event란

 Event는 task의 동작 순서를 결정하기 위해 사용합니다. extended task의 waiting 상태를 위해 사용하며 waiting 상태가 있기 때문에 event도 있습니다. 당연히 basic task에서는 event를 사용할 수 없습니다. 

 

 우선순위 스케줄링 방식으로 task의 큰 순서는 결정할 수 있지만 task의 동작 순서를 동기화할 수는 없습니다. 예를 들어, task를 번갈아 수행해야 된다든지 다른 task의 연산 결과를 기다려야 되야하는 경우 이벤트를 사용해야 합니다. 

 

이벤트의 동작 메커니즘은 다음과 같습니다.

  • running 상태의 task는 저정한 이벤트가 발생할 때까지 waiting 상태에서 대기
  • waiting 상태의 task는 대기하고 있던 최소 한 개의 이벤트가 발생하면 ready 상태가 됨
  • event를 set했다면 clear를 해줘야 함. clear event가 안된 상태에서 wait event할 경우 waiting 상태에 들어가지 않음

 

Event 사용 예시

(Full preemptive scheduling, T1 has the higher priority)

Task T1은 이벤트를 기다리고 있습니다. Task T2가 T1을 위해 set event를 합니다. 스케줄러가 활성화 되며 T1은 ready 상태가 됩니다. T1이 T2 보다 높은 우선순위를 가지고 있으므로 T1은 running 상태가 됩니다. T1은 이벤트를 clear하고 다시 해당 이벤트를 wait하게 됩니다.

 

 

Event API

  • StatusType SetEvent(TaskType <TaskID>, EventMaskType <Mask>)
     : task <TaskID>가 기다린 event가 <Mask>면, task의 상태를 waiting에서 ready로 바꿈
  • StatusType ClearEvent(EventMaskType <Mask>)
     : 현재 event 발생을 clear. clear하려는 event를 소유하고 있는 task만 사용 가능
  • StatusType GetEvent(TaskType <TaskID>, EventMaskRefType <Mask>)
     : <TaskID>를 가진 task가 가지고 있는 모든 event의 상태 bit를 반환
  • StatusType GetEvent(EventMaskType <Mask> )
     : non suspended task를 waiting 상태로 옮김

 

 

다음 포스트

 

[OSEK OS] ISR

Interrupt란 인터럽트는 보통 주변 장치에서 발생합니다. 주변 장치는 mcu에 비해 속도가 느리기 때문에 이를 기다리기보다는 주변 장치의 동작이 완료됐을 때 인터럽트로 작업이 끝났음을 알립니

spacebike.tistory.com

 

 

*reference

OSEK specification 2.2.3

김종찬 교수님 실시간 운영체제 및 소프트웨어 강의

OSEK 개요

 

반응형

'Operating System > RTOS' 카테고리의 다른 글

[OSEK OS] Alarm  (0) 2021.07.28
[OSEK OS] ISR  (0) 2021.07.26
RTOS 용어 정리  (0) 2021.06.30
RTOS (Real-Time OS) 란?  (0) 2021.06.27