割込み管理機能

T-Kernel/SMの割込み管理機能は、外部割込みの禁止や許可、割込み禁止状態の取得、割込みコントローラの制御などを行うための機能である。

割込み関係はハードウェア依存度が高く、システムごとに異なっているため共通化することが難しい。下記を標準仕様として定めるが、システムによってはこの通りに実装することが難しい場合がある。できる限り標準仕様に合わせた実装を求めるが、実装不可能なものは実装しなくてもよい。標準仕様とは別の機能を追加することも許されるが、その場合は関数名などは標準仕様と異なるものでなければならない。ただし、DI(), EI(), isDI() は標準仕様にしたがって、必ず実装しなければならない。

割込み管理機能は、ライブラリ関数またはC言語のマクロで提供され、これらはタスク独立部およびディスパッチ禁止・割込み禁止の状態から呼び出すことができる。

CPU割込み制御

CPUの外部割込みフラグを制御する。一般的には、割込みコントローラに対しては何もしない。

DI(), EI(), isDI() は、C言語のマクロである。

DI - 外部割込み禁止

C言語インタフェース

#include <tk/tkernel.h>

DI (UINT intsts );

パラメータ

UINT intsts Interrupt StatusCPUの外部割込みフラグを保存する変数

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

CPU内の外部割込みフラグを制御し、すべての外部割込みを禁止する。また、割込みを禁止する前のフラグの状態を intsts に保存する。

本APIはC言語のマクロで定義されており、intsts はポインタではない。変数を直接記載する。

EI - 外部割込み許可

C言語インタフェース

#include <tk/tkernel.h>

EI (UINT intsts );

パラメータ

UINT intsts Interrupt StatusCPUの外部割込みフラグを保存した変数

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

CPU内の外部割込みフラグを制御し、intsts の状態に戻す。すなわち、これ以前に実行された DI(intsts) で割込みを禁止する前の状態に戻す。

DI(intsts) の実行前の状態が外部割込み許可であった場合には、その後の EI(intsts) の実行により、再度外部割込みを許可した状態となる。一方、DI(intsts) で割込みを禁止する以前から割込み禁止状態であった場合には、EI(intsts) を実行しても割込みは許可されない。ただし、intsts として0を指定した場合は、CPU内の外部割込みフラグが割込み許可状態となる。

intsts は、DI() で保存した値または0のいずれかでなければならない。それ以外の値を指定した場合の動作は保証されない。

isDI - 外部割込み禁止状態の取得

C言語インタフェース

#include <tk/tkernel.h>

BOOL disint = isDI (UINT intsts );

パラメータ

UINT intsts Interrupt StatusCPUの外部割込みフラグを保存した変数

リターンパラメータ

BOOL disint Interrupts Disabled Status外部割込み禁止状態

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

以前に実行された DI() によって intsts に保存されていたCPU内の外部割込みフラグの状態を調べ、T-Kernel/OSで割込み禁止と判断される状態であった場合にはTRUE(0以外の値)を、割込み許可と判断される状態であった場合にはFALSEを返す。

intsts は、DI() で保存した値でなければならない。それ以外の値を指定した場合の動作は保証されない。

例 4. isDIの使用例

void foo()
{
        UINT    intsts;

        DI(intsts);

        if ( isDI(intsts) ) {
                /* 上記の DI() が呼び出された時点で既に割込み禁止であった */
        } else {
                /* 上記の DI() が呼び出された時点では割込み許可であった */
        }

        EI(intsts);
}

割込みコントローラ制御

割込みコントローラを制御する。一般的には、CPUの割込みフラグに対しては何もしない。

typedef UINT    INTVEC;         /* 割込みベクタ */

割込みベクタ(INTVEC)の具体的な内容は、実装定義である。ただし、tk_def_int() で指定する割込みハンドラ番号と同じか、簡単な方法で割込みハンドラ番号と相互に変換できる様なものであることが望ましい。

DINTNO - 割込みベクタから割込みハンドラ番号へ変換

C言語インタフェース

#include <tk/tkernel.h>

UINT dintno = DINTNO (INTVEC intvec );

パラメータ

INTVEC intvec Interrupt Vector割込みベクタ

リターンパラメータ

UINT dintno Interrupt Handler Number割込みハンドラ番号

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

割込みベクタから割込みハンドラ番号へ変換する。

EnableInt - 割込み許可

C言語インタフェース

#include <tk/tkernel.h>

void EnableInt (INTVEC intvec );

void EnableInt (INTVEC intvec , INT level );

パラメータ

INTVEC intvec Interrupt Vector割込みベクタ
INT level Interrupt Priority Level割込み優先度レベル

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

intvec の割込みを許可する。割込み優先度レベルを指定可能なシステムでは、level により割込み優先度レベルを指定する。level の具体的な意味は実装定義である。

level あり、または level なしの、いずれか一方を提供する。

DisableInt - 割込み禁止

C言語インタフェース

#include <tk/tkernel.h>

void DisableInt (INTVEC intvec );

パラメータ

INTVEC intvec Interrupt Vector割込みベクタ

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

intvec の割込みを禁止する。一般的には、割込み禁止中の割込みはペンディングされ、EnableInt() により許可した時に割込みが発生する。割込み禁止中に発生した割込みを無効にしたい場合は、ClearInt() を行う必要がある。

ClearInt - 割込み発生のクリア

C言語インタフェース

#include <tk/tkernel.h>

void ClearInt (INTVEC intvec );

パラメータ

INTVEC intvec Interrupt Vector割込みベクタ

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

intvec の割込みが発生していればクリアする。

EndOfInt - 割込みコントローラにEOI発行

C言語インタフェース

#include <tk/tkernel.h>

void EndOfInt (INTVEC intvec );

パラメータ

INTVEC intvec Interrupt Vector割込みベクタ

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

割込みコントローラにEOI(End Of Interrupt)を発行する。intvec は EOI 発行対象の割込みでなければならない。一般的には、割込みハンドラの最後で実行する必要がある。

CheckInt - 割込み発生の検査

C言語インタフェース

#include <tk/tkernel.h>

BOOL rasint = CheckInt (INTVEC intvec );

パラメータ

INTVEC intvec Interrupt Vector割込みベクタ

リターンパラメータ

BOOL rasint Interrupts Raised Status外部割込み発生状態

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

intvec の割込みが発生しているか調べる。intvec の割込みが発生していれば TRUE(0以外の値)、発生していなければ FALSE を返す。

SetIntMode - 割込みモード設定

C言語インタフェース

#include <tk/tkernel.h>

void SetIntMode (INTVEC intvec , UINT mode );

パラメータ

INTVEC intvec Interrupt Vector割込みベクタ
UINT mode Mode割込みモード

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

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 1.0との差異

T-Kernel 2.0で追加されたAPIである。