FreeRTOSで開発する
高効率・高安定マルチタスク・マイコン・システム
プリエンプティブ・マルチタスクで優先順位管理&停滞回避
-
著者・講師:後閑 哲也/Tetsuya Gokan
- 企画: ZEPエンジニアリング株式会社
-
FreeRTOS×PIC32オールインキット付き!マルチタスクIoT開発実習
(LIVE配信:10月20日,録画受講:10月21日~23日)
- 関連製品:[VOD/Pi KIT]ラズベリー・パイで学ぶLinux&Pythonプログラミング超入門
- 関連製品:[VOD/Pi KIT]ラズパイ×Node-REDで作ろう!IoTアプリ開発入門
- 関連製品:[VOD/KIT]STM32マイコン&Wi-Fiモジュールで学ぶ C/C++プログラミング入門
マイコンのマルチタスク処理に欠かせないFreeRTOS
RTOSとは,リアルタイム・オペレーティング・システム(Rear Time Operating System)の略です.タスクの実行をリアルタイムにスケジューリングする機能を持ち,特定の時間内にタスクを完了させることが求められるアプリケーションに利用します.
中でも“FreeRTOS”は,小型で軽量な設計を特徴としており,メモリやリソースの制約があるマイクロコントローラ(MCU)や組み込みデバイスに適しています.STM32,ESP32,Arduinoなど,幅広くマイコンに利用されています.
次の特徴があります.
- リアルタイム性 タスク・スケジューリングが優先度ベースで行われ,リアルタイム応答が要求されるシステムに対応します
- マルチタスク・サポート 複数のタスク(スレッド)を並行して実行できます.
- ポータビリティ さまざまなアーキテクチャやプラットフォームに移植できます.
- シンプル コードが小さく,学習や実装が容易です.
- フリーで商用利用も可能 MITライセンスのもとで提供されており,商用プロジェクトでも無料で利用可能です.
スムーズなタスク処理に欠かせない「プリエンティブ・マルチタスク機能」
円滑なマルチタスク処理を実現するために「プリエンティブ・マルチタスク」という機能が欠かせません.これは,各タスクに一定の実行時間を割り当て,時間が来たら別のタスクに強制的に切り替えるものです.タスクA,B,Cがある場合,時間が経つとAからB,次にCへと順番に切り替えます.
あるタスクが他のタスクの実行を長く待たせることがなくなり,システムがスムーズに動きます.さらに,重要なタスクには優先的に多くの時間を割り当てることができ,リアルタイム性が必要な処理にも対応できる仕組みです.
システムの効率性,応答性,安定性を向上させる重要な技術であり,多くのRTOSが採用しています.
通常のマルチタスク処理と課題
図1に示すのは,通常のRTOSのタスク・スケジューリングとタスクの状態遷移です.
システムが起動すると,各タスクは実行待機状態(レディ)になり,いくつかあるタスクの中から,優先順位の高いタスクから先に処理されます.レベルが同じなら,順番どおりにタスクが処理されます.
もしタスクが「I/O待ち」または「時間待ち」になったら「待ち」状態とし,順番を待っていた次のタスクを実行します.待ち状態となったタスクは「I/O処理終了」や「待ち時間終了」などのイベントがあったときに,再度レディー状態となって実行待ちの順番の中に登録されます.
この「イベント待ち」をタスク切り替えの条件にする方法は,長い実行時間を占有するタスクがあったときに,ほかのタスクの実行が停滞します.優先順位の高いタスクばかりが実行されて,ほかのタスクが処理されなくなります.
プリエンプティブ・マルチタスクで課題解決
FreeRTOSは,この課題を回避できる「プリエンプティブ・マルチタスク」という機能を備えています.
これは,特定のタスクに対して一定の実行時間を割り当て,その時間が経過したら,強制的に別のタスクに実行権を移す機能です.
図2にそのようすを示します.常時,一定間隔でタスク・スイッチングが行われます.
A,B,C,Dの複数のタスクがある場合.Tickというシステム・タイマの割り込みでタスクが強制的に切り替えられて実行されます.
タスクの優先レベルが同じなら,A→B→C→D→A→B→C→D という順で,タスクが切り替わります.
Tickの割り込みで切り替えが起きますから,タスク実行は無条件で途中で中止され,次の順番が来るまで待たされます.
ほかの外部からの割り込みが入って別の高優先のタスクEがアクティブにされると,このタスクが先に実行され,Tick割り込みが入っても高い優先順位のタスクEが先に実行されます.このタスクEが終了すると,また元の順繰りに実行される状態に戻ります.
プリエンプティブ・マルチタスクの5つのメリット
プリエンプティブ・マルチタスクのメリットを次にまとめました.
- システム全体の応答性が高まる 長時間実行されるタスクが,処理停滞の原因にならなくなります.複数のアプリケーションを並行に実行しても,システムの応答性が高い状態に維持されます.
- リソースの利用効率とスループットが向上する CPUの空き時間がすぐに別のタスクに割り当てられるため,CPUの利用効率が向上します.内蔵周辺モジュールの動作中には,ほかのタスクの実行が可能ですから全体のスループットが向上します.
- 高優先度のタスクのリアルタイム性が向上する 優先度の高いタスクに,多くのCPU時間を割り当てることができます.リアルタイム性が必要な処理を優先的に処理できます.
- 外部割り込みとの共存による応答性の確保 緊急性の高い外部からの割り込みを最優先に処理することもできます.
- システムの安定化 特定のタスクがほかのタスクを無限に待たされたり(デッドロック),一部のタスクが実行権を得られなくなる問題を回避できます.