Firmware/RTOS

[Firmware - RTOS] RTOS 개념, 차이점, 방식

다크엔지니어 2022. 2. 20. 17:43
반응형

RTOS가 무엇인지, 그리고 왜 쓰는지, 어떻게 쓰는지에 대해 기술해 볼 것이다.

보통은 미사일을 예로 많이드는데 너무 실시간성만 얘기하기 보다는 조금 더 자세히 들여다 볼 것이다.

RTOS 는 해당 보드의 지원되는 OS 종류에 따라 동기화 방법이 다르다.(Semaphore / Mutex)

 

RTOS의 이해

Real Time 이란 임의의 정보가 시스템에 입력이 되었을 때, 주어진 시간안에 작업이 완료되어 결과 도출 되는 것을 의미

결국 신속응답 처리를 위해 일반 펌웨어의 main 시퀀스 외에 여러 Task 를 만든다는 것을 의미한다.

 

RTOS 와 Windows or Linux 차이점

  • RTOS - 자원을 낭비하더라도 작업의 시간 제한을 맞추는데 포커스
  • Windows or Linux - 자원을 얼마나 공평하게 분배

즉, RTOS는 공평성 보다는 우선순위가 높은 Task가 많은 시간을 수행 하게 된다.

 

Hard Real Time and Soft Real Time

  • Hard Real Time - 작업이 일정시간 안에 반드시 처리 필요, 일정시간 지난 후 결과값은 정확해도 의미 없는 경우(이 경우가 미사일을 예로 들 수 있다.)
  • Soft Real Time - 작업이 일정시간 안에 처리되는것을 기본으로 하며, 일정시간 지난 후 결과 값도 인정하는 경우

 

RTOS Task

Task Priority - 각 Task 중 우선순의가 높은 Task 가 우선적으로 CPU 를 점유

Task Stack - 리눅스 커널 프로세스와 동일하게 펌웨어 레벨의 RTOS 에서도 Task 별 독립된 Stack 공간이 존재

Task Status - DORMANT, RRUNNING, READY, WATING 으로 이름에서 유추가 가능함

 

RTOS ISR 및 Schedule 및 Context Switch

ISR 인터럽트가 발생을 하게 되면, 인터럽트 처리를 수행하고 Scheduler 를 호출하게 된다.

Scheduler 는 선점형 or 비선점형 인지에 따라 해당 Task 에게 CPU 점유를 허락해 준다.

여기서 Task 변경 시 Context Switch 로 레지스터를 SPSR 에 저장한 후 PC 로 이동하게 된다.

즉, 새로 수행 될 Task 의 TCB 를 스택에서 CPU 레지스터 영역으로 복사한다.

 

Non preemptive Kernel

  • 비선점형 커널은 Task 수행 중 kernel 이 Task 수행을 중지하고 다른 Task 수행하는 능력이 없는 방식
  • Cooperative Multitasking 이라고도 함
  • RTOS 에서는 사용 할 수 없음 Linux Kernel Process 에서 주로 사용 됨
  • 오히려 Low Priority Task 가 선점하여 High Priority Task 가 무한정 기다릴 수 있는 상황
  • ISR 처리 후 High priority Task 를 RUNNING 하지 않고 READY 까지만 진행 후 실제 실행은 안됨
  • Low Priority Task 동작 수행 후 sys call 로 종료해야 High Priority Task 실행 가능

즉, ISR 후 이전 수행하던 Task 다시 수행

 

Preemptive Kernel

  • 선점형 커널은 Task 수행 중 kernel 이 Task 를 중지 후 High priority Task 를 실행 할 수 있는 능력 소유
  • ISR 후 Scheduler 에 의해 priority Task 를 check 하여 High Task 를 실행하게 됨
  • High Priority Task 동작 수행 후 인터럽트 직전의 Task 로 돌아감
  • RTOS 에서는 해당 기능으로 동작 됨
  • HIGH Priority Task 가 항상 CPU 를 점유 할 수도 있음

즉, RTOS 답게 공평성 보다는 실시간 처리를 위해 선점하여 사용 될 가능성이 높음

ISR 종료 후 Scheduling 으로 Priority Task Check 하여 높은 Task 수행

 

Critical Section 임계영역

동기화라고도 하며, Win C++ 및 RTOS 등 멀티스레드 동작 시 당연하게 적용이 되어야하는 개념이다.

  • 다른 Task 에 의해 중단되어선 안되는 코드
  • 해당 부분의 코드를 시작하게 되면, 해당영역 Lock 종료까지 Context Switch 에 의한 다른 Task 수행이 없어야 함

Mutual Exclusion

  • 하나의 Task 가 공유자원을 사용하는 동안 다른 Task 가 해당 자원 사용 못하도록 보장
  • 공유자원 사용 동안 인터럽트 발생을 금지
  • 간단하며, 인터럽트 금지 시간이 길어지면 문제 발생
  • 빠른 시간안에 다시 인터럽트 Enable 해야 하므로 공유자원 양이 길면 안됨

 

Mutual Exclusion 2

  • 공유자원 사용 동안 Schduling 금지
  • Scheduling 만을 금지하였기 때문에 인터럽트 발생 가능
  • 따라서 task 간에 공유되는 자원에 대해서만 사용됨

즉, ISR 에서 공유자원 접근 시 Mutual Exclusion 을 보장 할 수 없음, 이것은 RTOS 보장 안됨으로 직결됨

Mutual Exclusion 은 임계영역이 짧고 많이 사용 안되는 경우에 효과적

 

Semaphore

  • 공유자원 즉 임계영역을 접근 시 Key 필요
  • 코드 재진입 가능
  • Priority inversion 로 높은 우선순위 테스크가 낮은 우선순의 테스크의 수행이 끝날 때 까지 기다리는 상황
  • Priority inheritance 은 높은 우선순위 테스크가 Wait 상태인 동안, 기다리도록 만든 Task 의 우선순위를 높임

Binary Semaphore

 

Counting Semaphore

반환된 Semaphore를 획득하기 위한 방법으로 pending 형태에 따라 priority based 와 FIFO based 가 있다.

Mutex 와 Semaphore 의 큰 차이점은 Semaphore 의 경우 Counting 방식으로 여러 임계영역을 Task 들이 접근 할 수 있다는 점이다.

반응형