freeRTOSとは?
freeRTOS(Real-Time Operating System)は、マイクロコントローラー用のオープンソースのリアルタイムオペレーティングシステム(RTOS)です。freeRTOSは、小規模な組み込みシステムやリアルタイムアプリケーション向けに設計されており、複数のタスクを効率的に管理し、リアルタイム性の要求を満たすための機能を提供します。
freeRTOSの特徴:
ざっくりと言うと効率的なリソースでタスク管理による正確なタイミング制御、複数のタスクを同時に実行できるマルチタスクサポートなどが可能になります。他にもセマフォやキューなど豊富な機能が提供されています。
また、名前にfreeと書いてある通りオープンソースで使用できます。
導入方法
Arduinoの導入自体の手順は省きます。
Arduinoを起動してからメニューバーのツール→ライブラリ管理から検索バーにfreeRTOSと検索すると出てきます。
後はインストールを押すと使えるようになります。
(Arduinoのバージョンによって手順等が異なる可能性があります。)
使用例
LCDディスプレイに1秒ごとカウント表示させるプログラム
まずはfreeRTOSを使用しない場合
#include <LiquidCrystal.h>
const int rs=8,en=9,d4=4,d5=5,d6=6,d7=7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //rs,en,d4~d7ピン
int secCount = 0;
unsigned long previousMillis = 0;
unsigned long interval = 1000; //インターバルは秒にしたいので1000
void setup() {
lcd.begin(16,2);
lcd.setCursor(0,1); //文字を表示させる位置(行,列)
lcd.print("CurrentSec");
}
void loop() {
elapsedTime();
lcd.setCursor(11,1);
lcd.print(secCount);
}
//秒数をカウントする関数
void elapsedTime(){
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval){
secCount++;
previousMillis = currentMillis;
}
}
次にfreeRTOSを使用した場合
#include <Arduino_FreeRTOS.h>
#include <LiquidCrystal.h>
const int rs=8,en=9,d4=4,d5=5,d6=6,d7=7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //rs,en,d4~d7ピン
int secCount = 0;
void setup() {
xTaskCreate(taskElapsedTime,"TaskElapsedTime",100,NULL,1,NULL); //秒数をカウントするタスクを生成
lcd.begin(16,2);
lcd.setCursor(0,1);
lcd.print("CurrentSec");
}
void loop() {
//タスクで制御するので使用しない
}
//秒数をカウントする関数
void taskElapsedTime(void *pvParameters){
for(;;){
secCount++;
vTaskDelay(1000/portTICK_PERIOD_MS); //1秒待つ
lcd.setCursor(11,1);
lcd.print(secCount);
}
}
大きな違いとしてはタスクで制御するのでループを使わないことでしょうか。
解説
xTaskCreate()
BaseType_t xTaskCreate(
TaskFunction_t pvTaskCode, // タスクのエントリーポイントとなる関数へのポインタ
const char * const pcName, // タスクの名前(デバッグ目的で使用)
const uint16_t usStackDepth, // タスクのスタックの深さ(バイト単位)
void * const pvParameters, // タスクに渡すパラメータ
UBaseType_t uxPriority, // タスクの優先度
TaskHandle_t * const pxCreatedTask // タスクハンドルの格納先(必要ない場合は NULL)
);
freeRTOSライブラリのタスク作成のための関数です。この関数を使用することによってマルチタスク処理が実行できるようになります。
vTaskDelay()
void vTaskDelay(const TickType_t xTicksToDelay);
freeRTOSライブラリでこちらはタスクを一定時間停止させるために使用する関数です。
上のサンプルではvTaskDelay(1000/portTICK_PERIOD_MS); となっていますが
portTICK_PERIOD_MS はFreeRTOS のポート依存機能で定義される定数で、1 Tick が何ミリ秒かを示します。
一般的な FreeRTOS の設定では、タイムティックは 1 ミリ秒ごとに進むように設定されています。
まとめ
今回紹介した機能はfreeRTOSの一部です。