T-Kernel/SMの割込み管理機能は、外部割込みの禁止や許可、割込み禁止状態の取得、割込みコントローラの制御などを行うための機能である。
割込み関係はハードウェア依存度が高く、システムごとに異なっているため共通化することが難しい。下記を標準仕様として定めるが、システムによってはこの通りに実装することが難しい場合がある。できる限り標準仕様に合わせた実装を求めるが、実装不可能なものは実装しなくてもよい。標準仕様とは別の機能を追加することも許されるが、その場合は関数名などは標準仕様と異なるものでなければならない。ただし、DI(), EI(), isDI() は標準仕様にしたがって、必ず実装しなければならない。
割込み管理機能は、ライブラリ関数またはC言語のマクロで提供され、これらはタスク独立部およびディスパッチ禁止・割込み禁止の状態から呼び出すことができる。
CPUの外部割込みフラグを制御する。一般的には、割込みコントローラに対しては何もしない。
DI(), EI(), isDI() は、C言語のマクロである。
なし
CPU内の外部割込みフラグを制御し、すべての外部割込みを禁止する。また、割込みを禁止する前のフラグの状態を intsts
に保存する。
本APIはC言語のマクロで定義されており、intsts
はポインタではない。変数を直接記載する。
なし
CPU内の外部割込みフラグを制御し、intsts
の状態に戻す。すなわち、これ以前に実行された DI(intsts) で割込みを禁止する前の状態に戻す。
DI(intsts) の実行前の状態が外部割込み許可であった場合には、その後の EI(intsts) の実行により、再度外部割込みを許可した状態となる。一方、DI(intsts) で割込みを禁止する以前から割込み禁止状態であった場合には、EI(intsts) を実行しても割込みは許可されない。ただし、intsts
として0を指定した場合は、CPU内の外部割込みフラグが割込み許可状態となる。
intsts
は、DI() で保存した値または0のいずれかでなければならない。それ以外の値を指定した場合の動作は保証されない。
なし
割込みコントローラを制御する。一般的には、CPUの割込みフラグに対しては何もしない。
typedef UINT INTVEC; /* 割込みベクタ */
割込みベクタ(INTVEC)の具体的な内容は、実装定義である。ただし、tk_def_int() で指定する割込みハンドラ番号と同じか、簡単な方法で割込みハンドラ番号と相互に変換できる様なものであることが望ましい。
なし
intvec
の割込みを許可する。割込み優先度レベルを指定可能なシステムでは、level
により割込み優先度レベルを指定する。level
の具体的な意味は実装定義である。
level
あり、または level
なしの、いずれか一方を提供する。
なし
intvec
の割込みを禁止する。一般的には、割込み禁止中の割込みはペンディングされ、EnableInt() により許可した時に割込みが発生する。割込み禁止中に発生した割込みを無効にしたい場合は、ClearInt() を行う必要がある。
なし
割込みコントローラにEOI(End Of Interrupt)を発行する。intvec
は EOI 発行対象の割込みでなければならない。一般的には、割込みハンドラの最後で実行する必要がある。
なし
intvec
の割込みが発生しているか調べる。intvec
の割込みが発生していれば TRUE(0以外の値)、発生していなければ FALSE を返す。
なし
intvec
で指定した割込みを mode
で指定したモードに設定する。
設定可能な機能や mode
の指定方法は実装依存である。以下は、設定可能な機能の一例である。
mode := (IM_LEVEL || IM_EDGE) | (IM_HI || IM_LOW)
#define IM_LEVEL 0x0002 /* レベルトリガ */ #define IM_EDGE 0x0000 /* エッジトリガ */ #define IM_HI 0x0000 /* Hレベル/立ち上がりエッジで割込み */ #define IM_LOW 0x0001 /* Lレベル/立ち下がりエッジで割込み */
不正な mode
を指定した場合の動作は保証されない。
T-Kernel 2.0で追加されたAPIである。