<목차>
6. RTOS 팩토리 - Kernel 이야기
- 6.1 RTOS와 Kernel
- 6.2 Embedded Software는 무한루프
- 6.3 Task 구조와 Signal
- 6.4 Task의 상태, Task는 Service단위와 ISR
- 6.5 Preemptive Multitasking이란 도대체?
- 6.6 Context Switching과 TCB - Task의 상태변화
- 6.7 TCB - Task Control Block
- 6.8 Scheduler의 구현
- 6.9 ISR은 어떻게 구현해 - 선점형과 비선점형
- 6.10 선점형 Kernel에서 wait, send, clr signal의 구현과 IRQ Handler
- 6.11 Clock Tick ISR - Timer Service
- 6.12 ATOMIC - Critical Section, Mutex, Semaphore
- 6.13 Interrupt와 Polling
- 6.14 Queue와 Inter Task Communication
- 6.15 DPC나 APC, 그리고 Bottom Half
- 6.16 Watch dog
- 6.17 Bootup중 Kernel로의 진입 - main()함수 -
- 6.18 Kernel을 Porting한다는 것
RTOS라는 것도 OS와 마찬가지다, 그러나 Embedded System에서 사용되는 OS인데, 범용적인 System이 아니고 특정한 목적을 위한 작은 System이다 보니 Real Time이 붙어서 RTOS가 되었다.
기본적으로 Multi tasking과 Interrupt 처리 기능을 가진다.
RTOS의 중요한 부분들만 따로 떼어서 Kernel이라고 부르는 부분들이 생겨 난다. Kernel이라 함은 크게
Embedded System의 경우 특정한 목적을 가진 System이기 때문에 무한 루프로 구성되어 있습니다. 결국 Embedded System이 죽지 않는 한 무한히 Loop를 돌면서 자신의 역할을 하게 됨
실은 간단한 시스템의 경우 ASIC(Application Specific Intergrated Circuit)로 만듬 하지만 Programable Embedde System이라면 LED Blink에서 Motor제어로 바꿀수 있음
RTOS의 첫번째 기능은 Scheduler이다. LED를 깜빡이는 것을 Lamp_task()라 정의하고 모터를 움직이는 것을 Motor_task()라 정의하자. 여기서 task는 Scheduling의 기본단위로 보면된다
Motor_task()와 Lamp_task()가 서로 주거니 받거니 일을 하기 위해 signal이라는 걸 만들어 준다. wait(signal)의 경우 signal을 기다린다는 의미이다. send(task,signal) 이라는 함수는 task한테 signal을 주는 역할을 한다.
System call..???
보통 Interrupt가 걸릴 경우 IRQ Exception이 발생하고 IRQ mode로 전환되어 Interrupt Service Routine, ISR이 실행된다.
IRQ_Handler의 역할?
특정 interrupt가 걸리면 IRQ_Handler()가 불려지고, IRQ Handler는 특정 isr을 호출한다.그 후 반복되지 않도록 clear해준다.
Multitasking은 동시에 뭔가를 동시 다발적으로 일 을 하는 것이 아니라, 시분할 방식으로 한 개의 CPU에서 여러 가지 일을 동시에 하는 것처럼 보이게 하는 것
Preemptive 방식
Task가 Scheduler로부터 CPU 사용권을 할당 받았을때, Interrupt와 같은 외부접근이 생길 경우 CPU제어권을 강제적으로 빼앗아 다른 Task가 실행될 수 있도록 하는 방식.
Non-preemptive
Task가 자발적으로 CPU 사용권을 반납할 때까지 강제적으로 CPU의 제어권을 빼앗을 수 없는 방식
Interrupt의 경우 중요도(Priority)를 고려하여 중간에 다른 Task를 Ready()상태로 바꿀 수 있다. ISR을 다 처리하고 나고 Scheduler가 Context Switching을 하려고 보니 즉, Ready()상태를 확인한다.
Kernel level의 Context Switching, 문맥교환의 모양을 알아보자. ARM에서의 Context는 현재의 Register set이니까, 이녀석만 잘 저장해 두면 어디든지 갔다 올 수 있다.
System상의 모든 Task는 자기 자신만의 Stack과 TCB(Task Control Block)을 가진다.
Task Stack은 stack이고, TCB는 각 Task를 Control하기 위해서 Task의 정보를 저장해 놓는 Data Structure라고 보면된다.
현재 Wait을 하거나, Ready상태인 Task의 TCB의 SP는 전까지 실행 하던 Context가 넣어진 그 Stack의 끝을 가르키고 있다. 즉, 각각의 Task는 자기가 어디까지 실행되었었는지를 항상 간직하고 있다. 만약 Interrupt에 의해 Task2가 Ready()가 되어서 다시 실행될 순서가 되면 SP가 가리키고 있던 곳의 Context를 그대로 다시 CPU의 Register에 복사해 넣는다.