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での利用¶
こんなに書いたがそこまで必要なプロジェクトでもない気がしてきたので取り敢えずは使わないことにする。