割込み管理機能

μ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);
}

SetCpuIntLevel - CPU内割込みマスクレベルの設定

C言語インタフェース

#include <tk/tkernel.h>

void SetCpuIntLevel (INT level );

パラメータ

INT level Interrupt Mask Level割込みマスクレベル

利用可能なコンテキスト

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

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_CPUINTLEVEL CPU内割込み優先度レベルの設定・取得をサポート

解説

CPU内の割込みマスクレベルを設定し、levelよりも低い割込み優先度を持つ割込みを禁止する。逆に、levelと同一またはより高い割込み優先度を持つ割込みは許可される。

levelINTLEVEL_DI を指定した場合は、すべての優先度の外部割込みを禁止した状態となるように割込みコントローラ内の割込みマスクレベルを設定する。これは一般に、DI()を実行した後の状態と同じである。

また、levelINTLEVEL_EI を指定した場合は、すべての優先度の外部割込みを許可した状態となるように割込みコントローラ内の割込みマスクレベルを設定する。これは一般に、EI(0)を実行した後の状態と同じである。

本APIの実行によって割込みを禁止している間は、割込みハンドラ実行中と同じように、割込み禁止が解除されるまでディスパッチを遅延する場合がある。

指定可能なlevelの範囲、INTLEVEL_DIの具体値は実装定義である。また、割込み優先度の高低と割込みレベルの数値の大小との関係も実装定義である。一般に、これらの仕様はCPUのアーキテクチャに依存して決められる。

補足事項

「割込みマスクレベル」とは、割込みを許可(マスク)する外部割込み優先度(割込みレベル)の下限を示す値である。外部割込みの優先度を指定可能なCPUにおいて EnableInt() で外部割込み優先度を指定した場合、その優先度が割込みマスクレベルと同一またはより高い割込み優先度を持つ外部割込みが許可される。本APIはCPU内の割込みマスクレベルを設定する機能であり、割込みコントローラ内の割込みマスクレベルを設定する SetCtrlIntLevel() とほぼ同一の機能であるが、前者は DI(), EI() で設定した割込み許可・禁止状態に影響を与えるが、後者はそれらの状態とは無関係である点が異なる。

本APIでは、それ以前の状態とは無関係に、単純にCPU内の割込みマスクレベルの設定を行うだけである。本APIの実行により、禁止される割込みの範囲が増える場合と、減る場合の両方があるので注意されたい。

T-Kernel 2.0との差異

本APIはμT-Kernel 2.0仕様で新たに追加された。

μT-Kernel 1.0との差異

本APIはμT-Kernel 2.0仕様で新たに追加された。

GetCpuIntLevel - CPU内割込みマスクレベルの取得

C言語インタフェース

#include <tk/tkernel.h>

INT level = GetCpuIntLevel (void );

リターンパラメータ

INT level Interrupt Mask Level割込みマスクレベル

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_CPUINTLEVEL CPU内割込み優先度レベルの設定・取得をサポート

解説

CPU内に設定されている割込みマスクレベルの現在値を取得し、リターンパラメータ level として返す。

level で指定可能な値の範囲は実装定義である。

補足事項

SetCpuIntLevel の解説および補足事項を参照のこと

T-Kernel 2.0との差異

本APIはμT-Kernel 2.0仕様で新たに追加された。

μT-Kernel 1.0との差異

本APIはμT-Kernel 2.0仕様で新たに追加された。

割込みコントローラ制御

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

注意T-Kernel 2.0との差異
 

割込みベクタ番号(INTVEC)の定義を廃止し、これらを利用している関数等では代わりに割込み番号を用いるように仕様の修正を行った。これに伴いDINTNOマクロも不要であるため仕様に含めないが、T-Kernel 2.0との互換性を維持するために以下の定義によるDINTNOマクロを提供することが推奨される。

#define DINTNO(intvec)  (intvec)

EnableInt - 割込み許可

C言語インタフェース

#include <tk/tkernel.h>

void EnableInt (UINT intno );

void EnableInt (UINT intno , INT level );

パラメータ

UINT intno Interrupt Number割込み番号
INT level Interrupt Priority Level割込み優先度レベル

利用可能なコンテキスト

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

関連するサービスプロファイル

TK_HAS_ENAINTLEVEL 第2引数に割込み優先度レベル(level)が指定可能

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_INTCTRL μT-Kernel標準割り込みコントローラ関連機能をサポート

解説

割込み番号 intno の割込みを許可する。割込み優先度レベルを指定可能なシステムでは、level により割込み優先度レベルを指定する。

intno に指定可能な割込み番号は、tk_def_int で指定可能なもののうち、割り込みコントローラによって管理される割込みの番号に限定される。不正な intno を指定した場合の動作は保証されない。

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

T-Kernel 2.0との差異

割込みベクタ番号(INTVEC)による指定を廃止し、代わりに割込み番号を用いる仕様に修正した。

μT-Kernel 1.0との差異

本APIは過去のμT-Kernelの仕様では除外されていたが、サービスプロファイルの導入によりプロファイルで許容される場合に利用が可能となった。

DisableInt - 割込み禁止

C言語インタフェース

#include <tk/tkernel.h>

void DisableInt (UINT intno );

パラメータ

UINT intno Interrupt Number割込み番号

利用可能なコンテキスト

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

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_INTCTRL μT-Kernel標準割り込みコントローラ関連機能をサポート

解説

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

intno に指定可能な割込み番号は、tk_def_int で指定可能なもののうち、割り込みコントローラによって管理される割込みの番号に限定される。不正な intno を指定した場合の動作は保証されない。

T-Kernel 2.0との差異

割込みベクタ番号(INTVEC)による指定を廃止し、代わりに割込み番号を用いる仕様に修正した。

μT-Kernel 1.0との差異

本APIは過去のμT-Kernelの仕様では除外されていたが、サービスプロファイルの導入によりプロファイルで許容される場合に利用が可能となった。

ClearInt - 割込み発生のクリア

C言語インタフェース

#include <tk/tkernel.h>

void ClearInt (UINT intno );

パラメータ

UINT intno Interrupt Number割込み番号

利用可能なコンテキスト

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

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_INTCTRL μT-Kernel標準割り込みコントローラ関連機能をサポート

解説

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

intno に指定可能な割込み番号は、tk_def_int で指定可能なもののうち、割り込みコントローラによって管理される割込みの番号に限定される。不正な intno を指定した場合の動作は保証されない。

T-Kernel 2.0との差異

割込みベクタ番号(INTVEC)による指定を廃止し、代わりに割込み番号を用いる仕様に修正した。

μT-Kernel 1.0との差異

本APIは過去のμT-Kernelの仕様では除外されていたが、サービスプロファイルの導入によりプロファイルで許容される場合に利用が可能となった。

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

C言語インタフェース

#include <tk/tkernel.h>

void EndOfInt (UINT intno );

パラメータ

UINT intno Interrupt Number割込み番号

利用可能なコンテキスト

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

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_INTCTRL μT-Kernel標準割り込みコントローラ関連機能をサポート

解説

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

intno に指定可能な割込み番号は、tk_def_int で指定可能なもののうち、割り込みコントローラによって管理される割込みの番号に限定される。不正な intno を指定した場合の動作は保証されない。

T-Kernel 2.0との差異

割込みベクタ番号(INTVEC)による指定を廃止し、代わりに割込み番号を用いる仕様に修正した。

μT-Kernel 1.0との差異

本APIは過去のμT-Kernelの仕様では除外されていたが、サービスプロファイルの導入によりプロファイルで許容される場合に利用が可能となった。

CheckInt - 割込み発生の検査

C言語インタフェース

#include <tk/tkernel.h>

BOOL rasint = CheckInt (UINT intno );

パラメータ

UINT intno Interrupt Number割込み番号

リターンパラメータ

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

利用可能なコンテキスト

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

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_INTCTRL μT-Kernel標準割り込みコントローラ関連機能をサポート

解説

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

T-Kernel 2.0との差異

割込みベクタ番号(INTVEC)による指定を廃止し、代わりに割込み番号を用いる仕様に修正した。

μT-Kernel 1.0との差異

本APIは過去のμT-Kernelの仕様では除外されていたが、サービスプロファイルの導入によりプロファイルで許容される場合に利用が可能となった。

SetIntMode - 割込みモード設定

C言語インタフェース

#include <tk/tkernel.h>

void SetIntMode (UINT intno , UINT mode );

パラメータ

UINT intno Interrupt Number割込み番号
UINT mode Mode割込みモード

利用可能なコンテキスト

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

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_INTMODE 割込みモード設定をサポート

解説

割込み番号 intno で指定した割込みを mode で指定したモードに設定する。

intno に指定可能な割込み番号は、tk_def_int で指定可能なもののうち、割り込みコントローラによって管理される割込みの番号に限定される。不正な intno を指定した場合の動作は保証されない。

設定可能な機能や 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との差異

割込みベクタ番号(INTVEC)による指定を廃止し、代わりに割込み番号を用いる仕様に修正した。

μT-Kernel 1.0との差異

T-Kernel 2.0仕様に基づき新たに追加されたAPIである。

SetCtrlIntLevel - 割込みコントローラ内割込みマスクレベルの設定

C言語インタフェース

#include <tk/tkernel.h>

void SetCtrlIntLevel (INT level );

パラメータ

INT level Interrupt Mask Level割込みマスクレベル

利用可能なコンテキスト

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

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_CTRLINTLEVEL 割込みコントローラ内の割込み優先度レベルの設定・取得をサポート

解説

割込みコントローラ内の割込みマスクレベルを設定し、levelよりも低い割込み優先度を持つ割込みを禁止する。逆に、levelと同一またはより高い割込み優先度を持つ割込みは許可される。

levelINTLEVEL_DI を指定した場合は、すべての優先度の外部割込みを禁止した状態となるように割込みコントローラ内の割込みマスクレベルを設定する。

また、levelINTLEVEL_EI を指定した場合は、すべての優先度の外部割込みを許可した状態となるように割込みコントローラ内の割込みマスクレベルを設定する。

本APIの実行によって割込みを禁止している間は、割込みハンドラ実行中と同じように、割込み禁止が解除されるまでディスパッチを遅延する場合がある。

指定可能なlevelの範囲、INTLEVEL_DIの具体値は実装定義である。また、割込み優先度の高低と割込みレベルの数値の大小との関係も実装定義である。一般に、これらの仕様はCPUのアーキテクチャに依存して決められる。

補足事項

「割込みマスクレベル」とは、割込みを許可(マスク)する外部割込み優先度(割込みレベル)の下限を示す値である。外部割込みの優先度を指定可能なCPUにおいて EnableInt() で外部割込み優先度を指定した場合、その優先度が割込みマスクレベルと同一またはより高い割込み優先度を持つ外部割込みが許可される。割り込み優先度に対して、本APIは割込みコントローラ内の割込みマスクレベルを設定する機能であり、CPU内の割込みマスクレベルを設定する SetCpuIntLevel() とほぼ同一の機能であるが、前者は DI(), EI() で設定した割込み許可・禁止状態に影響を及ぼさないが、後者はそれらの状態に影響を与える点が異なっている。

本APIでは、それ以前の状態とは無関係に、単純に割込みコントローラ内のマスクレベルの設定を行うだけである。本APIの実行により、禁止される割込みの範囲が増える場合と、減る場合の両方があるので注意されたい。

T-Kernel 2.0との差異

本APIはμT-Kernel 2.0仕様で新たに追加された。

μT-Kernel 1.0との差異

本APIはμT-Kernel 2.0仕様で新たに追加された。

GetCtrlIntLevel - 割込みコントローラ内割込みマスクレベルの取得

C言語インタフェース

#include <tk/tkernel.h>

INT level = GetCtrlIntLevel (void );

リターンパラメータ

INT level Interrupt Mask Level割込みマスクレベル

利用可能なコンテキスト

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

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_CTRLINTLEVEL 割込みコントローラ内の割込み優先度レベルの設定・取得をサポート

解説

割込みコントローラ内に設定されている割込みマスクレベルの現在値を取得し、リターンパラメータ level として返す。

level で指定可能な値の範囲は実装定義である。

補足事項

SetCtrlIntLevel の解説および補足事項を参照のこと

T-Kernel 2.0との差異

本APIはμT-Kernel 2.0仕様で新たに追加された。

μT-Kernel 1.0との差異

本APIはμT-Kernel 2.0仕様で新たに追加された。