RTOS、タスク、割り込みについて

2021/04/11

組み込み

はじめに 

前回はメモリ関連の周辺機器について勉強しました。MPUについての勉強~メモリ関連の周辺機器~

今回はRTOS、タスク、割り込みについて勉強します。


RTOS(Real Time Operating System)とは

RTOSとは名前の通り、リアルタイム性を満たすことを重要視したOSのことです。
ちなみにここでいうリアルタイムとは制限時間を守れるかという意味です。
RTOSの特徴として以下のようなものがあります[1]
・特定の外部イベントが発生した際に、対応するリアルタイム性が求められる処理をできるだけ高速に呼び出せる様に制御する。
・リアルタイム性が求められる処理が他の処理に邪魔されない様にする。
・最悪、応答時間が見積れる様に、各タスクへのCPUの実行権の割当予測が出来る様にする。

上記を満たすためにRTOSの場合は時間の制約が厳しいものを優先的に処理できるように、各タスクに優先度を設定して処理を行います。(優先度方式)


逆に通常のパソコンに入っている汎用OSは次のような特徴があります[1]
・できるだけ全体の処理速度(スループット)を向上させる。
・特定の処理が長時間できなくならない様に、各プロセスにできるだけ公平にCPUの実行権を割り当てる。
(プロセスとは、汎用OSにおける並列に行う処理の単位です。ここではリアルタイムOSのタスクと同じ意味だと考えて頂いて問題ありません。)

上記を満たすために私たちが使っているパソコンは一定時間ごとに処理を切り替えるラウンドロビン方式を使っている場合が多いです。このようにすることでどのプロセスも公平に実行することができます。

図1にRTOSと汎用OSの動作の違いを示します。

図1:RTOSと汎用OSの動作の違い[2]

図1を見て頂けると分かりますが、RTOSの場合は先に実行しているタスクがあっても優先度が高いタスクの処理の要求が入ったらタスクの切り替えが行ってます。
(図1ではタスクC>タスクB>タスクAの順で優先度が高くなってます。)

汎用OSの場合は別のタスクから要求があっても自分の持ち時間が来るまで、処理を開始することができません。また、自分の持ち時間が終わってしまったら強制的に別のタスクが実行されるようになります。

図1で処理要求があるとタスクを実行している絵を示しましたが、処理要求の中に割り込みと呼ばれるものがあります。例えば「ボタンが押された」や「センサーの値が変わった」などがトリガーとなって割り込み処理が開始されます。

タスク

タスクとはRTOSが管理するプログラムの最小単位のことを言います。
RTOSはシステムコール(サービスコール、スーパーバイザーコール)を使ってタスクの生成をします。(システムコールはOSが提供する機能を呼び出す関数みたいなものです。タスク生成以外のシステムコールもあるので、詳しく知りたい方はこちらを参照お願いします。[3])

タスクコントロールブロック(TCB)

RTOSがタスク管理するにあたり、タスクの優先度など様々な情報が必要になります。
この情報の集合をタスクコントロールブロック(TCB)といい、タスクが生成される際にTCBにメモリが割り当てられます。

TCBの例を表1に示します。

表1 TCBの例
タスクIDタスクの識別番号
プライオリティタスク優先度(数値が低いほど優先度が高いのが一般的)
エントリポイントタスクのエントリとなる関数のアドレス
ステータス現在のタスクの状態を示す
タスクキュータスクを管理するキュー(詳しくは後述)
スタックポインタタスクが固有に使用するスタックメモリのアドレス

タスクの状態遷移図

タスクには大きく分けて5つの状態が存在します。
(もっと細かく状態遷移が分類されている場合もあります)
  1. 未生成状態:タスクが作られていない状態
  2. ドーマント状態(休止状態):タスクが生成された直後、もしくは終了した時の状態
  3. レディ状態(実行可能状態):タスクの実行権が割り当てられるまで待機している状態
  4. ランニング状態(実行状態):タスクが実行している状態
  5. ウェイト状態(待ち状態):条件が揃うまで待機している状態(C言語でいうとscanf関数で入力されるまで待機している時)
上記状態は図2のような状態遷移図を取ります。

図2:タスクの状態遷移例

ここで注目すべきはある状態からある状態へ直接遷移することができない場合があります。
例えばウェイト状態からランニング状態には直接遷移することが出来ません。
ウェイト状態からランニング状態に遷移するためには必ずレディ状態を通らなければいけません。

また、レディ状態⇔ランニング状態に遷移には特別な名前がついています。(他の状態遷移にも名前があるかもしれませんが見つかりませんでした。。。)

図2にも記載しましたが、ランニング状態からレディ状態に遷移する場合をプリエンプト(直訳すると~の代わりをするという意味みたいです。)、レディからランニング状態に遷移する場合はディスパッチ(直訳すると派遣する・送るなど)といいます。

タスクキュー

さきほどTCBに持っている情報の中にタスクキューがあると書きました
(キューについてわからない人はこちらの参照してください。スタックとキューの意味と例、覚え方)

TCBはタスクをキューで管理してます(双方向キューと片方向キューで管理してるみたいです)。代表的なものとしてレディ状態とウェイト状態を管理するレディキューウェイトキューがあります。また、キューに入れる順も優先度順FIFO(先に入ったものが先に処理される)式の2パターンがあります。優先度順のキューの例を図3に示します。
図3:READYキューの例(優先度順)[5]

RTOSの場合はタスクに優先度方式なので(恐らく)優先度順でキューを管理していると思います。

割り込みについて(2021/04/25 追記)

割り込みの種類

割り込みにはハードウェア割り込みソフトウェア割り込みに分けることが出来ます。
ハードウェア割り込みは例えばスイッチが押された場合などのことで、ソフトウェア割り込みはゼロ除算してしまった場合の例外処理やタスクの箇所で少し紹介したシステムコールが該当します。

図4:割り込みの種類[6]

東芝さんのホームぺージにはハードウェア割り込みの中に外部割込みと内部割込みの2種類があると紹介されてます。[6]

マイコンに内蔵している周辺回路による割り込み要求を内部割込みと呼び、マイコンの専用端子(マイコンから見たら外側)からの割り込み要求のことを外部割込みと呼ぶみたいです。

ちなみに東芝さんのホームページではハードウェア割り込みの中に内部割込みがあるとなってますが、wikipedia はじめ他のサイトでは内部要求 = ソフトウェア割り込みとしているところが多かったです。[7][8]

また、割り込みが発生した際は現在実行しているプログラムを停止する必要があるので、プログラムカウンタの値を割り込みベクタと呼ばれるアドレスに変更します。

割り込み処理が終わったらどこで割り込まれたかを覚えておく必要があり、割り込まれた時のプログラムカウンタのことを退避プログラムカウンタ(EPC)セーブドプログラムカウンタ(SPC)と呼びます。

割り込みハンドリング

割り込みが発生した際にどのような動作をしているのか、一般的な割り込みハンドリングを例に紹介します。

図5:一般的な割り込みハンドリング

割り込みが発生した際に何の割り込みが発生したかMPUはわかりません。(アーキテクチャによっては割り込み発生と同時に何の割り込みが起きたか知らせる仕組みを持っている場合があるそうです)

何の割り込みが発生したかがわからないアーキテクチャの場合、割り込みが発生した後ペンディング状態となりMPUが割り込みの要因を認知(アクノレッジ)するまで待機します。

MPUにアクノレッジされるとアクティブ状態に遷移し、割り込みが要求している処理をソフトウェアが実施します。要求された処理が終わると割り込みのクリアを実施し、最後に割り込みの終了(EOI:End Of Interrupt)を実行して一連の処理が終了します。

割り込みとタスクの違い

割り込みは非タスクと呼ばれるものの一種です。名前の通りタスクとは別のものとなっており、最高優先度を持つタスクが実行されていたとしても、割り込みが優先されて実行されます。

また、タスクと異なりタスク状態と呼ばれるものがありません。タスクの場合は実行が終わったらウェイト状態やドーマント状態に遷移しましたが、割り込みにはそのような状態が存在せず、呼ばれたらすぐ実行されます。ただし割り込みが発生した後は図5に示したようにアクノレッジされるまでは実行されません。

他にも割り込み中には呼べないサービスコールが存在したり(dly_taskなどの自らを待ち状態にするサービスコールなど)、割り込みでは高負荷の処理を実施してはいけない(割り込みは主役ではなく、あくまで脇役なので)などの注意点があります。

まとめ

今回はRTOSの概要について調べました。
汎用PCと異なり、RTOSはタスクに優先度をつけて実行しています。
また、タスクには状態遷移状態があり、キューにて管理が行われています。

参考文献









その他参考にしたサイト




自己紹介

はじめまして 社会人になってからバイクやプログラミングなどを始めました。 プログラミングや整備の記事を書いていますが、独学なので間違った情報が多いかもしれません。 間違っている情報や改善点がありましたらコメントしていただけると幸いです。

X(旧Twitter)

フォローお願いします!

QooQ