MicroC/OS-II Concept of Real Time System 경희대학교 컴퓨터공학과 조 진 성
Contents Foreground/Background System Critical Section Resource Shared Resource Multitasking Task Context Switch Kernel Non-Preemptive Kernel Preemptive Kernel Reentrancy
Contents Priority Mutual Exclusion Deadlock Synchronization Static Priorities Dynamic Priorities Priority Inversions Mutual Exclusion Disable Interrupt Test-And-Set Disable Scheduling Semaphore Deadlock Synchronization Event Flags InterTask Communication Interrupts Clock Tick
Real Time System Real Time System Soft Real Time System 시스템이 논리적으로 완벽하게 동작해야 함은 물론이고 정해진 시간 내에 동작하지 않을 경우 심각한 결과가 발생하는 시스템을 말한다. 리얼타임 시스템은 소프트(Soft)와 하드(Hard) 리얼타임 시스템으로 분류 Soft Real Time System 소프트 리얼타임 시스템은 가능한 한 빠르게 임무를 수행하지만 반드시 정해진 시간 내에 수행할 필요는 없는 시스템 Hard Real Time System 하드 리얼타임 시스템은 어떤 사건이 발생했을 때 정확히 동작하는 것은 물론이고 반드시 정해진 시간 내에 그 임무를 끝내야 하는 시스템
Foreground / Background System 전경 프로세스는 인터럽트 레벨이라고 부르며, 인터럽트 서비스 루틴 (Interrupt Service Routine, ISR)을 통하여 비동기적으로 발생하는 이벤트를 처리한다. Background 배경 프로세스는 태스크 레벨이라고 부르며, 응용 프로그램은 요구되는 동작을 수행하기 위해서 특정한 모듈이나 함수를 호출하는 무한루프로 구성된다.
Foreground / Background System (Cont’d) Non-multitasking System 전형적인 시스템
Foreground / Background System (Cont’d) Kernel 기반 시스템
Foreground / Background System (Cont’d) Example of Foreground/Background Program /* Background */ void main (void) { 초기화; while(1){ 아날로그 입력을 읽는다; 디지털 입력을 읽는다; 모니터링 기능 수행; 제어 기능 수행; 아날로그 출력 갱신; 디지털 출력 갱신; 키보드 스캔; 사용자 인터페이스 처리; 표시장치 갱신; 통신 요구 처리; 기타... } /* Foreground */ ISR1 (void) { 비동기 이벤트 처리; } ISR2 (void)
Critical Section Critical Section 다른 process 나 task에 의해서 중단되어서는 안 되는 일련의 명령 혹은 코드의 블럭을 말한다 Critical Region 이라고도 한다.(Atomic) Critical Section 코드를 실행할 때는 인터럽트가 절대로 발생하지 않아야 한다. (disabled) . Load Rx, [g_TotalCnt] Inc Rx Store [g_TotalCnt], Rx . g_TotalCnt = g_TotalCnt +1;
Resource & Shared Resource & Multitasking Process 나 Task가 사용하는 모든 요소를 말하며, 프린터, 키보드, 디스플레이와 같은 I/O 장치, 변수, 구조체, 또는 배열이 될 수도 있다. Shared Resource 하나 이상의 process나 Task가 공통적으로 사용할 수 있는 Resource Data corruption 을 막기 위해서 각 Task는 미리 해당 자원에 대한 exclusive access 를 얻어야 한다. Multitasking 여러 Process 나 Task의 실행 순서를 결정하고 태스크 사이의 CPU 사용권을 전환하는 일련의 동작
Task Task Task는 ‘Thread’라고도 불리기도 하며, CPU를 획득하여 수행되는 간단한 프로그램이다. 각 Task는 우선순위, 고유한 CPU 레지스터 집합, 고유 스택을 할당 받는다. Task는 다음의 상태 중 한 상태를 갖는다. State Description DORMANT 메모리에는 존재하지만 수행될 수 있는 상태는 아님 READY 수행될 수는 있지만 현재 수행되는 Task보다 priority 가 낮을 때 RUNNING CPU 를 획득하여 실제로 수행되고 있는 상태 DELAYED 얼마의 시간동안 작업이 중지 WAITING Event의 발생을 기다림(I/O의 종료, 공유자원 등) INTERRUPTED 인터럽트가 일어나고 CPU 가 인터럽트 서비스를 수행할 때
Task (Cont’d) Task
Task (Cont’d) Task Transition
Context Switch Context Switch Kernel 이 동작하여 실행중인 Task의 실행을 멈추고 다른 Task를 실행하도록 하는 과정 Kernel이 다른 Task를 실행하기로 결정하면 현재 태스크의 문맥을 저장하고 새로 실행할 태스크의 문맥을 해당 스택으로부터 복구한다. Context Switch는 CPU에 오버헤드를 부과한다. CPU 레지스터가 많을수록 오버헤드는 증가한다.
Kernel Kernel Scheduler Multitasking 시스템에서 Task 관리와 Task간 통신을 관장하는 핵심부분 Kernel이 제공하는 가장 기본적인 서비스는 Context Switching 이다. Context Switch는 CPU에 오버헤드를 부과한다. CPU 레지스터가 많을수록 오버헤드는 증가한다. Scheduler Dispatcher라고도 하는 Scheduler는 Kernel의 일부이며, 다음 번으로 실행할 Task를 결정하는 일을 한다. 대부분의 Real Time Kernel에서는 우선 순위를 기준으로 결정하며, 각 Task는 그 중요성에 따라 우선순위가 배정된다. 우선 순위 기반의 Kernel에서는 비선점형(Non-Preemptive)과 선점형 (Preemptive) 두 종류가 있다.
Non-Preemptive Kernel 어떤 Task가 수행되고 있을 때 kernel이 중간에 그 Task의 수행을 중지시키고 다른 task를 수행시킬 수 있는 능력이 없다. 다른 말로 cooperative multitasking이라고도 한다. 태스크가 CPU 소유권을 넘겨줄 때는 Kernel 서비스를 명시적으로 호출한다. 비동기적 이벤트(Interrupt)는 ISR이 처리하며, ISR은 항상 인터럽트가 발생한 태스크로 되돌아온다. 장점 인터럽트 지연시간이 짧다. Task 레벨에서 비재진입(Non-reenact)함수를 사용할 수 있다. 세마포어를 사용해서 공유데이터를 보호할 필요가 줄어든다. 단점 현재 실행 중인 Task가 CPU를 자발적으로 양도해야 하기 때문에 상위 우선순위의 태스크가 실행 준비 상태가 되더라도 실제로 실행될 때를 기다려야 한다. -> 응답성
Non-Preemptive Kernel (Cont’d)
Preemptive Kernel Preemptive Kernel 시스템의 응답성이 중요한 경우에 사용된다. CPU의 제어권은 실행준비가 된 최상위 우선순위 Task로 항상 넘어간다. ISR이 최상위 우선순위 Task를 실행준비 상태로 만들면, ISR이 종료될 때 인터럽트가 발생했던 Task는 중단되고 새로운 상위 우선 순위 Task가 수행된다.
Reentrancy Reentrancy Reentrant function 한 함수를 여러 개의 Task가 사용할 수 있다. 가능한 한 지역변수를 사용하되, 전역변수를 사용해야 한다면 보호방법이 필요하다.
Priority Task Priority Static Priority Dynamic Priority 스케줄러가 다음 실행할 태스크를 결정할 때 사용하는 태스크 고유의 파라미터 중요한 일을 수행하는 태스크일수록 더 높은 우선순위를 갖도록 한다. Static Priority 응용 프로그램이 실행되는 동안, Task의 우선 순위를 바꿀 수 없다면 Task의 우선 순위는 정적(Static)이다. 각 Task는 컴파일시 정적(Static) 우선 순위가 배정된다. Dynamic Priority 각 태스크의 우선 순위는 응용 프로그램 실행 도중 바꿀 수 있다. 우선순위 전도 문제를 회피하기 위해 필요한 실시간 커널의 기능
Priority (Cont’d) Priority Inversions 높은 priority 의 Task가 어떤 자원을 사용할 준비가 되어 있을 때 낮은 priority 의 Task가 자원을 놓지 않을 때 발생하는 상황 우선 순위 전도 문제
Priority (Cont’d) 우선순위 상속을 지원하는 커널
Mutual Exclusion Mutual Exclusion Mutual Exclusion을 위한 일반적인 방법 여러 Task 들이 공유자원에 접근할 때 데이터 손상을 방지하기 위해 상호배제(Mutual Exclusion)가 보장되어야 한다. Mutual Exclusion을 위한 일반적인 방법 Interrupt 활성화/비활성화 Test-And-Set(TAS) 수행 Scheduling 활성화/비활성화 Semaphore
Mutual Exclusion (Cont’d) Interrupt 활성화/비활성화 공유자원의 독점적인 액세스를 얻을 수 있는 가장 쉬우면서 빠른 방법 인터럽트의 비활성화 기간이 너무 길면 시스템의 응답성에 영향을 주므로 주의해야 한다. Disable interrupt; Access the resource (Read/Write from/to variables); Enable interrupt; OS_ENTER_CRITICAL(); Access the resource (Read/Write from/to variables); OS_EXIT_CRITICAL(); 의사코드 MicroC/OS
Mutual Exclusion (Cont’d) Test And Set (TAS) 주로 Foreground/Background 시스템에서 사용하는 방법으로 원리는 세마포어와 같다. Disable interrupt; if(‘Access variable’ is 0){ Set variable to 1; Enable interrupt; Access the resource; Set the ‘Access variable’ back to 0; }else{ /* You don’t have access to the resource, try back later */ }
Mutual Exclusion (Cont’d) Scheduling 활성화/비활성화 ISR과 Task가 공유하는 자원에 대해 사용할 수 없다. 스케줄러가 비활성화된 동안이라도 인터럽트는 처리된다. ISR은 처리가 끝난 뒤 항상 인터럽트가 발생했던 Task로 돌아간다. 권장하지 않음. 세마포어 사용이 더 바람직하다. OSSchedLock(); Access the resource (interrupts are allowed); OSSchedUnlock();
Mutual Exclusion (Cont’d) Semaphore 용도 공유자원에 대한 접근을 제어(상호배제) 이벤트 발생을 알림 태스크간의 동작을 동기화함 코드를 실행하기 위해 얻어야 하는 열쇠로 생각할 수 있다. MicroC/OS에서는 Binary, Counting Semaphore를 모두 지원한다. Semaphore에 행하는 기본적인 3가지 operation 초기화(Create), 대기(Pend), 신호(Signal)
Deadlock Deadlock 교착상태는 두 Task가 각자 다른 Task에서 쓰고 있는 자원을 무한정 기다리는 상태를 말한다. 교착상태를 피하는 간단한 방법 Task를 진행하기 전에 필요한 모든 자원을 획득한다. 순서대로 자원을 획득한다. 역순으로 자원을 획득한다.
Synchronization Synchronization ISR과 태스크를 동기화하기 위해 세마포어를 사용할 수 있다. 이때 세마포어 카운터를 반드시 0으로 초기화해야 한다. 단방향(Unilateral) 동기화 ISR에서 태스크로, 태스크에서 태스크로 양방향(Bilateral) 동기화 태스크와 태스크 사이에서만 가능
Event Flags Event Flags Task가 여러 개의 이벤트에 동기화하고자 할 때는 Event Flags를 사용 분리동기화와 결합동기화가 있다. Event Flags를 지원하는 커널은 Event Flags를 켜고(SET), 끄고(CLEAR), 대기(WAIT)할 때 사용하는 서비스를 제공한다.
InterTask Communication 전역변수 메시지 Task와 ISR 사이의 통신은 전역변수를 통해서만 가능하다. Message Mail Box Message Queue
Interrupts Interrupts 비동기적인 이벤트가 발생한 것을 CPU에게 알려주는 하드웨어 메커니즘 CPU가 Interrupt를 인식하면 인터럽트 벡터를 참조해서 해당 ISR로 점프한다. ISR은 가능한 한 짧아야 한다. 실행시간이 길 경우 들어오는 데이터를 잃어버릴 수 있다. ISR이 이벤트를 처리하고 종료될 때, 다음 중 한 곳으로 리턴 Foreground/Background에서의 Background Task Non-Preemptive Kernel일 경우, Interrupt가 발생한 Task Preemptive Kernel일 경우, 실행 준비상태가 된 최상위 우선순위 Task
Interrupts (Cont’d) Interrupt 처리 시간 Interrupt Latency Interrupt가 비활성화된 최대시간 + ISR에서 최초 명령을 시작하려는 시간 Interrupt Response Interrupt 지연시간 + CPU 문맥을 저장하는 시간 Interrupt Recovery CPU 문맥을 복구하는 시간 + Interrupt로부터 복귀 명령 실행 시간
Interrupt Latency, Response, Recovery (Fore/Background) Interrupts (Cont’d) Interrupt Latency, Response, Recovery (Fore/Background)
Interrupt Latency, Response, Recovery (Non-preemptive) Interrupts (Cont’d) Interrupt Latency, Response, Recovery (Non-preemptive)
Interrupt Latency, Response, Recovery (Preemptive) Interrupts (Cont’d) Interrupt Latency, Response, Recovery (Preemptive)
Clock Tick Clock Tick 시간의 기본단위(Tick) Hardware적인 Timer로 발생 시스템에서 주기적으로 발생하는 특별한 인터럽트로 시스템의 Heartbeat의 역할을 한다. 10ms 에서 200ms까지의 프로그래밍 가능한 주기를 갖는다. (주기가 작을수록 Overhead는 증가) 실시간 Kernel은 clock tick을 기본 단위로 하는 시간만큼 Task를 Delay 할 수 있다. 실제 Task Level에서 Tick 단위의 시간을 정확히 구현 하는 것은 불가능 하다.
Clock Tick (Cont’d) Clock Tick (Case 1)
Clock Tick (Cont’d) Clock Tick (Case 2)
Clock Tick (Cont’d) Clock Tick (Case 3)
Real Time System Summery Foreground,Background Non-preemptive Kernel Preemptive Kernel Interrupt latency MAX(가장 긴 명령어, 사용자 인터럽트 비활성화) + ISR 진입시간 MAX(가장 긴 명령어, 사용자 인터럽트 비활성화, 커널 인터럽트 비활성화) + ISR 진입시간 Interrupt response 인터럽트 지연시간 + CPU 문맥 저장시간 + 커널의 ISR 진입함수 Interrupt recover 배경 프로세스 문맥 복구 시간 + 인터럽트 복귀 명령 태스크 문맥 복구 시간 최상위 우선순위 결정 + 배경 프로세스 문맥 복구 시간 + 인터럽트 복귀 명령 Task response 배경 프로세스 최장 수행시간의 태스크 + 최상위 우선순위 결정 + 문맥 전환 시간 최상위 우선순위 결정 + 문맥 전환시간 ROM Size App Code APP Code + Kernel Code RAM Size +Kernel RAM +SUM (태스크 스택 + MAX(ISR스택)) 제공되는 Service App Code가 제공되어야 함 있음