Arduino에서 FreeRTOS 사용하기 (1) 가장 간단한 프로그램
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초 주기로 실행하는 태스크를 실행하는 방법에 대해 쓰고 싶다.
Reference
이 문제에 관하여(Arduino에서 FreeRTOS 사용하기 (1) 가장 간단한 프로그램), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ikenohotori/items/8c6285812bc4177c2564
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
설치하는 방법
이 기사( 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초 주기로 실행하는 태스크를 실행하는 방법에 대해 쓰고 싶다.
Reference
이 문제에 관하여(Arduino에서 FreeRTOS 사용하기 (1) 가장 간단한 프로그램), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ikenohotori/items/8c6285812bc4177c2564텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)