리얼타임 리눅스

문형배 / progress@uniwork.co.kr / (주)유니워크 대표이사

 

     

    ※목차

    1) 리얼타임의 의미와 분류
    2) RT-Linux란?
    3) RT-Linux가 주로 타겟화 하는 것
    4) Embedded System
    5) 리눅스가 개발에 지원하는 것들
    6) RT-Linux의 실제
    7) 앞으로의 방향

     

1)  리얼타임의 의미

    리얼타임은 한마디로 “빠르다”라고 표현할 수 있다.

    리얼타임에 대해서는 많은 부분이 오해로 남아있다.
    일반적으로는 어떤 사상이 발생한 것을 받아 즉시 응답하는 것을 리얼타임이라고 말하기도 한다.

    이것은 즉시 응답이라는 것과 우리가 오해하고 있는 등시성(우리는 리얼타임이라 하면 동일시간에 발생하는 것으로 오해하는 경우가 비일비재하다.)과는 약간은 다른 표현이 된다. 쉽게 말하자면, 리얼타임은 등시성보다 완만한 의미를 가진 단어이다.

    진정한 의미의 리얼타임이란 허용시간내에 응답하는 것을 의미한다.

    리얼타임이라 하면 소프트 리얼타임과 하드 리얼타임의 두 종류로 분류할 수 있다.(굳이 나누자면)

    소프트 리얼타임 시스템에서는 각 태스크는 시스템에 의해 가능한 빨리 실행되지만, 어떤 정해진 시간내에 종료할 필요는 없다.

    하드 리얼타임 시스템에서는 태스크가 정확하게 실행될 뿐 아니라, 정확한 시간에서 실행되어야 한다.

    리얼타임 애플리케이션은 넓은 영역에 걸쳐 있다. 리얼타임 시스템을 필요로 하는 애플리케이션은 대부분이 망구축 시스템이다. 간략한 예를 들자면, 화학플랜트와 같은 프로세서 제어, 자동차의 엔진제어, OA, 컴퓨터 주변기기,로봇,항공기의 제트엔진 제어, 그리고, 심지어는 세탁기와 같은 가전제품에도 해당한다.

    이러한 것들에서는 사용되는 컴퓨터(사실은 컴퓨터의 개념은 아니지만)는 시스템에 이미 구축되어 있어서 사용자에게는 별반 인식없이 넘어가는 것들이다.

    일반적으로, 리얼타임 소프트웨어는 그렇지 않은 경우보다 설계가 훨씬 어렵다.
    그러나, 리얼타임 커널을 사용하는 것으로, 대상을 커널에 의해 관리하는 복수의 태스크로 분할할 수 있으므로, 설계 프로세스를 보다 단순화할 수 있다.
    (사실은 어려운 일임에는 틀림없다.)

 

2)  RT-Linux란?

    RT-Linux는 Real Time Linux를 줄인 말로서, 최근 리눅스계의 화두를 장식하고 있는 중이다.

    리눅스는 선점형 멀티태스킹 시스템이고, 이러한 체제에서 정확한 시간 주기를 가지고 일을 해야 하는 프로세스에게 커널이 정확한 타이밍을 맞춰준다는 것은 불가능한 것으로 보일 수 있다.

    이를 해결하기 위해서, 제안된 프로젝트이며 이 문제가 해결되어야 만이 리눅스가 진정한 임베디드시스템에서의 운영체계로서 활용될 수 있을 뿐만 아니라, 첨단과학과 로봇에 활용하는 것이 가능하다.

    리눅스가 리얼타임 리눅스로 발전하려면, Hard, Soft 시간의 제약성을 만족 시켜주어야 하며, 최악의 실행 시간을 만족해야만 하는 등, 기본적으로 상용 RT-OS인 Vx-Works등에 비해서는 개선되어야 할 점이 한 두 가지가 아니다.

    그럼에도 불구하고, 이러한 프로젝트가 활발한 것은 리눅스의 여러가지 강점 때문이다.
    임베디드 시스템에 있어서 나중에 접목시켜야 할 다양한 애플리케이션이 이미 존재한다. 대체적으로 안정적이고 안전하며 성능 또한 우수하다. 그리고, 평균적인 성능을 향상시킬 수 있으며 공정한 서비스를 추구할 수 있는 것 등의 강점이 있다.

 

3)  RT-Linux가 주로 타겟화 하는 것

    실험실 장비, 즉 계측기 같은 것들이 이에 해당한다.

    그리고, 임베디드 시스템, 로봇, 엔진, 세트톱박스 같은 것이 해당되며, 최근 국내에서도 가장 많이 개발되는 것들이 이에 해당한다 할 수 있다.

    예를 들자면, 웹서버를 탑재한 태양열 엔진으로 구동되는 자동차를 위한 제어 시스템같은 것이 좋은 예가 될 수 있을 것이다.

 

4)  Embedded System

    한마디로 표현하자면, 독립장비 혹은 내장화(프로세서 포함)한 시스템이라고 말할 수 있습니다.

    한 개의 시스템이 스스로 판단하여(물론, 프로그램되어 있는 것)동작등을 수행하는 것을 일컫습니다.

    예를 들자면 인터넷 세트톱박스, PDA, 전화기, 라우터 등의 네트워크 장비에서부터 냉장고에 이르기까지 입니다.

    물론, 이러한 모든 시스템에는 네트워크 기능, 즉, 인터넷과의 연동이 필수처럼 여겨지고 있는 것이 새 천년의 화두가 되고 있습니다.

 

5)리눅스가 개발에 지원하는 것들

    리눅스는 아래와 같은 막강한 개발 환경을 지원한다.
    우리가 어떻게 활용하느냐에 따라서, 리얼타임 OS가 아니라는 단점을 많이 극복할 수가 있다.

    X-windows, TCL/Tk, Networking(다른 것들이 흉내 못낼 막강함!), Compilers,GNU utilities,충분히 검증된 공개된 소스코드(최고의 매력!), 빠른 발전과 엄청난 개발자, 사용자들의 지원...

    컴파일러의 경우에만 해도 개발자들은 다 아는 것이지만, 엄청나게 비싼 상용을 쓰지 않아도 되는 경제적인 효과를 간과할 수는 없다.

 

6)RT-Linux의 실제

    자 그럼, 실제로 어떻게 적용되는지를 대략적으로 알아보도록 한다.
    참고로, 아래에 서술되는 내용들에 대한 Bill Crum의 예제등은 어느 정도의 기본기가 있어야만이 이해할 수 있음을 미리 밝혀두는 바이다. 커널에 대한 기본 이해 없이는 아래의 내용을 건너뛰기를 권장한다.

    RT-Linux의 목표는 다음의 공존할 수 없는 두 가지를 적절히 혼합 하는데에 있다.

    하드 리얼타임 서비스인 Predictable, Fast, Low Latency(호출 시간이 길지 않은), Simple Scheduler 등과 스탠더드한 Posix 규약의 모든 서비스인 GUI, TCP/IP, NFS, compilers, Web-servers 등이 같은 Operating System에서 효율적으로 존재하는 것이다.
    RT-Linux application은 일반적으로 아래와 같이 구성되어진다.

    리눅스 프로세스와 리얼타임 태스크는 특별한 Fifo와 공유메모리에 의해서 상호간에 통신을 주고 받는다.

    자, 이제 Bill Crum에 의해서 개발된(486/33) 신호발생기 어플리케이션에 대한 예를 보자.

    두 개의 주기적인 RT-task(주기 @800 μs)가 있다. 각각의 태스크는 사각파, 삼각파, 정현파등을 발생시킬 수 있다. TCL/TK로 된 사용자 프로그램은 파형을 선택하는데 사용되는 푸쉬 버튼을 디스플레이한다. 명령들은 fifo에 의해서 리얼타임 태스크에게 전달되어진다.

    리얼타임 요소들은 일반적인 리눅스에 탑재된 커널 모듈내에서 코딩되어진다. 유저 프로세스는 fifo를 생성하고, 읽고, 쓰기 위한 시스템 호출을 한다. fifo는 실행 우선 순위가 역전되는 엄청난 문제를 피하기 위해서 특별히 디자인되어 있다.

    rt_task_init 함수를 호출함으로서 태스크들은 체계적으로 초기화된다. 이러한 행위는 메모리, 스택, FIFO 등을 할당한다.

    인터럽트에 의해서든지, 주기적인 스케줄러에 의해서든지 태스크들은 체계적으로 스케줄한다.

    다음은 초기화의 예제이다.
     

    int init_module(void){
             RTIME now = rt_get_time();
             rt_task_init(&mytask1, wave_handler, 1, 3000, 5);
             rt_task_init(&mytask2, wave_handler, 2, 3000, 5);

              rt_task_make_periodic(&mytask2, now, 993);
              rt_task_make_periodic(&mytask1, now+3000, 993);
              return 0; }

 

    위의 예제에서 주기가 993 = @800μs 인 두 개의 태스크가 생성된다.

    다음은 신호 발생기를 위한 태스크 코드이다.
     

    while(1) {
            if (rt_fifo_get(t, &command, 1) > 0)
                    outdev(PORT, next(command));
            rt_task_wait();
            }

 

    신호발생기의 사용자 부분은 (1)TCL/TK로 구성된 일반적인 리눅스 어플리케이션을 쓰면 된다.
    그리고, fifo를 초기화시키고, (2)RT-task에게 명령을 보내는 매우 간략한 C 프로그램의 집합을 쓸 수 있다.

    (1) TCL/TK 사용자 프로그램 예제
     

    frame.f1 -relief groove -borderwidth 3
    frame.f2 -relief groove -borderwidth 3

    label.f1.l1 -text “ Channel 1 “
    label.f2.l2 -text “ Channel 2 “
    button.f1.widget1 -text “ sine wave “ -command { exec ./sinewave 1 1 }
    button.f1.widget2 -text “ square wave “ -command { exec ./sinewave 1 3 }
    button.f1.widget3 -text “ sawtooth wave “ -command { exec ./sinewave 1 2 }
    button.f1.widget4 -text “ flatline “ -command { exec ./sinewave 1 0 }
    button.f1.widget5 -text “ exit “ -command { exec rmmod rt_process.o exit }

 

    (2)명령을 보내는 프로그램 예제
     

    int main(int argc, char **argv){
            char outbyte;
            int fifo;
            fifo = atoi (argv[1]);
            outbyte = (char) atoi (argv[2]);
            rt_fifo_write(fifo, &outbyte, 1);
            exit(0);     }

 

    위에서 여러 가지 어려운 코딩을 많이 보았다.
    어려운 내용이므로 초보자는 많은 연구 후에 보기 바라며, 어떤 개인의 개발 과정에 대한 예시일 뿐이므로 자세한 설명을 하지 못한 점은 애석하게 생각한다.
    코딩을 이해하려 들지 말고, 이렇게 할 수 있구나 하는 개념을 얻었으면 충분하리라 본다.

    최종적으로 RT-Linux 의 구성을 아래와 같이 도해해 본다.

    추가적으로 이야기하자면, RT-Task를 위한 모든 자원은 정적으로 할당되어 있다.
    메모리, fifo, 그리고 프로세서 타임은 태스크 생성에 고정되어 있다.
    또한, 리얼타임 태스크는 인터럽트를 불가능하게 할 수도 있다.

    RT-Linux에 있어서는 결국 Interrupt Latency가 너무 길다는 것을 어떻게 극복해야 할지가 가장 큰 성능상의 문제가 되고 있다.

 

7) 앞으로의 방향

    Linux의 RTOS화인 RT-Linux는 스케줄링 오버헤드, 시스템 콜 오버헤드, 과부하 상태에서의 동작, 인터럽트 문제등 해결해야 할 것들이 산적해 있다.

    그러나, 다양한 응용이 가능하고 RTAI, KURT와 같은 어느 정도의 성공작들이 있으므로, 비관만 할 일은 아니라고 본다.

    여러 가지 변종을 충분히 시도하여서, 리눅스로 통제되는 지능형 로봇이 아침 식사시중을 하는 날이 빨리 왔으면 하는 바램이다.

    #참고
    http://www.rtlinux.org/rtlinux/index.html
    http://emlinux.com/
    http://www.linuxdevices.com/cgi-bin/news_view.cgi
    http://server.aero.polimi.it/projects/rtai
    http://hegel.ittc.ukans.edu/projects/kurt
    http://luz.nmt.edu/rtlinux 에서는 Bill Crum의 예제를 인용하였음




▲ top

home으로...