• 公開日:2024年11月19日

0からわかる!リアルタイムOS(RTOS)とは?

 

はじめに

突然ですが、リアルタイムOS(RTOS)を知っていますか?

本稿はとにかく0から理解できるようにRTOSについて体系的な概念、抑えるべき用語を知りたい方に向けて全2稿に分けてRTOSを解説をしていく予定です。

 

第1稿ではRTOSが必要な利用シーン、スケジューリングの方式、動作概要を解説します。

第2稿ではタスクの状態、ハンドラ(ISR)、サービスコールを解説いたします。

 

本稿を通じてRTOSの基礎知識や一般的な用語などを一通りおさらいすることで、Web上に存在するRTOSについて一歩踏み込んだ説明を理解するための一助としていただければ幸いです。

 

組込みシステムにおけるOSとは?

RTOSについて話す前に一般的なOSとの違いを考えます。

まず、そもそもOSとは、プログラムの実行管理をするソフトウェアのことです。本記事でOSと記載があるものは実際に手で触れることができるハードウェアではなく、ソフトウェアのことを指しています。これはRTOSについても例外ではありません。

 

OSと聞くと、WindowsやLinuxなどが思い浮かぶ方は非常に多いと思います。これらは主にPCで利用されるシーンが多いOSです。

では組み込みOSと聞いたときはどうでしょう?実際に製品化されているOSの名前が思い浮かぶ方はあまり多くないと思います。

組込みOSは大きく分けると組み込みLinuxとRTOSの2つに分けられます。ようやくRTOSが出てきましたね。つまり今回の記事で説明するRTOSは組み込みシステムでよく利用されるOSということです。

 

実際の利用シーンですが、組込みLinuxは例えばカーナビやルーターなどIoT機器での利用シーンが多いです。

RTOSは産業用ロボットや自動車エンジンなど時間的制約が厳しい組み込み機器での利用シーンが多いです。

 

では時間的制約が厳しいとはいったいどういう意味でしょうか?

RTOSが求められる利用シーンを考えることでRTOSの存在意義を考えていきます。

 

 RTOSに求められる時間的制約を考える

時間的制約が厳しいとは言い換えると、期限までに必ず仕事を終わらせる必要があるということです。このような制約が求められるシーンは下記のような場面が考えられます。

 

①サーバーとの通信においてデータを取りこぼすことなく送受信する

②電車の非常停止ボタンにおいて可及的速やかにブレーキを作動する

 

例えば②の場合は、 “非常停止ボタンが押される”というトリガーをきっかけとして、“ブレーキを作動し停止する”という仕事をわずかな時間内で確実に終わらせなければなりません。

加えて、電車は非常停止機能だけ備えていても、本来求められる機能を満たしません。加減速の制御や、運転手への速度表示、車内の調光制御など、異なる複数の仕事をこなしたうえで初めてシステムとして満足するのです。

 

このために必要な仕組みを提供しているのがRTOSです。上記のように複数の仕事を適切に切り替えるためのスケジューリングをしているのがRTOSの主な役割になります。そしてこの仕事というのはRTOSにおいて一般的に“タスク”もしくは“スレッド”と呼称されます。この記事では以降“タスク”と統一して記載します。

 

ここで、一般的なタスクのスケジューリングの方式3つを解説します。

 

①FCFS方式

FCFS方式は“First Come First Served”の略です。これは名前の通り早いもの順でタスクを消化するアルゴリズムです。順番でタスクを消化していくことになるため、一度実行されたら必ず完了まで実行されます。しかし1番初めに実行されるタスクの完了が1時間かかる場合、2番目に実行されるタスがたとえ5秒で終わるタスクだとしてもタスク1が完了する1時間後までタスク2は待たされることになります。

 

②ラウンドロビン方式

ラウンドロビン方式は一定時間ごとに処理を切り替える方式です。先程のFCFS方式とは異なり、このアルゴリズムにはいわゆる“やりかけ”の状態があります。図はタスクが3つある場合の概念図です。5秒で完了するタスク2がある場合を考えると、FCFSのように1時間待たされるということはありません。タスク全体の処理速度を意識したアルゴリズムです。しかしこの方式はタスクが増えれば増えるほど1つのタスクが待たされる時間が伸びることになります。

③優先度方式

優先度方式はタスクに“優先度”を付与するアルゴリズムです。優先度方式は、OSが実行するタスクを選ぶ際に常に優先度が高いものを探す方式です。この方式だと常にユーザーが決めた高優先度のタスクが完了されるまで、それより低い優先度のタスクに遮られることなく実行されます。しかし優先度が低いタスクが他の優先度が高いタスクに遮られて、いつまでも実行できない場合があります。図はタスク1がNo.1ということで一番高い優先度を持っていると仮定した場合です。

さて、話をRTOSに戻します。時間的制約を“期限までにタスクを必ず完了させる”と定義した場合、RTOSが採用するアルゴリズムとしてふさわしいものは何番でしょうか?

 

 

 

正解は③の優先度方式です。列車の非常停止ボタンの例を再度考えてみると

①の場合、非常停止ボタンが押されたとしても、先に実行中のタスクが終わるまで待つため、期限内に停止することができるか保証できません。

②の場合、定期的に非常停止するための処理(ブレーキ)が実行されますが、 “停止する”という完了状態になるまで実行し続けるわけではないので、これもやはり期限内の停止を保証できません。

③の場合は、非常停止ボタンの処理を最優先としておくことで、他のすべてのタスクを差し置いて停止するための処理を完了まで実行することができます。

 

実際にはWindowsやLinuxなどの情報系OSは、一般的に②のアルゴリズムを採用しシステム全体の処理速度を優先しています。RTOSでは一般的に①と③のアルゴリズムを組み合わせたアルゴリズムが採用されていることが多いです。

 

長くなりましたがまとめると、この章ではRTOSは “期限内のタスク完了”というミッションを達成するために、複数のタスクを優先度に応じて切り替える仕組みを提供することを説明しました。ここまで少し抽象的な話が続いたので、次の章ではもう少し組み込み視点で具体的にRTOSの動作を説明します。

 

RTOS動作概要を理解する

前章にて説明した、複数のタスクの切り替え時に何が起きているのかを説明します。

ここでは、組み込みプログラムでまず初めに用いられるLEDの点滅制御(いわゆるLチカ)をCase Studyとして、RTOSがどのように関係してくるのか時系列で理解します。

具体的にはボタンが押されたら1秒おきにLEDを点滅させるようなプログラムを考えます。ボタンは2つあり、緑色と青色のLEDがあると仮定します。

 

ボタンを押したらLEDの点滅を開始します。先にボタン1が押されたとします。

すると下記のようにボタン1の割り込みを元にLEDの制御を開始します。

※緑色の期間でCPUがGPIOのHIGH/LOWを制御しているイメージです。

割り込みを起点にタスク1が開始以降、1秒置きにタスク1をが実行されます。

同様にある時点でボタン2が押されてから1秒おきにタスク2が実行します。

青や緑で記載したタスクが実行されていない時間は“Idle タスク”と呼ばれることが多いです。このIdleタスクではCPUが使われていないので、システムが正常に動作しているかどうかなどの診断系のタスクや、データのログを取るようなタスクなどの一般的に優先度があまり高くないようなタスクを、入れ込むことが多いです。これは逆に言い換えると、下の図にてグレーになっているIdleタスクに他のタスクを詰め込んでいき、CPUという資源を無駄なく効率的に使うためにRTOSを使用するとも言い換えることができます。

そしてRTOSは下の図のようにタスクとタスクが切り替わる時に必ず動作しています。今回のCaseの場合は二つのタスクがボタン
押下による割り込みとタイマによる割り込みを使用して動作しますが、割り込みを起点にRTOSが必ず呼び出されていています。

 

RTOSのプログラム中では下記に記載するような処理が行われています。

コンテキストスイッチ

現在動いているタスクが使用しているレジスタの情報や動的な値を、スタックなどに退避する処理のことです。今回の場合だとタスク1やタスク2が終了した後にタスク3が中断した直後の状態から再び実行状態になるために必要です。

優先度の判断

例えば下の図だと優先度の低いタスク3からタスク1に移行しますが、タスク1が実行中にタスク3を起動するイベントが発生してもタスク3はもちろん起動されません。

ディスパッチ

実行中のタスクとは異なるタスクへCPUの実行権を移す処理(ディスパッチ)のことです。このプログラム自体を“ディスパッチャ”と呼ぶことがあります。

 

まとめ

今回の第1稿ではRTOSが必要な利用シーン、スケジューリングの方式、動作概要を解説しました。

次回の第2稿ではタスクの状態、ハンドラ(ISR)、サービスコールを解説いたします。

 

今回解説したRTOSですが昨今のIoT化の波を受けて必要なシーンが増加しています。

ルネサスエレクトロニクス社では、無償で使える組み込みIoT機器向けのRTOSをルネサス製開発環境にインポートして、マイコンに予めポーティングすることで、RTOSを容易に導入することができます。

また、ITRONに準拠したルネサスエレクトロニクスの純正RTOSも提供が可能です。