【ES】リアルタイムOSの機能

割り込みハンドラ処理

そもそも割り込みハンドラとはなにか.

割り込みハンドラとは,実行されている処理をCPUが一時的に中断して優先される別の処理を行うという、割り込みと呼ばれる動作を、制御するためのプログラムのことである。

外部装置からのデータ転送要求などのように優先順位の一層高い処理要求が発生すると、割り込み信号(IRQ)が発生し、実行している最中のプログラムがCPUから一時退避した状態で、メモリー内に待機していた割り込みハンドラが呼び出される。割り込みの処理が終了すると、中断したプログラムの処理が中断されたところから再開される。あるいは、割り込みを要求した処理が実行中の処理よりも優先度が低い場合は、実行中の処理が終了するまで割り込みを待機させることとなる。

割り込みハンドラとは 「割り込みサービスルーチン」 (interrupt handler): - IT用語辞典バイナリ

丁寧な説明は,下記サイトに詳しく載っている.
組み込み制御は、リアルタイムOSにおける割り込み処理で! - EIPC

ソフトウェアの処理の中には、不可分操作と呼ばれる1つのタスクとして纏めてやってしまわないといけない作業があります。この不可分操作の実現の為に、「割り込みの禁止」機能を使用する場合があります。
例えば、自動販売機で「お金を入れる」「ボタンを押す」「商品を受け取る」「お釣りを受け取る」という作業は、不可分操作として考える事が出来ます。Aさんがお金を入れた後、割り込みでBさんが自動販売機を使ったら、Aさんのお金がBさんの所に行ってしまいます。 Aさんが「お金を入れる」作業を行ってから「お釣りを受け取る」作業を行うまでの間、割り込みを禁止するべきです。

上記の不可分操作などの割込み禁止状態での処理をできるだけ減らして,
リアルタイム性を向上することが組込みでは重要だと感じた.

コンテキスト

リアルタイムOSにおけるコンテキストとはなにか
コンテキストとは,各処理特有のレジスタの内容,プログラムのモードや状態など処理の実行に必要な環境情報(プログラムカウンタ,ステータスレジスタ)のこと.

プログラムのモードとは,特権モードと非特権モードのこと.
特権モードではプロセッサシステム全体の動作に影響を与える下記命令操作が許される.

  • 周辺装置との入出力操作
  • 仮想記憶機構の操作
  • 割り込み受付操作

カーネルや割り込み処理がこのモードで実行される

非特権モードでは,前述の命令操作が許されず,処理上必要な場合はカーネルに対してサービス要求を発行し処理を依頼する.
アプリケーションタスクがこのモードで実行される.

タスク切り替えの際に行われる実行環境の保存や切り替えのことをコンテキストスイッチと呼ぶ.

スレッドとプロセス

プロセスとは,一つのプログラムの実行環境のこと.
スレッドとは,プロセスの中で並列動作する実行単位のこと.一つのプロセスで一つまたは複数のスレッドが実行される.

アドレス空間(メモリ空間)はプロセスごとに割り当てられ,プロセス内のスレッドはこのアドレス空間を共有する.
一方,CPU資源(PSW(プログラムカウンタ,ステータスレジスタ)とレジスタ)はスレッドごとに割り当てられる.

プリエンプション

プロセス制御におけるプリエンプション(preemption)とは,実行中のプロセスからCPUを奪って別のプロセスにCPUを割り当てること.

同期手段

イベントフラグ

カーネルが提供するタスクの同期手段.最も基本的なタスク同期手段である.
カーネルで,イベントフラグと呼ばれる1語長のビット列を用意し,このビット列に対して,

が提供されている.

タスクAがタスクBのある処理の終了を待ち合わせる場合,
タスクAはイベントフラグの該当位置がオンになったら通知されるようにカーネルに対して依頼して待機.
タスクBはイベントフラグの該当ビットをクリアし,終了した時点でオンする.

セマフォ

セマフォは排他的な制御が必要な資源の管理に用いられる同期制御方式である.
複数のタスクが同じ資源を利用するときには,資源の獲得と解放を排他的に制御する仕組みが必要であり,セマフォはこの目的に用いられる.
排他制御とイベントの通知の両方を行える.

セマフォによる資源の排他制御の結果,優先度の低いタスクが優先度の高いタスクよりも早く実行されてしまう現象を優先度の逆転(Priority Inversion)という.

メールボックス

プロセス間でのメール(メッセージ)を交換することで同期をとれる.
メールボックスでは宛先タスクを指定すると同時に,メッセージにデータも含めて転送することが可能である.
受信したメールをキューに登録することで複数のタスクから複数のメールを受信することができ,受信側ではメールボックスを受信した順に処理する仕組みもある.
ただしメールボックスはイベントフラグよりもカーネルに負荷をかけることに注意する必要がある.

メールボックスが空の状態でメール受信のシステムコール(recv_mbxなど)を実行すると,タスクは「待ち状態」となる.
メールボックスにメールが受信されると,タスクの待ち状態は解除されて「実行可能状態」となり,実行が再開される.
なお,メールボックスの状態をチェックするシステムコール(poll_mbxなど)では待ち状態は発生しない.

タスクとはなにか

汎用OSでは,プロセスやスレッドの概念がある.
RTOSにおけるタスクがこのどちらに相当するかについて,明確な定義はない.