Context
Context, 문맥은 현재 실행중인 task/process의 모든 정보와 CPU의 모든 레지스터 데이터를 포함한다. task가 실행중인 어느 한 순간의 CPU 레지스터 모든 데이터가 하나의 context인 것이다.
참고로 운영체제론때 배웠던 PCB와 유사한 TCB(Task Control Block)에는 task의 정보를 구조체 리스트로 저장되어 있다.
Interrupt
인터럽트란, HW가 CPU에게 비동기적으로 기능을 요청하는 신호이다. 즉, 반드시 우선순위가 제일 높은 것은 아니고 다른 task와 마찬가지로 Deadline 안에만 실행되면 된다. 다만, 인터럽트는 최대한 작은 크기로 두는 것이 좋다. 그 이유는 다음과 같다.
ISR의 수행 시간이 길어지게 되면, task의 수행 시작 시간과 종료 시간에 악영향을 준다.
새로운 interrupt를 accept할 수 없을 가능성이 증가한다.
Task - Interrupt 간 공유자원을 사용할 가능성이 커진다.
따라서 ISR이 크고 복잡한 기능을 수행해야 할 때는 높은 우선순위의 task를 생성하여 그 기능을 위임하는 것이 좋다.
인터럽트가 발생하게 되면 현재 실행중인 task의 context를 TCB에 저장하고, Interrupt Vector Table(IVT)에서 인터럽트의 종류를 파악 및 Interrupt Service Routine (ISR)을 실행한다. ISR이 종료되면 높은 우선순위의 task의 context를 복원한다.
Apply
인터럽트를 사용하기 위해선 스타트업 코드에 추가해줘야 한다. 스타트업 코드란 시스템이 부팅되거나 리셋될 때 실행되는 초기화 코드이다. 이는 스택 포인터과 데이터 섹션을 초기화하고, 시스템 클록을 설정하고, IVT를 설정하고, 모든게 마무리되면 main 함수를 호출한다.
스타트업 파일은 위 스타트업 코드를 포함하는 파일이다. 보통 어셈블리 언어로 작성되고, .s, .startup, .asm 등의 확장자를 가진다. 이 파일은 특정 마이크로컨트롤러나 플랫폼에 맞게 제공된다.
스타트업 파일에는 각종 인터럽트 핸들러가 있다. 예를 들어 ARM Cortex-M MCU에서 타이머 인터럽트 핸들러는 다음과 같이 작성되어 있다.
.section .isr_vector, "a", %progbits
...
.word TIMER_IRQ_Handler
...
만약 C언어에서 작성한 타이머 인터럽트 핸들러의 이름이 TIMER_IRQ_Handler_C라고 하자.
.global TIMER_IRQ_Handler
...
TIMER_IRQ_Handler:
b TIMER_IRQ_Handler_C
타이머 인터럽트가 발생하면, isr_vector에서 TIMER_IRQ_Handler의 주소를 찾아 실행하고, 이는 다시 TIMER_IRQ_Handler_C로 분기된다.
이렇게 작성한 startup 파일과 함께 컴파일을 수행하면 된다.
'현생 > 임베디드' 카테고리의 다른 글
FreeRTOS - Message Queue (0) | 2024.08.09 |
---|---|
FreeRTOS - Event Flag Group (0) | 2024.08.08 |
FreeRTOS - 임계 영역 (0) | 2024.08.06 |
FreeRTOS - Naming Rule & Task (0) | 2024.08.05 |
임베디드 OS - RTOS란 무엇일까 (0) | 2024.08.04 |