オリジナルOS「MicrOS」の設計と実装(1) ―― MicrOSの概要とソースの概観
1-4.タスクの動作
● 割り込み時の動作
システム動作中に発生する可能性のある割り込みには次のものがあります.
- 正常な割り込み──外部割り込み
└内部割り込み - 異常割り込み
異常割り込みは,プログラムのミスや電源・メモリの異常などが原因で発生します.異常割り込みは適切に処理しなければなりません.しかしその処理方法はアプリケーション・システムによって異なるので,MicrOSでは処理しません.
外部割り込みは,周辺機器の状態の変化でRun状態のタスクの有無にかかわらず発生します.内部割り込みはRun状態のタスクがTRAP命令を発行したときに発生します.
外部割り込みの処理において入り口と出口の共通部分はMicrOSで処理しますが,周辺装置固有の処理はアプリケーション側で用意して,呼び出される構造(関数名はMicrOS側で決めている)になっています(図3).周辺装置固有の割り込み処理で特定のタスクを起動する必要があるときに__activex関数を使います.この関数の中でタスクを切り替える必要があるときは,システム・コントロール・ブロックの中に保存します.周辺装置固有の処理から戻り,割り込みがあったときにRun状態のタスクがなければ,ディスパッチャへ制御を移します.実行中のタスクがあればタスク・スイッチの必要性をチェックして,必要でなければRUN状態だったタスクに制御を戻します.タスク・スイッチが必要なときは,割り込まれたときの状態をTCBにセーブしてReadyに戻されます.
図3 割り込み部の動作
● CA850の割り込み処理をそのまま利用している
前述の説明で,割り込みの出入り口処理をMicrOSが直接行っていると書きましたが,V850-MicrOSの外部割り込み処理の方法は多少異なっています.これはV850-MicrOSがV850用CコンパイラCA850の外部割り込み処理をそのまま利用しているためです.タスク起動の必要があるときは_activex関数を使う部分まではMicrOS仕様ですが,割り込み処理から戻る直前に__godspio関数をコールします.この関数の中でタスク・スイッチに必要性がチェックされ,不要であればそのまま__godspioをコールした位置に戻ります.この後,CA850の割り込みの出口処理によって割り込まれたタスクに戻ります.タスク・スイッチを行う必要があるときはタスクをReadyに戻しますが,次回に処理を再開するのは__godspioの戻り番地です.TCBにセーブされるCPUはそこに合わせた内容になっています.
● 内部割り込みの使用とレジスタの「非」保存
システム・コールはタスクの状態を変化させるという点から,「ウェイト系」,「アクティブ系」,「どちらでもない」の3種類に分類できます.「どちらでもない」システム・コールは,処理後はアプリケーション・タスクに戻ります.
ウェイト系のシステム・コールは,コールしたタスクがWait状態になる可能性のあるものです.アプリケーションの要求に応えられない状態のとき,条件が整うまでコールしたタスクを__wait関数を使ってウェイトさせます.典型的なウェイトの処理は,SCB(後述)にリンクしてから__wait関数をコールする,メモリ・アロケーションやメモリ・ブロックのアサインなどのシステム・コールです.
アクティブ系のシステム・コールは,ウェイト系のシステム・コールに対応しています.ウェイト系のシステム・コールによってウェイトしているタスクがあり,それを解除する条件が発生した場合,__active関数を使ってそのタスクをReady状態とします.Ready状態となったタスクが__active関数を使用したタスクより高い優先順位を持つとき,タスク・スイッチを行います.