Arduino에서 FreeRTOS 사용하기 (1) 가장 간단한 프로그램

3598 단어 FreeRTOSArduinoRTOS
마리오 카트 해킹이 유행하고 있었고, 오랜만에 STM32를 기억했습니다.
STM32에서 대규모 프로그램을 작성하는 데 필요한 FreeRTOS를 먼저 Arduino에서 공부해 보겠습니다.

FreeRTOS란?



오픈 소스 임베디드 실시간 OS.
매우 경량(6K~12KB)인 것과, 복수의 마이크로컴퓨터(Arm, AVR(Arduino), PIC등)에 대응하고 있는 것이 특징적.
2017년에 Amazon에 인수되고 있기 때문에 AWS와의 밀접한 연계가 가능해진다.

FreeRTOS의 공식 문서( htps : // / cs. 아 ws. 아마존. 이 m / 그럼 _ jp / f ree r과 s / st / use r gue / u-t s-f ree r과 s. HTML) )에는, 아키텍쳐로서 이하의 그림이 게재되고 있다.MQTT나 BLE등의 통신 라이브러리나 AWS관련의 기능이 있는 것이 마음춤.
(※다만 이것은 FreeRTOS의 전체도이며, Arduino에서 사용할 수 있는 것은 아마 FreeRTOS Kernel의 부분만(?)이라고 생각된다.요조사.)


Arduino에 FreeRTOS를 설치하고 재생



설치하는 방법



이 기사( htps : // 코 m/인후에서 1오 p/있어 ms/아 c04아70c1에 d71cb83℃) 를 참고로, 라이브러리 매니저로부터 FreeRTOS를 인스톨.간단. FreeRTOS 라이브러리의 인스톨이 완료하면, Arduino의 파일>스케치 예로부터 FreeRTOS의 샘플 프로그램을 선택할 수 있게 된다.

멀티태스킹 시도



약 1초마다 두 개의 작업을 실행하는 프로그램



시리얼 출력으로 「A」라고 표시하는 <태스크 A>와 「B」라고 표시하는 <태스크 B>만의 프로그램을 만들었다.

FreeRTOS_task.ino
#include <Arduino_FreeRTOS.h>

void TaskA( void *pvParameters );
void TaskB( void *pvParameters );

// the setup function runs once when you press reset or power the board
void setup() {

  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);

  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB, on LEONARDO, MICRO, YUN, and other 32u4 based boards.
  }

  // Now set up two tasks to run independently.
  xTaskCreate(
    TaskA
    ,  "TaskA"   // A name just for humans
    ,  128  // This stack size can be checked & adjusted by reading the Stack Highwater
    ,  NULL
    ,  2  // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.
    ,  NULL );

  xTaskCreate(
    TaskB
    ,  "TaskB"
    ,  128  // Stack size
    ,  NULL
    ,  1  // Priority
    ,  NULL );

}

void loop()
{
  // Empty. Things are done in Tasks.
}

void TaskA(void *pvParameters)  // This is a task.
{
  (void) pvParameters;

  for (;;) // A Task shall never return or exit.
  {
    Serial.print('A');
    vTaskDelay( 1000 / portTICK_PERIOD_MS ); // wait for one second
  }
}

void TaskB(void *pvParameters)  // This is a task.
{
  (void) pvParameters;

  for (;;)
  {
    Serial.println('B');
    vTaskDelay( 1000 / portTICK_PERIOD_MS ); // wait for one second
  }
}

샘플 프로그램의 "Blink_AnalogRead.ino"를 수정하여 만들었다.
setup() 안에서 xTaskCreate 함수를 호출해 태스크를 생성해, loop()에는 아무것도 쓰지 않고 각 태스크에 처리를 쓰는 것이 기본 구성.
우선 순위가 높은 작업은 vTaskDelay()를 사용하여 대기 상태를 의도적으로 만들 필요가 있습니다.

위의 프로그램을 시리얼 모니터로 봅니다.

대체로 1초마다 A와 B가 출력되고 있다. A 쪽이 우선도가 높기 때문에, 제대로 A가 먼저 실행되고 있다.

위의 프로그램에서는 태스크 A가 실행하고 1초 대기 → 그 사이에 태스크 B가 실행된다 → 태스크 A가 실행된다는 구성 때문에 태스크 A의 처리 시간만큼 1초 간격이 어긋나 버려 있다. 50ms~100ms정도 어느 정도 있기 때문에 임베디드 세계에서는 치명적일 수 있다. 다음은 "가능한 한 정확하게"1초 주기로 실행하는 태스크를 실행하는 방법에 대해 쓰고 싶다.

좋은 웹페이지 즐겨찾기