オリジナルOS「MicrOS」の設計と実装(4) ―― リアルタイム性の確保
3.多重割り込み処理
多重割り込み処理を行うかどうかは,リアルタイム・システムを作る上で大きな問題となります.
リアルタイムの説明で外部割り込みの処理フローを示しました.それをここで,コメント付きで再掲します(リスト3).
外部割り込み発生
(A)までの処理に必要なレジスタをスタックにセーブ(LRレジスタを含めて3~4)
if( OldPSWをチェック,割り込み処理中?){
そのほかのレジスタをスタックにセーブ
} else {
システム・コントロール・ブロックのカレントTCBを取得
if( 実行中タスクはあるか?){
SPレジスタをセーブ
TCBに残りのレジスタをセーブ
}
}
↑この部分を取り除くと多重割り込みを行わなくなる
(A)外部割り込みのPSW(OldPSW)とPC(OldPC)をバリアブル・レジスタにセーブ
割り込みコントローラから割り込みベクタ番号を取得し,個別の割り込み処理をレジスタにロード
ei(多重割り込み処理のため)
個別の割り込み処理をコール
EOI処理
di(割り込みを再度禁止)
if( OldPSWは割り込み処理中?){
OldPSW,OldPCを外部割り込みに戻す
スタックからレジスタをリストア
reti
} else if( 実行中タスクあり?){
if( タスク・スイッチあり?)){
OldPSW,OldPCをTCBのPSWとPCにセット
Aまでの処理でスタックにセーブしたレジスタをTCBの所定の位置へ
TCBをレディ・プールへ登録
} else {
OldPSW,OldPCを外部割り込みに戻す
TCBからレジスタをリストア
Aまでの処理でスタックにセーブしたレジスタをスタックから戻す
reti
}
}
ディスパッチャへジャンプする
このフローの中でOldPSWを判定する部分と,ei,diを取り除けば多重割り込みを行わないことになります.また,多重割り込みを行わないことによって,レジスタのセーブ方法を工夫して処理ステップを多少省略できるかもしれません.しかしそれによる省略は微々たるものです.そうすると,実際に実行されるステップ数の増減は7~8ステップということになります.
● 割り込み処理方法の比較
外部割り込みにおける個別割り込み処理には3種類あります.一つは,その個別の割り込み処理の中で本質的な処理を行ってしまう場合(割り込み処理方式)です.二つ目は,割り込み処理の中では単にタスクのウェイトを解くだけにして,本質的な処理はタスク側で行う方法(タスク方式)です.最後に,一部だけを割り込み処理で行い,残りをタスクで処理させる方式(混合方式)があります.この三つの方式を比較してみましょう.
● 混合方式の場合
まず,混合方式です.このような方式を取るのはある一定の時間周辺機器が特定のモードにあり,そのモードにある間,1件1件のデータの処理が割り込み処理の中では処理しきれない処理量があって,その応答をこの1件1件に対してではなく,モードに対して行えばいいような場合に限って適用する割り込み処理方式です.このモードの次の段階で処理されなければならない時間的制限に間に合えばよい割り込み処理では,周辺装置から受け取ったデータをリストにして割り込みタスクに引き継ぐことになります.このように頻繁な状態が常に発生して,一つ一つの割り込みに対する処理が割り込み処理の中で処理しきれないような状態であれば,この周辺機器を制御するのは不可能です.この処理方法は,割り込み処理の最後の段階に行う処理の性格によってタスク方式に還元できます.
このような割り込みが発生する可能性のあるシステムでは,処理能力の限界を回復するまでは多重割り込み処理によって,この割り込みより高いプライオリティの割り込みを受け付けることはできても,プライオリティの低い割り込みは処理できません.そのため,処理能力の限界を回復する時間によっては,発生した割り込みのすべてを処理できなくなる可能性があることを認識しておかねばなりません.また,その間タスクの処理は待たされます.
通常の組み込みシステムでは,処理能力の限界を超えるような事態は発生しないように設計されるはずです(もし処理能力の限界を超えた場合,ソフトウェアの処理に問題がなければ,ハードウェアの動作速度を疑うべきである.意外なところに問題のある可能性がある.例えばメモリへのアクセス速度が意図した通りに設定されていないなど).図3の例でいえば,ほかの割り込みとの関係で一時的に処理能力の限界を超えたとしても,次の割り込み発生時にはそれを受けて処理し,処理能力の限界を回復できる能力辺りが限界でしょう.