Contents
この記事でわかること
- FreeRTOS にはどんな機能があるのか
- 各機能が「何のために存在するのか」
- Queue / Semaphore / EventGroup を理解するための前提知識
- FreeRTOS を学ぶ正しい順番
- 次に読むべき記事の道筋
はじめに
マイコンを使ってIoTで何かを作りたい!そんなことを考えたときに直面するのがRTOSを使用しなければならないことだと思います。私の場合、標準で無線通信(wifiなど)が使えるESP32を使用して何かを作りたいと考えましたが、ESP32に標準で使用できる FreeRTOSってなに?といった状態でした。
この記事では、私と同じように「FreeRTOS ってなに?」、
「そもそも何を解決するための仕組み?」 という視点で整理し、
全体像を一度で把握できるようにします。
FreeRTOSとは何か
FreeRTOS は、
複数の処理(タスク)を、 決められたルールで安全に同時実行するためのリアルタイムOS
です。
ESP32 では FreeRTOS が内部で常に動作しており、
Arduino スケッチも実質的には FreeRTOS 上で実行されています。
重要なのは、FreeRTOS は
「便利な関数集」ではなく、処理を安全に分離・連携させるための仕組み
だという点です。
なぜ FreeRTOS は分かりにくいのか
FreeRTOS が難しく感じられる理由は主に次の3つです。
1. 機能が多い
タスク、Queue、Semaphore、EventGroup、Timer、メモリ管理など、
一度に多くの概念が登場します。
2. 似たような機能が存在する
「待つ」「通知する」「同期する」といった動作が、
複数の機能で実現できてしまいます。
3. 使い分けの前提が説明されない
公式ドキュメントは正確ですが、
どの場面で何を選ぶべきか までは踏み込んでいません。
その結果、
「動くコードは書けるが、設計として正しいか分からない」
という状態になりがちです。
FreeRTOSの機能を「役割」で整理する
FreeRTOS の機能は、役割ごとに整理すると非常に分かりやすくなります。
FreeRTOS 機能マップ(役割別)
| 役割 | 主な機能 | 何を解決するか |
|---|---|---|
| 処理の分離 | Task | 処理を独立させる |
| データ受け渡し | Queue | タスク間で値・イベントを渡す |
| 資源の保護 | Semaphore / Mutex | 同時アクセスを防ぐ |
| 状態の通知 | EventGroup | 複数条件の成立を待つ |
| 連続データ | MessageBuffer / StreamBuffer | バイト列・ストリーム処理 |
| 時間制御 | Software Timer | 定期処理・遅延実行 |
この記事ではそれぞれの機能を大まかに説明し、詳細に関しては別の記事で取り上げようと思います。
各機能の役割をざっくり理解する
Task(タスク)
- FreeRTOS における処理の単位
- 1つの仕事を1つのタスクとして分離する
- ESP32 では複数タスクが同時に動作する
👉 処理を分けるための機能
Queue(キュー)
- タスク間でデータやイベントを受け渡す
- FIFO(先入れ先出し)
- 値はコピーされて保持される
👉 イベントやデータを伝えるための機能
※ Queue は後続の記事で詳しく解説します。
Semaphore / Mutex(セマフォ・ミューテックス)
- 共有リソースへの同時アクセスを防ぐ
- UART、I2C、SPI、SDカードなどを保護する
👉 壊れないように守るための機能
EventGroup(イベントグループ)
- 複数の条件がそろうのを待つ
- 状態管理に向いている
👉 状態を待つための機能
MessageBuffer / StreamBuffer
- 連続したデータ(バイト列)を扱う
- 通信データやストリーム処理向け
👉 流れるデータを扱う機能
Software Timer
- 一定時間後・一定周期で処理を実行
- タスクを増やさずに時間制御が可能
👉 時間を基準に動かすための補助機能
IoT設計での典型的な構成例
IoT システムでは、次のような構成が一般的です。
センサー読み取り(Task)
↓ Queue
データ処理(Task)
↓
通信 / ログ保存(Task)
- センサー値の通知 → Queue
- I2Cアクセス → Semaphore
- 通信完了待ち → EventGroup
- 定期処理→Timer
FreeRTOS の機能は、
単体ではなく組み合わせて使うことが前提です。
グローバル変数ではなぜ足りないのか
グローバル変数は、
- 最新の状態しか持てない
- 更新の履歴が消える
- 排他制御が必要
- バグが再現しにくい
といった問題を抱えています。
FreeRTOS の機能は、
これらの問題を最初から防ぐために用意された仕組みです。
初心者がまず理解すべき優先順位
最初からすべてを理解する必要はありません。
おすすめの学習順は次の通りです。
- Task
- Queue
- Semaphore
- EventGroup
- MessageBuffer / StreamBuffer
- Software Timer
この順で学ぶと、混乱せず理解が進みます。記事もこの順で出していこうと思っています。
時間があるときに頑張りますので、気長に待っていただけますと助かります。
次に読むべき記事
この記事は FreeRTOSの全体像をつかむための入口 です。
次は、基本的な機能である Task について詳しく解説していきます。
- FreeRTOS Taskとは何か(設計視点で理解する)
- 使用するメリット
- ESP32で動く実装例
- 設計視点での使いどころ
👉 次の記事:FreeRTOS Taskとは何か?処理の分離を設計視点で理解する
まとめ
- FreeRTOS は機能が多いが、役割で整理すれば理解しやすい
- Task は処理の単位
- Queue はイベント共有
- Semaphore は資源保護
- EventGroup は状態管理
- IoT設計ではこれらを組み合わせて使う
まずは 全体像を押さえること が最重要です。

コメント