コンテンツにスキップ

FreeRTOS

FreeRTOSとは

FreeRTOSはマイコン向けのリアルタイムOS(RTOS)である。

簡単に言うと

複数の処理を効率よく同時に実行するための仕組み

である。


例えば以下のような処理があるとする。

・モータ制御
・センサ読み取り
・通信処理
・LED制御

RTOSを使わない場合は

while(1)
{
    モータ制御();
    センサ読み取り();
    通信処理();
    LED制御();
}

のようになる。


処理が増えると

  • コードが複雑になる
  • タイミング管理が難しい
  • 保守性が下がる

という問題が発生する。


FreeRTOSを使うと

モータ制御タスク
センサタスク
通信タスク
LEDタスク

として分離できる。


RTOSとは

RTOSは

Real Time Operating System

の略である。


一般的なOS

  • Windows
  • Linux
  • Android

は人間向けである。


RTOSは

決められた時間内に処理を実行する

ことを重視している。


FreeRTOSの特徴

  • 無料
  • 軽量
  • STM32で広く使われる
  • CubeMX対応
  • 学習資料が多い

特にSTM32との相性が良い。


タスクとは

FreeRTOSにおける基本単位。


タスクA
→ センサ取得

タスクB
→ モータ制御

タスクC
→ UART通信

イメージ

CPU
 ├─ タスクA
 ├─ タスクB
 └─ タスクC

スケジューラ

スケジューラは

どのタスクを実行するか決める機能

である。


タスクA
 ↓
タスクB
 ↓
タスクC
 ↓
タスクA

高速で切り替わるため

同時に動いているように見える

優先度

各タスクには優先度を設定できる。


タスク 優先度
モータ制御
通信
LED点滅

重要な処理を優先できる。


タスク作成

基本形

xTaskCreate(
    TaskFunction,
    "Task",
    256,
    NULL,
    1,
    NULL
);

実際の処理

void TaskFunction(void *argument)
{
    while(1)
    {
        // 処理
    }
}

タスクの遅延

FreeRTOSでは

vTaskDelay()

を使う。


vTaskDelay(100);

これにより

100ms待機

できる。


Tick

FreeRTOSは内部で一定周期のタイマを持つ。


これを

Tick

という。


一般的には

1ms

で設定される。


Queue

タスク間でデータを受け渡す仕組み。


センサタスク
 ↓
Queue
 ↓
制御タスク

データ共有を安全に行える。


Queueの用途

例えば

UART受信
 ↓
Queue
 ↓
解析タスク

のように使う。


Semaphore

セマフォは

共有資源の管理

に使う。


UART

を複数タスクで使う場合。


セマフォを使うことで

同時アクセス防止

ができる。


Mutex

Mutexも共有資源保護に使う。


用途

UART
SPI
I2C

など。


Event Group

複数のイベントを管理する機能。


通信完了
センサ取得完了

をまとめて扱える。


FreeRTOSと割り込み

FreeRTOSは割り込みと組み合わせて使える。


UART受信割り込み
 ↓
Queueへ格納
 ↓
通信タスク処理

非常によく使われる構成。


メモリ管理

FreeRTOSは動的メモリ管理を持つ。


種類

heap_1
heap_2
heap_3
heap_4
heap_5

STM32では

heap_4

がよく利用される。


STM32での利用

CubeMXでは

Middleware
 ↓
FreeRTOS

を有効化するだけで導入できる。


すると

CMSIS-RTOS
FreeRTOS

関連コードが自動生成される。


FreeRTOSが向いているケース

向いている

  • 通信処理
  • UI制御
  • 複数センサ
  • ロボット制御
  • IoT機器

向いていない

  • 単純なLED点滅
  • 小規模な制御

小さいプログラムなら

while(1)

だけの方が簡単である。


Asterでの活用例

Asterで使うなら


モータ制御タスク

PID制御
PWM更新

通信タスク

UART
CAN

センサタスク

I2C取得
ADC取得

UIタスク

操作パネル通信

という分割が考えられる。


FreeRTOS導入の判断

FreeRTOSは便利だが万能ではない。


処理が少ない場合

while(1)

の方が簡単。


処理が増えてきたら

FreeRTOS

を導入すると保守しやすくなる。


よくあるトラブル

スタック不足

タスクごとのスタックサイズ不足。


優先度逆転

低優先度タスクが高優先度タスクを妨害する。


Queue溢れ

受信速度が処理速度を超える。


タスクが暴走

while内にDelayが無い。


FreeRTOSのメリット

  • 処理を分割できる
  • 保守性が高い
  • タイミング管理が簡単
  • 通信処理と相性が良い

FreeRTOSのデメリット

  • 学習コストが高い
  • メモリを消費する
  • デバッグが難しくなる

まとめ

FreeRTOSはマイコン向けのリアルタイムOSである。

  • タスクで処理を分割できる
  • Queueでデータを受け渡せる
  • Semaphoreで共有資源を管理できる
  • STM32との相性が良い
  • 大規模な組み込み開発で活躍する

複数の処理が並行して動くシステムでは、FreeRTOSによってコードの見通しや保守性を大幅に向上させることができる。

Asterでの利用

こんなに書いたがそこまで必要なプロジェクトでもない気がしてきたので取り敢えずは使わないことにする。