임베디드 시스템에서의 운영체제 : RTOS - Real Time Operating System

RTOS - Real Time Operating System

Just4Fun 2016.10.15 15:37

한때에는 임베디드 시스템 프로그램을 RTOS를 기반으로 개발하는 것이 일반적이었던 때가 있었다.  RTOS의 종류로는 VxWorks, pSOS와 같은 고가의 상용 제품과 더불어 uC/OS, FreeRTOS, RTEMS 등 소스가 공개되어 무료 또는 저가의 라이센스 비용만 지불하면 사용할 수 있는것들을 포함하여 그 수가 헤아릴수 없을 정도이다.

 

그러나, 최근에는 UNIX 계열 OS인 리눅스를 임베디드 시스템의 OS로 적용하는 것이 대세이기 때문에 점차 상용 RTOS는 사양길로 접어들고 있다.  서버 컴퓨터용 OS인 리눅스가 어떻게 임베디드 시스템 OS 시장을 장악하게 되었는지 그 이유를 따져본다면 다음과 같은 이유때문이 아닐까 싶다.

 

아마, 가장 큰 이유는 리눅스가 무료이기 때문일것이다.  게다가 소스코드까지 공개되어 있으므로 문제가 발생했을때 이를 해결하거나, 새로운 기능을 추가하는것에 제약이 없다.  상용 OS의 경우, 많은 비용을 지불함에도 불구하고 소스코드까지 접근하기 쉽지 않고, 문제가 생겼을 때 도움 받기가 그리 만만하지가 않다. 이에 반해 리눅스 관련 자료는 인터넷에서 쉽게 얻을 수 있고, 어떤 문제에 가로 막혔을 때 이미 이와 비슷한 문제로 고민한 개발자들이 인터넷에 그 해결 방법을 공개해 놓는 경우가 있으므로 스스로 문제를 해결할 수 있기가 수월하다는 장점이 있다.  심지어 최근에는 부품업체들은 기본적으로 리눅스용 드라이버를 제공해야지 사업이 가능하기 때문에 더더욱 리눅스가 임베디드 시장에서 절대적인 존재가 될 수 있게 되었다.

비용이 걱정된다면 무료 RTOS를 선택할 수도 있겠지만, 대부분의 경우 리눅스만큼 다양한 기능을 제공하는 경우가 드물어서 상용 제품에 적용하기에는 다소 부족한 면이 있다.

 

리눅스가 오픈소스이기 때문에 무료로 이용할 수 있고, 인터넷에 자료가 널려 있더라도 UNIX계열 OS를 임베디드 시스템에서 무리없이 동작시킬수 있는 하드웨어가 뒷받침 되지 않는다면 애당초 리눅스를 임베디드 시스템용 OS로 선택하는것은 불가능한 얘기였을 것이다.  반도체 기술의 끊임없는 발전으로 고성능의 Multi-core CPU와 대용량의 DDR메모리와 NAND 플래쉬 메모리등이 아주 저렴한 가격으로 제공되므로 부담없이 임베디드 시스템의 OS로 리눅스를 선택할 수 있게 된것이다.  라즈베리 파이, 비글본, 오드로이드 등과 같은 제품을 몇만원에 구입할 수 있는것이 신기할 따름이다.

 

마이크로 컨트롤러도 예외없이 하드웨어 성능이 점차 좋아지고 내부 메모리(RAM과 ROM 모두)의 크기도 증가하는 추세에 있다.  예전에는 하드웨어 성능과 크기의 제약으로 OS없이 단순한 기능만 수행 가능했던것이 이제는 RTOS를 적용할 수 있을 정도로 하드웨어 성능이 향상 되었다.

 

이러한 이유로, AVR에도 RTOS를 동작시켜보기 위한 방법에 대해서 몇회에 걸쳐 설명하고자 한다.

 

그 첫번째 설명으로 이번 글에서는 RTOS가 무엇인지, RTOS를 사용하면 어떤 장단점이 있는지 간단히 설명하도록 하겠다.

 

 

올해(2016년) 초에 알파고라는 인공지능 컴퓨터와 이세돌이라는 세계 바둑최고수 인간과의 경기가 있었던 것을 기억하고 있을것이다.  많은 사람들의 예상을 깨고 알파고가 압도적으로 인간 최고수를 꺽어서 세상을 깜작 놀라게 했었다.

실제 알파고는 CPU가 수천개가 있는 컴퓨터에서 돌아가는 프로그램 이름이지만, 그냥 하나의 컴퓨터라고 가정하고 설명하도록 하겠다.

 

이세돌은 인간을 대표하는 세계최고수이므로 알파고는 모든 자원을 한명의 인간과의 경기를 위해서 사용할 수 밖에 없었다.  하지만 상대가 아마추어 선수라면 굳이 전체 자원을 사용할 필요는 없을 것이다.  

만약 알파고가 한명의 아마추어 선수와 경기를 하기 위해서 전체 자원의 10%만 투입하더라도 충분하다면 나머지 90%의 자원은 그냥 낭비되고 있는것이다.

이제 알파고가 동시에 두명의 선수와 바둑 경기를 두게 된다면 20%의 자원을 사용하게 될것이다.  이때 동시라고 표현한것은 엄밀하게 얘기하면 시간을 적절히 배분하여 두명의 선수 입장에서는 알파고가 선수 개개인과 1:1로 경기를 하는것처럼 하면 된다는 것을 의미하는 것이다.  이런식으로 알파고와 경기하는 선수의 숫자를 늘려가면 최대 10명까지 동시에 알파고와 경기를 펼칠수 있게되어 알파고를 100% 활용하게 될 것이다.

 

위의 상황에서 선수의 실력과 관계없이 모든 선수에게 공평하게 시간을 배분했다면, 이러한 방식을 라운드로빈 방식이라 부를수 있겠다.

 

만약 선수들의 실력이 제 각각이라서 급수를 정하고 실력이 좋은 상급자 선수 우선으로 경기를 진행해 나간다면 우선순위(Priority) 방식이라고 부른다.

우선 순위 방식에는 두가지로 다시 나누어 볼 수 있는데, 하급자가 알파고와 바둑을 두고 있는 상황에서 상급자가 알파고와 경기를 하고 싶을 때, 낮은 실력자의 경기를 잠시 멈추고 상급자에게 알파고를 사용할 수 있는 권한을 부여하면 이를 가리켜 선점형 우선순위(Preemptive)라고 부른다.  이와 달리 비록 상급자가 바둑을 두어야 할 상황이 되더라도 하급자가 아직 바둑을 두고 있는 상황이라면 한 수를 완료할 때까지 기다려 주는 방식을 비선점형 우선순위(Non-preemptive)라고 부른다.

 

임베디드 시스템에서는 주로 선점형을 사용하는데, 우선 순위에 따라 CPU 사용 권한을 조정하는것을 스케줄러(Scheduler)라고 부른다.  그리고 위의 바둑에서의 예처럼 각각의 바둑 선수를 타스크(task)라고 부른다.  바둑 선수들은 각자의 바둑판을 가지고 있어서 알파고와 바둑을 둘때 스케줄러가 바둑판에 놓인 정보를 알파고가 알수 있게 해주어야 한다.  바둑의 한수가 진행된 후 다른 선수가 알파고와 바둑을 두어야 되는 상황이 되면 현재 선수의 바둑판을 어딘가에 저장해 두고, 새로운 선수의 바둑판 정보를 읽어 와야된다.  이때 바둑판의 돌들의 정보를 컨텍스트(Context)라고 한다. 이 context를 저장하고 새로 불러오는 동작을 컨텍스트 스위칭(context switching)이라고 한다.

선수의 이름, 급수, 현재 진행된 바둑의 상태, 이 선수가 가지고 있는 바둑판의 위치 등등에 관련된 자료를 타스크 컨트롤 블럭(TCB: Task control block)이라고 부른다.

 

위에서 설명한 것이 대략적인 RTOS의 개념과 RTOS에서 사용되는 주요 명칭들이다.

 

이제 RTOS를 사용하는 이유에 대해서 설명하도록 하겠다.

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

요즘에 나오는 승용차 내부에는 생각보다 많은 MCU들이 들어간다고 한다. 

예를 들어 다음과 같은 MCU들이 승용차에 내장되어 있다고 가정해 보자.

 

주위의 빛의 세기를 감지해 전조등을 켜고 끄는 기능을 담당하는 MCU하나가 있다.  이 MCU 는 오로지 이 일만 담당한다.

또 다른 하나는 전조등이 켜져 있는 상황에서 마주오는 차량의 유무를 판단하여 전조등의 밝기를 조절하는 기능을 수행하도록 되어 있다.

세번째 MCU는 앞유리창에 흘러 내리는 빗물을 감지하여 자동으로 와이퍼를 작동하고 비의 세기에 따라 와이퍼 작동 간격을 조절하는 일을 담당한다.

각각의 MCU의 동작을 그림으로 표현하면 다음과 같이 표현할 수 있겠다.

 

 

이렇게 세개의 MCU가 서로 독립적으로 동작되고 있는 상황에서 새로운 MCU를 선정하였는데, 새로운 MCU의 성능이 좋아서 앞의 세개의 MCU가 하던 일을 새 MCU에서 모두 처리할 수 있게 된 것이다.  따라서 각각의 MCU에서 돌던 프로그램을 하나로 합쳐야 된다.  이 상황을 그림으로 대략적으로 표현하면 다음과 같이 될것이다.

 

각각의 MCU에서 수행하던 일을 하나의 MCU에서 하게 되면 생각지 못했던 일들이 생기고 이를 해결하는것이 쉽지 않게 된다.  예를 들어 빗물 세기와 주위 빛의 세기는 갑자기 변하는 값들이 아니다.  이에 반해 앞에서 마주오는 차량의 존재 여부는 상당히 비 규칙적이고 빠른 반응을 해 주어야 한다.  그런데 비가 많이 내리는 밤을 가정할 때 위의 흐름도대로라면 와이퍼를 동작 시키느라 마주오는 차량에 대한 전조등 제어를 제때 수행하지 못하는 경우가 발생할 수도 있다.

 

만약 RTOS를 사용한다면, 이러한 일들을 비교적 쉽게 해결할 수가 있게 된다.  개별적인 MCU가 수행했던 일들을 타스크로 변환하면 된다.  빛감지 MCU는 빛감지 타스크가 되고, 전조등 밝기 제어 MCU는 전조등 밝기 제어 타스크가 된다. 마찬가지로 빗물 센서 MCU는 빗물 센서 타스크가 되는 것이다.

 

먼저 주위가 밝아 전조등이 꺼져 있는 상황이라면 전조등 제어 타스크가 동작될 필요가 없게 된다.  그럼 이 타스크를 suspend 시켜 놓으면 된다.  빛의 밝기는 빨리 변화는 값이 아니므로 가끔씩 측정해도 크게 문제가 없다.  따라서 빛감지 타스크는 비교적 늦은 타이머를 이용하여 가끔씩 빛의 세기를 측정하면 된다.  

빗물감지 타스크도 비슷하게 가끔씩 타이머를 이용해서 한번씩 빗물의 세기를 측정하면 되는 것이다.

 

만약 앞에서의 예처럼 비가 많이 내리는 밤의 상황이 되었다고 가정해 보자.  당연히 전조등이 켜졌으므로 전조등 제어 타스크를 깨우게 하고, 전조등 제어 타스크는 자주 앞에서 차가 오는지 감지하여야 한다.

와이퍼를 동작하기 위하여 빗물 센서 타스크가 동작중일때 앞에서 차가 오면, 즉시 와이퍼 동작을 멈추고 전조등의 세기를 조절한 다음 다시 와이퍼 동작을 재개하면 된다.

이러한 일련의 동작은 RTOS를 사용하게 되면 의외로 쉽게 해결할 수 있게 된다.

이것이 RTOS를 사용하는 가장 중요한 이유일 것이다.  자원을 효율적으로 사용할 수 있게 하고 복잡한 일들을 타스크로 나눔으로써 일을 단순화 시킬수 있게 된다.

 

하지만, RTOS를 사용하는것에 장점만 있는것은 아니다.

RTOS의 가장 큰 단점은 프로그램이 엉뚱한 동작을 하였을 때 그 원인을 찾기가 쉽지 않다.  실제로 경험해 보면 다른 타스크가 잘못 동작되었는데 그 결과는 엉뚱하게 전혀 무관한 타스크에서 문제로 발생하게 되는 경우가 있다.

따라서 RTOS 환경에서 프로그램을 개발할 때에는 타스크간의 관계와 문제가 발생할 때 어떻게 디버깅 할 것인지 미리 고려해 놓아야 한다.

 

그럼에도 불구하고 RTOS는 임베디드 시스템에서 충분히 사용할만한 가치가 있다.



출처: https://embed-avr.tistory.com/90 [AVR로 시작하는 임베디드]

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
22 [아두이노 arduino] Arduino – base64 encode and decode file 졸리운_곰 2024.03.11 0
21 [아두이노 arduino] Simple encryption using XOR operator 졸리운_곰 2024.03.11 0
20 [아두이노 arduino] 아두이노 json 암호화: Crypt json content file 졸리운_곰 2024.03.11 0
19 C#으로 아두이노의 LED 제어하기 - C# 프로그래밍 file 졸리운_곰 2024.02.25 1
18 Top 20 Arduino-based Health Projects file 졸리운_곰 2020.06.07 77
17 Get started with machine learning on Arduino file 졸리운_곰 2019.11.12 131
16 아두이노 운영체제 : 4 Operating Systems for the Arduino file 졸리운_곰 2019.11.04 135
15 아두이노 프로토쉴드(ProtoShield) 조립 가이드 file 졸리운_곰 2019.10.31 116
14 아두이노 우노 를 이용한 부트로더 굽기 ATMEGA328 file 졸리운_곰 2018.01.04 274
13 아두이노 부트로더 굽기(Arduino boorloader burning) file 졸리운_곰 2018.01.04 253
12 아두이노를 이용한 미니 웹 서버 만들기 - LED 제어 file 졸리운_곰 2017.08.03 276
11 아두이노를 이용한 미니 웹 서버 만들기 - 예제 분석 file 졸리운_곰 2017.08.03 381
10 아두이노를 이용한 미니 웹 서버 만들기 - 시작하기 file 졸리운_곰 2017.08.03 239
9 CSEduino : 아두이노 호환 : PCB 주문하여 납땜 조립가능 소형 보드 file 졸리운_곰 2017.08.02 186
8 회로 시뮬레이션 및 아두이노 시뮬레이터 Autodesk의 123D Circuits file 졸리운_곰 2017.06.10 550
7 브레드보드 위에 아두이노 만들기- Arduino Breadboard DIY file 졸리운_곰 2016.11.20 526
6 아두이노 UNO 회로도, Arduino UNO Schemetic file 졸리운_곰 2015.07.04 1861
5 Intel® Edison Boards, rcad* Schematic Design File file 졸리운_곰 2015.07.04 173
4 아두이노 부트로더 굽기 2 file 졸리운_곰 2015.07.04 504
3 아두이노 부트로더 굽기 졸리운_곰 2015.04.30 378
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED