6. RTOS 팩토리 - Kernel 이야기

박민기·2023년 11월 29일
0

임베디드 레시피

목록 보기
2/2

<목차>
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한다는 것

1. RTOS와 Kernel

RTOS라는 것도 OS와 마찬가지다, 그러나 Embedded System에서 사용되는 OS인데, 범용적인 System이 아니고 특정한 목적을 위한 작은 System이다 보니 Real Time이 붙어서 RTOS가 되었다.
기본적으로 Multi tasking과 Interrupt 처리 기능을 가진다.
RTOS의 중요한 부분들만 따로 떼어서 Kernel이라고 부르는 부분들이 생겨 난다. Kernel이라 함은 크게

  • Context Switching, Scheduling, Memory Management, ISR Management 등을 담당하는 부분이이다.

2. Embedded Software는 무한루프

Embedded System의 경우 특정한 목적을 가진 System이기 때문에 무한 루프로 구성되어 있습니다. 결국 Embedded System이 죽지 않는 한 무한히 Loop를 돌면서 자신의 역할을 하게 됨

실은 간단한 시스템의 경우 ASIC(Application Specific Intergrated Circuit)로 만듬 하지만 Programable Embedde System이라면 LED Blink에서 Motor제어로 바꿀수 있음

3. Task 구조와 Signal

RTOS의 첫번째 기능은 Scheduler이다. LED를 깜빡이는 것을 Lamp_task()라 정의하고 모터를 움직이는 것을 Motor_task()라 정의하자. 여기서 task는 Scheduling의 기본단위로 보면된다
Motor_task()와 Lamp_task()가 서로 주거니 받거니 일을 하기 위해 signal이라는 걸 만들어 준다. wait(signal)의 경우 signal을 기다린다는 의미이다. send(task,signal) 이라는 함수는 task한테 signal을 주는 역할을 한다.

  • Task는 init/ wait/ ready/ running 4가지 state를 가진다.
    Init: Task가 생성된 뒤 task에 필요한 기초 작업을 준비하는 단계다. 무한 반복이 필요하지 않은 변수 정의 및 선언 등이 포함된다.
    Wait: Task가 특정 함수를 만나거나 signal을 기다리면 자신의 순서를 반환하고 기다리는 상태로 전환한다. Scheduler는 다음 우선순위 task를 선택해 수행한다.
    Ready: Task가 다시 수행될 준비를 마쳐 scheduler에게 다시 선택받기를 기다리는 상태다.
    Running: Task가 scheduler에게 선택받가 CPU time을 점유해 실행되는 상태다.

    System call..???

4. Task의 상태, Task는 Service단위와 ISR(Interruot Service Routine)

보통 Interrupt가 걸릴 경우 IRQ Exception이 발생하고 IRQ mode로 전환되어 Interrupt Service Routine, ISR이 실행된다.

IRQ_Handler의 역할?
특정 interrupt가 걸리면 IRQ_Handler()가 불려지고, IRQ Handler는 특정 isr을 호출한다.그 후 반복되지 않도록 clear해준다.

5.Preemptive(선점형) Multitasking이란 도대체

Multitasking은 동시에 뭔가를 동시 다발적으로 일 을 하는 것이 아니라, 시분할 방식으로 한 개의 CPU에서 여러 가지 일을 동시에 하는 것처럼 보이게 하는 것

Preemptive 방식
Task가 Scheduler로부터 CPU 사용권을 할당 받았을때, Interrupt와 같은 외부접근이 생길 경우 CPU제어권을 강제적으로 빼앗아 다른 Task가 실행될 수 있도록 하는 방식.

Non-preemptive
Task가 자발적으로 CPU 사용권을 반납할 때까지 강제적으로 CPU의 제어권을 빼앗을 수 없는 방식

Interrupt의 경우 중요도(Priority)를 고려하여 중간에 다른 Task를 Ready()상태로 바꿀 수 있다. ISR을 다 처리하고 나고 Scheduler가 Context Switching을 하려고 보니 즉, Ready()상태를 확인한다.

6. Context Switching과 TCB - Task의 상태변화

Kernel level의 Context Switching, 문맥교환의 모양을 알아보자. ARM에서의 Context는 현재의 Register set이니까, 이녀석만 잘 저장해 두면 어디든지 갔다 올 수 있다.
System상의 모든 Task는 자기 자신만의 Stack과 TCB(Task Control Block)을 가진다.
Task Stack은 stack이고, TCB는 각 Task를 Control하기 위해서 Task의 정보를 저장해 놓는 Data Structure라고 보면된다.

TCB

  • Task name
    - Task의 고유 이름을 의미한다.
  • Task Stack
    - Task의 SP가 가리키는 장소
  • Stack pointer
    - Task Stack의 주소를 가르키고 있따.
  • wait signal
  • priority

현재 Wait을 하거나, Ready상태인 Task의 TCB의 SP는 전까지 실행 하던 Context가 넣어진 그 Stack의 끝을 가르키고 있다. 즉, 각각의 Task는 자기가 어디까지 실행되었었는지를 항상 간직하고 있다. 만약 Interrupt에 의해 Task2가 Ready()가 되어서 다시 실행될 순서가 되면 SP가 가리키고 있던 곳의 Context를 그대로 다시 CPU의 Register에 복사해 넣는다.

profile
세상을 놀라게할 임베디드 SW 개발자

0개의 댓글