본문 바로가기

아두이노에도 OS가? 실시간 커널과 RTOS

반응형

 

 

그림 1

 

 

 

 

 여러분들이 한 번쯤 접해 보았거나 들어봤을 아두이노, 그 아두이노에도 OS를 설치할 수 있다는 것을 알고 계신가요? Windows, iOS, Linux 등은 들어 보셨을지도 모르지만, 대부분은 아두이노 OS에 대해서 들어보신 적은 적을 것입니다. 사실 시중에 있는 임베디드 시스템(아두이노)에는 OS가 설치된 경우가 많습니다. 보통 실시간 커널이 탑재가 된 실시간 운영체제이죠.  이번 포스트에서는 이것이 무엇인지, 그 기능은 무엇인지, 아두이노에서는 어떻게 쓸 수 있는지 알아보도록 하겠습니다.

 


 

 

운영체제가 뭐 하는 프로그램이지?

 

실시간 운영체제를 알아보기 전, 운영체제 자체가 무엇인지에 대해 알아보겠습니다.

운영체제는 영어로 Operating System이며, OS라고 부릅니다.

운영체제의 기본적인 기능은 다음과 같습니다. 

1. 멀티테스킹

2. 디바이스 관리

3. 메모리 관리

 

멀티테스킹은 task(또는 thread)라고 불리우는 함수들을 동시에 실행되는 것처럼 보이게 하는 것입니다. 아두이노에서는 모터를 동작시킴과 동시에 LCD에 글자를 보이게하는 효과를 얻을 수 있죠. 이처럼 두 가지 이상의 일을 한 번에 실행되는 것처럼 보이게 하는 것이 멀티테스킹입니다.

 

디바이스 관리는 연결된 장치들을 사용할 수 있게하는 기능입니다. 흔히 API라고 불리우는 기능을 여기서 한다고 생각하시면 편합니다. 아두이노에서는 I/O나 UART 같은 디바이스를 바로 제어할 수 있기 때문에 큰 이점이 있다고는 할 수 없지만, 일반적으로 컴퓨터는 운영체제가 제공하는 API를 이용하여 간접적으로 컴퓨터에 연결된 디바이스를 제어하는 것입니다.

 

 

메모리 관리는 RAM을 관리하는 기능입니다. 아두이노에서는 SRAM 따위를 관리한다고 할 수 있습니다. 여기서 관리라는 것은 일정 크기의 메모리를 사용할 수 있도록 설정하는 행위들을 의미합니다. 

 

 

 


 

그렇다면 실시간의 의미는?

 

일반적으로 컴퓨터 명령어들은 정해진 시간동안 수행되는 것이 아닙니다. 때에 따라서는 빠르게, 느리게 수행된다는 뜻입니다.

예를 들어 1+1을 수행하는 프로그램을 실행할 때마다 그 실행 시간이 다르다는 뜻입니다. 어느 때는 0.1s, 어느 때는 0.12s가 걸릴 수 있다는 뜻입니다. 즉, 프로그램이 언제 끝날지 모른다는 뜻입니다.

 

실시간 운영체제에서 실시간이란 비교적 정확한 시간 동안에 프로그램을 수행시킬 수 있다는 뜻입니다. 
즉, 실시간 운영체제에서 1+1를 수행할 때마다 0.13s만 걸린다는 뜻입니다.

 

 

실시간의 중요성

"프로그램이 정확한 시간 안에 끝나는 것이 뭐가 중요해?" 라고 말하실 수도 있습니다. 네, 일반적인 PC에서는 프로그램의 정확한 실행 시간이 중요하지는 않습니다. 

 

멜론 프로그램은 클릭 후 무조건 0.1s 안에 실행이 되어야해!

 

위와 같은 상황은 일반적으로는 중요하지 않다는 뜻입니다.

하지만 순간순간이 중요한 초고속 촬영 장비나 고위험 시설인 원자력 발전 시설 안전이 최우선인 비행기에 사용되는 시스템 등의 환경에서는 얘기가 달라집니다. 0.1s라도 프로그램이 늦게 끝난다면 원하는 결과를 얻을 수 없거나, 위험한 상황이 발생할 수 있기 때문입니다. 

위험한 상황의 예는 원자력 시설에서 알 수 있습니다. 수학적으로 어떤 것을 계산한 결과, 어떤 프로그램이 0.50s 안에 끝나야 안전한데 0.51후에 끝날게 될 경우 위험한 상황이 발생할 수 있다는 것입니다.

 

 

 

 


 

실시간 운영체제와 임베디드 시스템(아두이노)

임베디드 시스템에서 실시간 운영체제를 사용하는 이유는 다음 3가지라고 생각됩니다.

1. 멀티테스킹 기능을 사용하기 위해

2. 실시간성이 필요하기 때문에

3. 주변장치(디바이스)를 쉽게 사용하기 위해

 

 

 

Free RTOS

유명한 실시간 운영체제는 uCOS, RTOS가 있습니다. RTOS는 아두이노에서도 사용할 수 있는 운영체제입니다. Real Time Operating System의 약자로 실시간 운영체제라는 뜻이죠.

위에서는 설치한다라는 표현을 사용했지만 아두이노에서는 코드를 작성한다라는 표현을 사용할 수 있을 것 같습니다.

 

다음 코드는 아두이노에서 RTOS를 사용하여 동시에 D13과 D12를 500ms 동안 끄고 키는 것을 반복하는 동작을 수행시킵니다.

 

#include <FreeRTOS_AVR.h>

void Thread1(void* arg) {
	while(1) {
    		digitalWrite(13, HIGH);
        	vTaskDelay(500);
        	digitalWrite(13, LOW);
        	vTaskDelay(500);
	}
}

void Thread2(void* arg) {
	while(1) {
    		digitalWrite(12, HIGH);
        	vTaskDelay(500);
        	digitalWrite(12, LOW);
        	vTaskDelay(500);
	}
}






void setup() {
	xTaskCreate(Thread1, NULL, configMINIMAL_STACK_SIZE, NULL, 1, NULL);
	xTaskCreate(Thread2, NULL, configMINIMAL_STACK_SIZE, NULL, 2, NULL);
    	vTaskStartScheduler();
}

void loop() {
}

Thread1에서는 13, Thread2에서는 12번을 제어합니다.

xTaskCreate함수를 통해 Thread1과 Thread2를 사용할 준비를 하고,
vTaskStartScheduler를 통해 멀티테스킹을 시작합니다.

 

멀티테스킹이 시작 되면, Thread1과 Thread2가 동시에 실행되는 것처럼 보여 13번과 12번이 동시에 제어되는 것처럼 보이게 됩니다.

 

 

반응형