차량 플랫폼

05. 차량 플랫폼 - MCU 프로그래밍 ISR

만수르코딩방 2024. 6. 13. 23:28

1. RTOS의 Task 관리

RTOS에서 프로그램 실행의 기본단위는 Task입니다. Task는 이해하기 쉽게 말하면 무한루프이면서, 한가지 작업을 수행하고, 리턴 값이 없는 함수라고 할 수 있습니다. Scheduler는 OS의 일부로, 각 Task에 부여된 우선순위를 기준으로 CPU를 점유할 다음 Task를 결정해주는 역할을 합니다. 

OS에서 여러개의 Task를 갖는 응용프로그램을 만들면 Scheduler가 이를 빠르게 번갈아 가며 수행합니다. 각각의 Task는 고유한 우선순위를 가지고 있으며, 스케쥴러는 그 우선순위를 기준으로 Task를 관리합니다. 

출처 : Digikey

 

2. ISR(Interrupt Service Routine) 과 인터럽트의 정의

ISR(Interrupt Service Routine)은 MCU가 외부 또는 내부 이벤트에 응답하는 방식으로, 여러 종류의 인터럽트 이벤트를 처리할 수 있습니다. 인터럽트는 하드웨어, 소프트 웨어 이벤트로 이벤트가 발생하며, 버튼 누름, 센서 신호와 같이 외부 장치에서 신호가 들어올 때 발생하는 외부 인터럽트, UART, SPI, I2C 등의 통신 인터페이스에서 데이터가 수신되었을 때 발생하는 통신 인터럽트 등이 있습니다. 또한  정해진 시간이 경과했을 때 발생하는 타이머 인터럽트, 시스템 내부에서 특정 조건이 충족되었을 때 발생하는 내부 이벤트 등이 있습니다.

예를 들어 타이머 서비스 루틴은 타이머 인터럽트를 처리하는 ISR의 한 유형으로 타이머 인터럽트는 주기적으로 발생하여 시스템의 시간 틱을 관리하거나 주기적인 작업을 실행하는 데 사용됩니다. 타이머가 설정된 시간이 지나면 타이머 만료 이벤트가 발생하며, 만약 시스템에서 1초마다 실행해야하는 작업이 있을 때 타이머를 설정해 1초마다 인터럽트를 발생시킵니다. 타이머 만료 시 ISR이 호출되어 내부에서 주기적인 작업이 직접 수행되거나, 해당 작업을 실행할 Task를 대기/수면 상태에서 준비 상태로 전환하여 스케줄러가 준비 상태로 전환된 Task를 실행하도록 할 수 있습니다. 

ISR과 시스템의 상태는 밀접한 연관이 있습니다. ISR은 시스템의 특정 상태에서 발생하는 이벤트를 처리하며, 이를 통해 시스템의 상태 전환을 유도할 수 있습니다. ISR은 특정 이벤트가 발생했을 때 즉시 실행되어 해당 이벤트를 처리하는 역할을하기 때문에 ISR이 실행되면 현재 시스템의 상태를 일시적으로 중단하고, 인터럽트 처리를 우선시 합니다. 

출처 : Digikey

 

3. 시스템의 상태

시스템 상태는 크게 대기 상태(Waiting/Blocked), 준비 상태(Ready), 실행 상태(Running), 수면상태(Sleeping/Suspended) 4가지로 구분됩니다. ISR은 시스템의 특정 상태에서 발생하는 이벤트를 처리하며, 이를 통해 시스템의 상태 전환을 유도할 수 있습니다.

1) 대기상태 : Task가 대기 상태에 있을 때 Task 는 특정 이벤트(타이머 만료, 데이터 수신)를 기다리고 상태로, ISR은 이러한 이벤트가 발생했을 떄 바로 실행되어 대기 상태의 Task를 준비 상태로 전환합니다. (대기상태 -> 준비 상태) 

2) 준비상태 : ISR이 실행되어 대기 상태의 태스크를 준비상태로 전환 하면 해당 태스크는 다음 순서에 실행될 준비가 됩니다. 스케줄러는 준비 상태의 태스크 중에서 가장 우선순위가 높은 태스크를 선택하여 실행합니다. (준비상태 -> 스케줄러 -> 실행상태)

3) 실행 상태 : 현재 실행 중인 태스크가 있는 상태에서 인터럽트가 발생하면 현재 태스크의 실행이 일시중단되고 ISR이 실행됩니다. ISR이 완료되면 스케줄러는 다시 현재 Task 를 실행 상태로 복원하거나, 준비상태의 다른 태스크를 실행 상태로 전환합니다. (실행상태 ->인터럽트에 발생 시 일시 중단 -> 재실행)

4) 수면 상태 : 수면 상태의 태스크는 일정 시간이 경과하거나 특정 이벤트가 발생할 때까지 실행을 중단합니다. 예를 들어 타이머 ISR은 타이머가 만료되었을 때 수면 상태의 태스크를 준비 상태로 전환합니다.  (수면상태 -> 준비상태)

출처 : digikey

4. ISR과 세마포어

세마포어는 태스크 간의 동기화와 자원 관리를 위해 사용되는 기법입니다. ISR과 세마포어는 크게 두 가지로 상호작용하는데, 한 가지는 ISR에서 세마포어를 주는 경우이고, 다른 한 가지는 Task에서 세마포어를 기다리는 경우 입니다. 

ISR에서 세마포어를 주는(release) 경우는 데이터 처리에 사용되며,  태스크가 대기하고 있는 이벤트가 발생했음을 알리는 신호 역할을 합니다. ISR이 세마포어를 주면, 해당 세마포어를 기다리고 있던 태스크가 준비 상태로 전환됩니다. 

Task가 세마포어를 기다리는 경우는 주기적인 작업의 수행에 사용되며, 태스크는 특정 이벤트가 발생할 때까지 세마포어를 계속해서 받습니다(Take, wait) 이벤트가 발생할 때까지 Task는 대기상태로 남아 있습니다.  

이처럼 세마포어를 통해 ISR과 태스크 간의 동기화를 효율적으로 관리할 수 있으며, 시스템의 실시간 응답성을 높일 수 있습니다.

 

 

* 참고 자료 

RTOS Task Scheduling and Prioritization (digikey.com)