본문 바로가기
Operating System/RTOS

[OSEK OS] ISR

by 임아톰 2021. 7. 26.

Interrupt란

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

 

ISR(Interrupt Service Routine)

ISR은 인터럽트를 처리하는 함수입니다. OSEK OS에서 ISR은 두 가지 카테고리(ISR category1, ISR category 2)로 나눠집니다.

카테고리1은 OS service를 사용하지 않습니다. 일반적인 임베디드 시스템에서의 인터럽트와 동일한 개념입니다. low level의 인터럽트이며 OS가 존재를 인지하지 못하는 ISR입니다. 카테고리2는 OS 관리 하에 있는 ISR이며 OS service를 사용하며 좀 더 많은 일을 할 수 있습니다.

 

ISR1

  • OS 서비스를 사용하지 않으므로 오버헤드가 작고 빠름
  • ISR1 내부에는 시스템콜을 사용할 수 없음
  • OIL 코드 작성이 필요 없음
  • 종료되면 원래 위치로 복귀함

 

 

ISR2

  • ISR1 보다 오버헤드가 크고 느림
  • ActivateTask와 같은 시스템 콜을 호출할 수 있음
  • OIL 코드 작성이 필요
  • 종료되면 스케줄러로 감

 

 

Processing Level

OSEK OS의 task와 ISR 사이의 우선순위를 표현한 그림입니다. 

위로 갈수록 우선순위가 높은 것이므로 인터럽트는 task 보다 우선해서 실행됩니다. 스케줄러(OS)는 인터럽트와 task 사이에 위치합니다.

 

 

Nested interrupts of different categories

사용자가 알아야 하는 ISR 1과 ISR2를 사용할 때 발생할 수 있는 에러 상황입니다.

 스케줄러 보다 ISR이 우선순위가 높으므로 ISR 중에는 rescheduling이 발생하지 않습니다. ISR1이 실행 중에 ISR2가 선점하여 ActivateTask()를 호출했습니다. 따라서 ISR2가 종료됐을 때 다른 interrupt가 없다면 해당 task에 대하여 rescheduling을 수행해야 합니다. 하지만 ISR1이 스케줄러 보다 우선순위가 높으므로 ISR1으로 복귀하게 되고 ISR1이 종료되는 시점에는 OS 호출 없이 전에 실행되던 task로 복귀하게 됩니다.

 

 즉, ISR2에서 호출한 task의 우선순위가 높더라도 task가 시작할 때까지 시간이 걸리게 됩니다. 이러한 문제는 ISR 1의 우선순위를 ISR2 보다 같거나 높게하여 해결할 수 있습니다.

 

Interrupt API

  • void EnableAllInterrupts(void) / void DisableAllInterrupts(void)
     : Enable/Disable all interrupts
     : Nesting은 허용되지 않음
  • void ResumeAllInterrupts(void) / void SuspendAllInterrupts(void)
     : Enable/Disable all interrupts
     : Nesting 허용 
  • void ResumeOSInterrupts(void) / void SuspendOSInterrupts(void)
     : Enable/Disable all interrupts
     : Nesting 허용

* Nesting: 동일한 API를 중첩하여 호출하는 것을 의미. Suspend된 interrupt를 다시 동작하기 위해서는 중첩된 Suspend interrupt 횟수만큼 resume interrupt를 호출해야함

 

 

*reference

OSEK specification 2.2.3

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

OSEK 개요

반응형

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

[OSEK OS] Resource  (0) 2021.07.28
[OSEK OS] Alarm  (0) 2021.07.28
[OSEK OS] Task와 Event  (0) 2021.07.10
RTOS 용어 정리  (0) 2021.06.30