[아두이노] 아두이노에서 RTOS 사용하기 (FreeRTOS in Arduino)

아두이노에서 RTOS 사용하기 (FreeRTOS in Arduino)

아두이노에 포팅된 FreeRTOS를 사용하면 아두이노에서도 RTOS를 사용해 멀티 쓰레드로 프로그램을 만들 수 있다. FreeRTOS를 설치하려면 먼저 브라우져에서 아래 주소로 이동한다.


greiman_FreeRTOS-Arduino_%25C2%25B7_GitH


Download ZIP을 클릭해 zip 파일을 다운받는다. 다운받은 파일의 압축을 풀면 디렉토리 내에 아래와 같은 파일들이 만들어진다.

FreeRTOS-Arduino-master.jpg


이 중 libraries 디렉토리 내에 아래와 같은 3개의 서브디렉토리가 들어있다.

libraries.jpg


이 3개의 서브디렉토리를 자신의 아두이노 라이브러리 디렉토리에 복사 해 주면 된다. (아두이노에 외부 라이브러리 설치하는 법 참조)
아두이노 DUE를 사용하면 FreeRTOS_ARM을 사용하고 아두이노 UNO, MEGA등 AVR 프로세서를 사용한 아두이노의 경우 FreeRTOS_AVR을 사용하면 된다. 

라이브러리 설치가 끝나면 아두이노를 재시동하고 예제 -> FreeRTOS_AVR -> frBlink 파일을 선택해 보드에 업로드 해서 LED가 깜빡이면 FreeRTOS가 정상적으로 동작하고 있는 것이다. 

#include <FreeRTOS_AVR.h>

const uint8_t LED_PIN = 13;
SemaphoreHandle_t sem;

static void Thread1(void* arg) {
  while (1) {
    xSemaphoreTake(sem, portMAX_DELAY);
    digitalWrite(LED_PIN, LOW);
  }
}

static void Thread2(void* arg) {
  pinMode(LED_PIN, OUTPUT);
  while (1) {
    digitalWrite(LED_PIN, HIGH);
    vTaskDelay((200L * configTICK_RATE_HZ) / 1000L);
    xSemaphoreGive(sem);
    vTaskDelay((200L * configTICK_RATE_HZ) / 1000L);
  }
}

void setup() {
  portBASE_TYPE s1, s2;

  sem = xSemaphoreCreateCounting(1, 0);  // 세마포어를 생성
  s1 = xTaskCreate(Thread1, NULL, configMINIMAL_STACK_SIZE, NULL, 2, NULL); // Thread1 생성
  s2 = xTaskCreate(Thread2, NULL, configMINIMAL_STACK_SIZE, NULL, 1, NULL); // Thread2 생성
  vTaskStartScheduler();  // 태스크 스케쥴러 시작
  while(1) {}
}

void loop() {}

코드에서는 두개의 쓰레드 (Thread1, Thread2)가 동시에 실행되어 Thread2에서 LED를 켜고 200ms 후에 semaphore를 POST 해주어 Thread1이 semaphore를 받으면 LED를 끄게 되어 있다. Thread1은 LED를 끄고 나면 곧바로 다시 semaphore를 기다리지만 Thread2에서 200ms를 기다린 후 LED를 켜고 다시 200ms 후에 semaphore를 POST 하기 전에는 계속 semaphore를 기다리게 된다. 



그리고 일반 스케치와 다르게 loop() 에서는 아무 동작을 하지 않는다.
1
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

임베디드 보드

번호 제목 글쓴이 날짜 조회수
58 아두이노 [강좌] 50. 와이파이 통신 (4) - WebServer 예제 icon 양재동메이커 03-21 19,615
57 아두이노 [강좌] 49. 와이파이 통신 (3) - WebClient 예제 icon 양재동메이커 03-21 23,272
56 아두이노 [강좌] 48. 와이파이 통신 (2) - 커맨드 모드 사용하기 (WiFly 쉴드) icon 양재동메이커 03-20 18,224
55 아두이노 [강좌] 47. 와이파이 통신 (1) - 와이파이란 무엇인가 icon 양재동메이커 03-20 23,069
54 아두이노 [강좌] 46. 블루투스 통신 (5) - 프로토콜 만들기 (2) icon 양재동메이커 03-20 18,107
53 아두이노 [강좌] 45. 블루투스 통신 (4) - 프로토콜 만들기 (1) icon 양재동메이커 03-20 19,433
52 아두이노 [강좌] 44. 블루투스 통신 (3) - RN42 모듈에서 직접 접속하기 icon 양재동메이커 03-20 16,336
51 아두이노 [강좌] 43. 블루투스 통신 (2) - 스마트폰과 통신하기 icon 양재동메이커 03-20 18,588
50 아두이노 [강좌] 42. 블루투스 통신 (1) - RN42 블루투스 모듈 실습하기 icon 양재동메이커 03-20 20,804
49 아두이노 [강좌] 41. 서보 모터 (2) - Servo 함수 알아보기 icon 양재동메이커 03-20 22,037
48 아두이노 [아두이노 강좌] 40. 서보 모터 (1) - 서보 모터 동작 방식 icon 양재동메이커 03-20 22,641
47 아두이노 [강좌] 39. 스텝 모터 (3) - 모터 드라이버 EasyDriver(A3967) 사용하기 icon 양재동메이커 03-20 18,009
46 아두이노 [강좌] 38. 스텝 모터 (2) - Stepper 함수 알아보기 icon 양재동메이커 03-20 22,155
45 아두이노 [강좌] 37. 스텝 모터 (1) - 스텝 모터 동작 방식 icon 양재동메이커 03-20 19,002
44 아두이노 [강좌] 36. DC 모터 (2) - DC 모터 드라이버 실습하기 (TB6612FNG) icon 양재동메이커 03-20 18,092
43 아두이노 [강좌] 35. DC 모터 (1) - DC 모터 동작 방식 icon 양재동메이커 03-20 20,929
42 아두이노 [강좌] 34. SPI 통신 (3) - 기압 센서(MPL115A1) 실습하기 icon 양재동메이커 03-20 17,333
41 아두이노 [강좌] 33. SPI 통신 (2) – SPI 함수 알아보기 icon 양재동메이커 03-20 25,800
40 아두이노 [강좌] 32. SPI 통신 (1) - SPI 통신이란 무엇인가 icon 양재동메이커 03-20 30,127
39 아두이노 [강좌] 31. I2C 통신 (3) - 온도 센서(TMP102) 실습하기 icon 양재동메이커 03-20 25,082