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

2021/04/11

組み込み

はじめに

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

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

RTOS(Real Time Operating System)とは

RTOSとは名前の通り、リアルタイム性を満たすことを重要視したOSのことです。
ここでいうリアルタイムとは、単に処理が速いということではなく、デッドライン(制限時間)を必ず守れるかという意味です。

RTOSの特徴として以下のようなものがあります[1]。

・特定の外部イベントが発生した際に、対応するリアルタイム性が求められる処理をできるだけ高速に呼び出せる様に制御する。
・リアルタイム性が求められる処理が他の処理に邪魔されない様にする。
・最悪、応答時間が見積れる様に、各タスクへのCPUの実行権の割当予測が出来る様にする。

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

逆に、通常のパソコンに入っている汎用OS(WindowsやmacOSなど)には次のような特徴があります[1]。

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

私たちが普段使っているWindowsなどの汎用OSでは、全体の効率を上げるために、一定時間ごとに処理を切り替えるラウンドロビン方式を使っている場合が多いです。これにより、どのプロセスも公平に実行されます。

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

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

RTOSの場合、先に実行しているタスクがあっても、より優先度が高いタスクの処理要求が入れば即座にタスクの切り替えが行われます。
(図1ではタスクC > タスクB > タスクAの順で優先度が高くなっています。)

汎用OSの場合は、別のタスクから要求があっても、自分の割り当て時間が終わるまで処理を継続します。時間が終われば強制的に別のタスクへ実行が移ります。

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

タスク

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

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

RTOSがタスクを管理するためには、優先度や現在の状態などの様々な情報が必要になります。これらの情報の集合をタスクコントロールブロック(TCB)と呼び、タスク生成時にメモリが割り当てられます。

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

表1 TCBの構成例

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

タスクの状態遷移

タスクには大きく分けて5つの状態が存在します。 (もっと細かく状態遷移が分類されている場合もあります)

  1. 未生成状態:タスクが作られていない状態
  2. ドーマント状態(休止状態):タスクが生成された直後、もしくは終了した時の状態
  3. レディ状態(実行可能状態):タスクの実行権が割り当てられるまで待機している状態
  4. ランニング状態(実行状態):タスクが実行している状態
  5. ウェイト状態(待ち状態):条件が揃うまで待機している状態(C言語でいうとscanf関数で入力されるまで待機している時)

これらの状態は図2のように遷移します。ここで注目すべきは、直接遷移することが出来ない状態遷移があることです。例えばウェイト状態から直接ランニング状態には戻れず、必ず一度レディ状態を経由する点です。

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

コンテキストスイッチとプリエンプト

タスクが切り替わる際、中断するタスクの情報をTCBに保存し、次のタスクの情報を復元する動作をコンテキストスイッチと呼びます。

また、実行中のタスクを中断して高優先度のタスクに切り替える動作をプリエンプト、OSによってタスクが実行状態に移されることをディスパッチといいます。

スタックメモリの重要性

TCBにあるスタックポインタが指し示す「スタック領域」は、タスクごとに独立して確保されます。組み込みシステムではメモリが限られているため、開発者がタスクごとに適切なサイズを見積もる必要があります。これが不足すると「スタックオーバーフロー」を起こし、システム暴走の原因となります。

割り込みについて

割り込みの種類

割り込みは、大きく分けてハードウェア割り込みソフトウェア割り込みの2種類があります。

  • ハードウェア割り込み:スイッチ押下などの外部要因や、タイマー満了などの内部要因。
  • ソフトウェア割り込み:ゼロ除算などのエラー(例外)や、意図的なシステムコールの呼び出し。
図4:割り込みの種類[6]

東芝さんのサイト[6]では、マイコン周辺回路によるものを「内部割り込み」、専用端子からのものを「外部割り込み」と分類していますが、資料によっては分類の呼び方が異なる場合もあるため注意が必要です。[7][8]

割り込みが発生すると、プログラムは現在の処理を中断し、割り込みベクタに登録されたアドレスへ処理を移します。この際、元の場所に戻れるよう現在の場所を退避させます。

割り込みハンドリング

割り込み発生から終了までの一連の流れを図5に示します。

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

割り込みが発生すると、まず要因が認知(アクノレッジ)されるまで待機(ペンディング)します。その後アクティブ状態となり、要求された処理を実行します。最後に割り込みの終了(EOI: End Of Interrupt)を通知して完了します。

割り込みとタスクの違い

割り込みは「非タスク」と呼ばれ、どんな高優先度のタスクよりも優先されます。しかし、割り込みはあくまでメイン処理を中断させる「脇役」です。割り込み処理の中で重い計算を行ったり、タスクを待ち状態にするサービスコールを呼んだりすることは避けるのが鉄則です。

まとめ

今回はRTOSの基礎を学びました。汎用PCとは異なり、RTOSはタスクの優先度とデッドラインを厳格に管理することで、高い信頼性と応答性を実現しています。

参考文献

[1] 組込システムにおける、リアルタイムOSのスケジューラー
[2] 時間、順序を律義に守る――リアルタイムOSとは
[3] リアルタイムOSのシステムコール
[4] スタックとキューの意味と例、覚え方
[5] カーネルの構造
[6] 割り込みの種類
[7] 外部割込みとは
[8] 割り込み(コンピュータ)

自己紹介

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

X(旧Twitter)

フォローお願いします!

ラベル

QooQ