オリジナルOS「MicrOS」の設計と実装(3) ―― MicrOSのシステム・コール
5.割り込み関連の関数
● 割り込み禁止
int __DIC(void)
割り込み禁止のモードに設定します.旧PSW値を返り値とします.
● 割り込み解除
void __EIC(int psw)
パラメータで指定されたpswの値を判断して割り込み禁止状態を継続するかどうかを処理します.pswが割り込み解除の状態ならば割り込みを解除します.
● トラップ割り込み発生
void __trap00(void)
void __trap00a(void)
トラップ割り込みを発生させる関数です.__trap00はトラップ命令とリターン命令で構成されます.__trap00aは現在のPSWモードをチェックして,割り込みモード(NPまたはEP)のとき,または現在実行中のタスクがないときは,トラップ命令を発行せずにノップ動作になります.トラップ命令が実行されると実行中のタスクにレジスタ・セーブ動作が行われます.そして,TCBがチェックされ,ウェイト・フラグがチェックされて,ウェイト状態でなければレディ・タスク・プールに戻されます.ウェイト状態であれば,この関数をコールする以前にレジスタ・セーブ以外の必要なウェイト処理(TCBをウェイト・シーズSCBにリンクする処理とウェイト・フラグをセットする処理など)が行われていなければなりません.
これはコンパイラで割り込み処理を構成するときに必要な関数です.MicrOSでは内部割り込みを使うときはワーキング・レジスタのセーブは行いませんが,この関数によってコンパイラの要求する諸条件を吸収できます.
● CPUモードの判定
int __cpumode(void)
実行中の状態が割り込みモードなのかユーザ・モードなのかをチェックします.ユーザ・モードであれば0が返ります.この関数はアセンブリ・コード版にはありません.
● 割り込みモードに設定する
int __setPSWint(void)
MicroOSはCA850の_interrupt関数がEPモードで動作することを前提に設計しましたが,このモードになっていません.そこで,この関数によって一時的にEPモードに変更します.返り値は変更前のPSWです.この関数もアセンブリ・コード版にはありません.
● ユーザ・モードに戻す
int __restorePSW(int psw)
__setPSWintで変更したPSWを元に戻します.アセンブリ・コード版にはありません.
tag: OS