μT-Kernel/OSの機能

この章では、μT-Kernel/OS(Operating System)で提供しているシステムコールの詳細について説明を行う。

タスク管理機能

タスク管理機能は、タスクの状態を直接的に操作/参照するための機能である。タスクを生成/削除する機能、タスクを起動/終了する機能、タスクの優先度を変更する機能、タスクの状態を参照する機能が含まれる。タスクはID番号で識別されるオブジェクトである。タスクのID番号をタスクIDと呼ぶ。タスク状態とスケジューリング規則については、タスク状態とスケジューリング規則μT-Kernelの概念を参照すること。

タスクは、実行順序を制御するために、ベース優先度と現在優先度を持つ。単にタスクの優先度といった場合には、タスクの現在優先度を指す。タスクのベース優先度は、タスクの起動時にタスクの起動時優先度に初期化する。ミューテックス機能を使わない場合には、タスクの現在優先度は常にベース優先度に一致している。そのため、タスク起動直後の現在優先度は、タスクの起動時優先度になっている。ミューテックス機能を使う場合に現在優先度がどのように設定されるかについては、ミューテックスで述べる。

カーネルは、タスクの終了時に、ミューテックスのロック解除を除いては、タスクが獲得した資源(セマフォ資源、メモリブロックなど)を解放する処理を行わない。タスク終了時に資源を解放するのは、アプリケーションの責任である。

tk_cre_tsk - タスク生成

C言語インタフェース

#include <tk/tkernel.h>

ID tskid = tk_cre_tsk (CONST T_CTSK *pk_ctsk );

パラメータ

CONST T_CTSK* pk_ctsk Packet to Create Taskタスク生成情報

pk_ctsk の内容

void* exinf Extended Information拡張情報
ATR tskatr Task Attributeタスク属性
FP task Task Start Addressタスク起動アドレス
PRI itskpri Initial Task Priorityタスク起動時優先度
SZ stksz Stack Sizeスタックサイズ(バイト数)
SZ sstksz System Stack Sizeシステムスタックサイズ(バイト数)
void* stkptr User Stack Pointerユーザスタックポインタ
void* uatb Address of Task Space Page Tableタスク固有空間ページテーブル
INT lsid Logical Space ID論理空間ID
ID resid Resource IDリソースID
UB dsname[8] DS Object nameDSオブジェクト名称
void* bufptr Buffer Pointerユーザバッファポインタ
──(以下に実装独自に他の情報を追加してもよい)──

リターンパラメータ

ID tskid Task IDタスクID
またはError Codeエラーコード

エラーコード

E_NOMEM メモリ不足(管理ブロックやスタック用の領域が確保できない)
E_LIMIT タスクの数がシステムの制限を超えた
E_RSATR 予約属性(tskatr が不正あるいは利用できない)、指定のコプロセッサは存在しない
E_NOSPT 未サポート機能(TA_ASM, TA_USERSTACK, TA_TASKSPACE, TA_USERBUF に関する指定が未サポートの場合)
E_PAR パラメータエラー
E_ID リソースID(resid)が不正
E_NOCOP 指定のコプロセッサが使用できない(動作中のハードウェアには搭載されていない、または動作異常が検出された)

利用可能なコンテキスト

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

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

TK_SUPPORT_ASM TA_ASMのタスク属性指定が可能
TK_SUPPORT_USERBUF TA_USERBUFのタスク属性指定が可能
TK_SUPPORT_AUTOBUF バッファの自動割り当て(TA_USERBUFのタスク属性指定なし)が可能
TK_SUPPORT_FPU TA_FPUのタスク属性指定が可能
TK_SUPPORT_COPn TA_COPnのタスク属性指定が可能
TK_SUPPORT_RESOURCE 所属リソースグループの指定(resid)が可能
TK_SUPPORT_TASKSPACE タスク固有空間に関する指定(uatb, lsid)が可能
TK_HAS_SYSSTACK タスクがユーザスタックとは独立したシステムスタックを持ち、ユーザスタック・システムスタックに対する個別の指定(TA_USERSTACK, TA_SSTKSZ)が可能
TK_SUPPORT_DSNAME TA_DSNAMEのタスク属性指定が可能
TK_MAX_TSKPRI 指定可能な最大タスク優先度の値 (16以上であること)

解説

タスクを生成しタスクID番号を割り当てる。具体的には、生成するタスクに対してTCB(Task Control Block)を割り付け、itskpri, task, stksz などの情報をもとにその初期設定を行う。

対象タスクは生成後、休止状態(DORMANT)となる。

itskpri によって、タスクが起動する時の優先度の初期値を指定する。タスク優先度には1以上の値を指定することができ、数の小さい方が高い優先度となる。指定可能な最大のタスク優先度は TK_MAX_TSKPRI で規定される。

exinf は、対象タスクに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した情報は、タスクに起動パラメータとして渡される他、tk_ref_tsk で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい場合や、途中で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf に入れる。カーネルでは exinf の内容について関知しない。

tskatr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。tskatr のシステム属性の部分では、次のような指定を行う。

tskatr := (TA_ASM || TA_HLNG)
   | [TA_SSTKSZ] | [TA_USERSTACK] | [TA_TASKSPACE] | [TA_RESID] | [TA_USERBUF] | [TA_DSNAME]
   | (TA_RNG0 || TA_RNG1 || TA_RNG2 || TA_RNG3)
   | [TA_COP0] | [TA_COP1] | [TA_COP2] | [TA_COP3] | [TA_FPU]

TA_ASM 対象タスクがアセンブリ言語で書かれている
TA_HLNG 対象タスクが高級言語で書かれている
TA_SSTKSZ システムスタックサイズを指定する
TA_USERSTACK ユーザスタックポインタを指定する
TA_TASKSPACE タスク固有空間を指定する
TA_RESID 所属リソースグループを指定する
TA_USERBUF スタック領域としてユーザが指定した領域を使用する
TA_DSNAME DSオブジェクト名称を指定する
TA_RNGn 対象タスクは保護レベルnで実行する
TA_COPn 対象タスクが第n番目のコプロセッサを使用する(浮動小数点演算用コプロセッサやDSPを含む)
TA_FPU 対象タスクが浮動小数点演算用コプロセッサを使用する(TA_COPn による指定の内、特に浮動小数点演算を使用するための、CPUに依存しない汎用的な指定である)

実装独自属性の機能は、例えば、被デバッグ対象のタスクであることを指定したりするために利用できる。また、システム属性の残りの部分は、将来マルチプロセッサ属性の指定などを行うために利用できる。

#define TA_ASM          0x00000000      /* アセンブリ言語によるプログラム */
#define TA_HLNG         0x00000001      /* 高級言語によるプログラム */
#define TA_SSTKSZ       0x00000002      /* システムスタックサイズを指定 */
#define TA_USERSTACK    0x00000004      /* ユーザスタックポインタを指定 */
#define TA_TASKSPACE    0x00000008      /* タスク固有空間を指定 */
#define TA_RESID        0x00000010      /* 所属リソースグループを指定 */
#define TA_USERBUF      0x00000020      /* ユーザバッファポインタを指定 */
#define TA_DSNAME       0x00000040      /* DSオブジェクト名称を指定 */
#define TA_RNG0         0x00000000      /* 保護レベル0 で実行 */
#define TA_RNG1         0x00000100      /* 保護レベル1 で実行 */
#define TA_RNG2         0x00000200      /* 保護レベル2 で実行 */
#define TA_RNG3         0x00000300      /* 保護レベル3 で実行 */
#define TA_COP0         0x00001000      /* ID=0 のコプロセッサを使用 */
#define TA_COP1         0x00002000      /* ID=1 のコプロセッサを使用 */
#define TA_COP2         0x00004000      /* ID=2 のコプロセッサを使用 */
#define TA_COP3         0x00008000      /* ID=3 のコプロセッサを使用 */

TA_HLNG の指定を行った場合には、タスク起動時に直接 task のアドレスにジャンプするのではなく、高級言語の環境設定プログラム(高級言語対応ルーチン)を通してから task のアドレスにジャンプする。TA_HLNG 属性の場合のタスクは次の形式となる。

void task( INT stacd, void *exinf )
{
        /*
                処理
        */

        tk_ext_tsk(); または tk_exd_tsk(); /* タスクの終了 */
}

タスクの起動パラメータとして、tk_sta_tsk で指定するタスク起動コード stacd、および tk_cre_tsk で指定する拡張情報 exinf を渡す。

関数からの単純なリターン(return)でタスクを終了することはできない(してはいけない)。その場合の動作は不定(実装依存)である。

TA_ASM 属性の場合のタスクの形式は実装依存とする。ただし、起動パラメータとして stacd, exinf を渡さなければならない。

タスクは、TA_RNGn で指定された保護レベルで動作する。システムコールや拡張SVCを呼び出すことで保護レベル0に移行し、システムコールや拡張SVCから戻ると元の保護レベルに復帰する。

各タスクはシステムスタックとユーザスタックの2本のスタックを持つ。ユーザスタックは TA_RNGn で指定した保護レベルで使用される。システムスタックは保護レベル0で使用される。システムコールや拡張SVCを呼び出すことにより保護レベルが遷移したときに使用するスタックが切り替えられる。

なお、TA_RNG0 を指定したタスクでは、保護レベルの遷移が起きないためスタックの切替も起きない。TA_RNG0 の場合は、ユーザスタックサイズとシステムスタックサイズの合計を1本のスタックとし、ユーザスタック兼システムスタックとして使用する。

TA_SSTKSZ を指定した場合に sstksz が有効になる。TA_SSTKSZ を指定しなかった場合は、sstksz は無視されデフォルトサイズが適用される。

TA_USERSTACK を指定した場合に stkptr が有効になる。この場合、ユーザスタックはカーネルで用意しない。ユーザスタックは呼出側で用意する。stksz には0を設定しなければならない。TA_USERSTACK を指定しなかった場合は、stkptr は無視される。ただし、TA_RNG0 の場合は、TA_USERSTACK を指定することはできない。TA_RNG0TA_USERSTACK を同時に指定した場合は E_PAR が発生する。

TA_TASKSPACE を指定した場合に uatb, lsid が有効となり、タスク固有空間として設定される。TA_TASKSPACE を指定しなかった場合は、uatb, lsid は無視され、タスク固有空間は不定となる。タスク固有空間が不定の間は、共有空間のみアクセスが許される。固有空間にはアクセスしてはいけない。TA_TASKSPACE を指定した場合も指定しなかった場合も、タスク生成後にタスク固有空間を変更することができる。なお、タスク固有空間を変更した場合、タスクがDORMANT状態に戻ってもタスク生成時に指定したタスク固有空間に戻ることはなく、最後に設定されたタスク固有空間のままとなる。

TA_RESID を指定した場合に resid が有効となり、タスクの所属するリソースグループとして resid のリソースグループ(「サブシステム管理機能」参照)が設定される。TA_RESID を指定しなかった場合は resid は無視され、システムリソースグループに所属するよう設定される。なお、所属リソースグループを変更した場合、タスクがDORMANT状態に戻ってもタスク生成時に指定したリソースグループに戻ることはなく、最後に設定されたリソースグループのままとなる。(tk_cre_res 参照)

ユーザスタックとシステムスタックを区別せずタスクごとにスタックを1本持った実装向けに TA_USERBUF の指定が提供される。この属性を指定した場合に bufptr が有効となり、bufptr を先頭とする stksz バイトのメモリ領域をユーザスタック兼システムスタック領域として使用する。この場合、これらのスタックはカーネルで用意しない。

TA_DSNAME を指定した場合に dsname が有効となり、DSオブジェクト名称として設定される。DSオブジェクト名称はデバッガがオブジェクトを識別するために使用され、T-Kernel/DSのシステムコール td_ref_dsnametd_set_dsname からのみ操作可能である。詳細は td_ref_dsnametd_set_dsname を参照のこと。TA_DSNAME を指定しなかった場合は、dsname が無視され、td_ref_dsnametd_set_dsname が、E_OBJ エラーとなる。

補足事項

タスクは、TA_RNGn で指定した保護レベルと保護レベル0のいずれかでのみ動作する。例えば、TA_RNG3 を指定したタスクが保護レベル1および2で動作することはない。

割込みスタックが分離されていないシステムでは、割込みハンドラもシステムスタックを使用する。割込みハンドラは保護レベル0で動作する。

システムスタックのデフォルトサイズは、システムコールの実行により消費するサイズおよび割込みスタックが分離されていないシステムでは割込みハンドラにより消費されるサイズを考慮して決定する。

システムスタックは保護レベル0の共有空間の常駐メモリとなる。TA_USERSTACK が指定されなかった場合、ユーザスタックは、TA_RNGn で指定した保護レベルの共有空間の常駐メモリとなる。TA_USERSTACK が指定された場合、ユーザスタックのメモリの属性は呼出側で任意に決定する。タスク固有空間の非常駐メモリとしてもよい。

TA_COPn の定義は、CPUなどのハードウェアに依存して決められるため移植性はない。

TA_FPU は、TA_COPn の定義の内、浮動小数点演算の使用に関してのみ移植性のある指定方法として用意される。例えば、浮動小数点コプロセッサが TA_COP0 の場合は、TA_FPUTA_COP0 となる。浮動小数点演算を行うのに特にコプロセッサの使用を指定する必要がない場合は、TA_FPU=0となる。

MMUのないシステムにおいても、移植性確保のために TA_RNGn などすべての属性を受け付けなければならない。例えば、TA_RNGn の指定はすべて TA_RNG0 相当として処理してもよいが、エラーとはしない。

ただし、TA_USERSTACKTA_TASKSPACE については MMUなしでは対応不可能な場合が多いと思われるため、E_NOSPT としてよい。

T-Kernel 2.0との差異

T_CTSKのメンバstkszsstkszの型がINTからSZに変更されている。TA_USERBUFbufptrが追加されている。

最大のタスク優先度が140からTK_MAX_TSKPRIに変更されている。

μT-Kernel 1.0との差異

サービスプロファイルの導入により、μT-Kernelの仕様から除外されていたシステムスタックサイズ(sstksz)、タスク固有空間ページテーブル(uatb)、論理空間ID(lsid)、リソースID(resid)の指定が、プロファイルの制約に従う範囲で可能となった。タスク属性における、TA_TASKSPACE, TA_SSTKSZ, TA_USERSTACK, TA_TASKSPACE, TA_RESID, TA_DSNAME, TA_COPn についても同様である。

T_CTSKのメンバstkszsstkszの型がWからSZに変更されている。

最大のタスク優先度が140からTK_MAX_TSKPRIに変更されている。

移植ガイドライン

T-Kernel 2.0にはTA_USERBUFbufptrが存在しない。このため、この機能を使っている場合はT-Kernel 2.0への移植の際に修正が必要となるが、正しくstkszを設定してあれば、TA_USERBUFbufptrを削除するだけで移植できる。

最大のタスク優先度が140からTK_MAX_TSKPRIに変更されている。TK_MAX_TSKPRIの値は可変だが、16以上であることが保証されているため、利用するタスク優先度の範囲を1〜16に限定することで移植の際のタスク優先度の修正が不要となる。

tk_del_tsk - タスク削除

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_del_tsk (ID tskid );

パラメータ

ID tskid Task IDタスクID

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_OBJ オブジェクトの状態が不正(対象タスクが休止状態(DORMANT)でない)

利用可能なコンテキスト

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

解説

tskid で示されたタスクを削除する。

具体的には、tskid で指定されたタスクを休止状態(DORMANT)から未登録状態(NON-EXISTENT)(システムに存在しない状態)へと移行させ、それに伴ってTCBおよびスタック領域を解放する。また、タスクID番号も解放される。休止状態(DORMANT)でないタスクに対してこのシステムコールを実行すると、E_OBJ のエラーとなる。

このシステムコールで自タスクの指定はできない。自タスクを指定した場合には、自タスクが休止状態(DORMANT)ではないため、E_OBJ のエラーとなる。自タスクを削除するには、本システムコールではなく、tk_exd_tsk システムコールを発行する。

tk_sta_tsk - タスク起動

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_sta_tsk (ID tskid , INT stacd );

パラメータ

ID tskid Task IDタスクID
INT stacd Task Start Codeタスク起動コード

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_OBJ オブジェクトの状態が不正(対象タスクが休止状態(DORMANT)でない)

利用可能なコンテキスト

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

解説

tskid で示されたタスクを起動する。具体的には、休止状態(DORMANT)から実行可能状態(READY)へと移す。

stacd により、タスクの起動時にタスクに渡すパラメータを設定することができる。このパラメータは、対象タスクから参照することができ、簡単なメッセージ通信の目的で利用できる。

タスク起動時のタスク優先度は、対象タスクが生成された時に指定されたタスク起動時優先度(itskpri)となる。

このシステムコールによる起動要求のキューイングは行わない。すなわち、対象タスクが休止状態(DORMANT)でないのにこのシステムコールが発行された場合、このシステムコールは無視され、発行タスクに E_OBJ のエラーが返る。

移植ガイドライン

stacd がINT型であり、処理系によって指定できる値の範囲が異なる可能性があるため注意が必要である。

tk_ext_tsk - 自タスク終了

C言語インタフェース

#include <tk/tkernel.h>

void tk_ext_tsk ( void );

リターンパラメータ

※ システムコールを発行したコンテキストには戻らない

エラーコード

※ 次のようなエラーを検出する可能性があるが、エラーを検出した場合でも、システムコールを発行したコンテキストには戻らない。したがって、システムコールのリターンパラメータとして直接エラーコードを返すことはできない。万一エラーを検出した場合の動作は、実装依存となる。

E_CTX コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)

利用可能なコンテキスト

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

解説

自タスクを正常終了させ、休止状態(DORMANT)へと移行させる。

補足事項

tk_ext_tsk によるタスクの終了時に、終了するタスクがそれ以前に獲得した資源(メモリブロック、セマフォなど) を自動的に解放するということはない。タスク終了前に資源を解放しておくのは、ユーザの責任である。

tk_ext_tsk は発行元のコンテキストに戻らないシステムコールである。したがって、何らかのエラーを検出した場合にエラーコードを返しても、これらのシステムコールを呼んだ側ではエラーのチェックを行っていないのが普通であり、プログラムが暴走する可能性がある。そこで、これらのシステムコールでは、エラーを検出した場合にも、システムコール発行元へは戻らないものとする。

タスクが休止状態(DORMANT)に戻る時は、タスク優先度などTCBに含まれている情報もリセットされるというのが原則である。たとえば、tk_chg_pri によりタスク優先度を変更されているタスクが、tk_ext_tsk により終了した時、タスク優先度は tk_cre_tsk で指定したタスク起動時優先度(itskpri)に戻る。tk_ext_tsk 実行時のタスク優先度になるわけではない。

元のコンテキストに戻らないシステムコールは、すべてtk_ret_???またはtk_ext_???(tk_exd_???)の名称となっている。

tk_exd_tsk - 自タスクの終了と削除

C言語インタフェース

#include <tk/tkernel.h>

void tk_exd_tsk ( void );

リターンパラメータ

※ システムコールを発行したコンテキストには戻らない

エラーコード

※ 次のようなエラーを検出する可能性があるが、エラーを検出した場合でも、システムコールを発行したコンテキストには戻らない。したがって、システムコールのリターンパラメータとして直接エラーコードを返すことはできない。万一エラーを検出した場合の動作は、実装依存となる。

E_CTX コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)

利用可能なコンテキスト

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

解説

自タスクを正常終了させ、さらに自タスクを削除する。すなわち、自タスクを未登録状態(NON-EXISTENT)(システムに存在しない状態)へと移行させる。

補足事項

tk_exd_tsk によるタスクの終了時に、終了するタスクがそれ以前に獲得した資源(メモリブロック、セマフォなど) を自動的に解放するということはない。タスク終了前に資源を解放しておくのは、ユーザの責任である。

tk_exd_tsk は発行元のコンテキストに戻らないシステムコールである。したがって、何らかのエラーを検出した場合にエラーコードを返しても、これらのシステムコールを呼んだ側ではエラーのチェックを行っていないのが普通であり、プログラムが暴走する可能性がある。そこで、これらのシステムコールでは、エラーを検出した場合にも、システムコール発行元へは戻らないものとする。

tk_ter_tsk - 他タスク強制終了

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_ter_tsk (ID tskid );

パラメータ

ID tskid Task IDタスクID

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_OBJ オブジェクトの状態が不正(対象タスクが休止状態(DORMANT)または自タスク)

利用可能なコンテキスト

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

解説

tskid で示されたタスクを強制的に終了させる。すなわち、tskid で示された対象タスクを休止状態(DORMANT)に移行させる。

対象タスクが待ち状態(強制待ち状態(SUSPENDED)を含む)にあった場合でも、対象タスクは待ち解除となって終了する。また、対象タスクが何らかの待ち行列(セマフォ待ちなど)につながれていた場合には、tk_ter_tsk の実行によってその待ち行列から削除される。

本システムコールでは、自タスクの指定はできない。自タスクを指定した場合には、E_OBJ のエラーとなる。

tk_ter_tsk の対象タスクの状態と実行結果との関係についてまとめたものを表1に示す。

表 1. tk_ter_tskの対象タスクの状態と実行結果

対象タスク状態 tk_ter_tskercd 処理
実行できる状態(RUNNING,READY) (自タスク以外) E_OK 強制終了処理
実行状態(RUNNING)(自タスク) E_OBJ 何もしない
待ち状態(WAITING) E_OK 強制終了処理
強制待ち状態(SUSPENDED) E_OK 強制終了処理
二重待ち状態(WAITING-SUSPENDED) E_OK 強制終了処理
休止状態(DORMANT) E_OBJ 何もしない
未登録状態(NON-EXISTENT) E_NOEXS 何もしない

補足事項

tk_ter_tsk によるタスクの終了時に、終了するタスクがそれ以前に獲得した資源(メモリブロック、セマフォなど)を自動的に解放するということはない。タスク終了前に資源を解放しておくのは、ユーザの責任である。

タスクが休止状態(DORMANT)に戻る時は、タスク優先度などTCBに含まれている情報もリセットされるというのが原則である。たとえば、tk_chg_pri によりタスク優先度を変更されているタスクが、tk_ter_tsk により終了した時、タスク優先度は tk_cre_tsk で指定したタスク起動時優先度(itskpri)に戻る。tk_sta_tsk によって再度タスクを起動した場合、tk_ter_tsk を実行して強制終了された時のタスク優先度になるわけではない。

他タスクの強制終了は、デバッガなどのOSに密接に関連したごく一部でのみ使用することを原則とする。一般のアプリケーションやミドルウェアでは、他タスクの強制終了は原則として使用してはいけない。これは次のような理由による。

強制終了は、対象タスクの実行状態に関係なく行われる。例えば、タスクがあるミドルウェアの機能を呼び出しているとき、そのタスクを強制終了するとミドルウェアの実行途中でタスクが終了してしまうことになる。そのような状況になれば、ミドルウェアの正常動作は保証できなくなる。

このように、タスクの状態(何を実行中か)が不明な状況で、そのタスクを強制終了させることはできない。したがって、一般にタスクの強制終了は使用してはならない。

tk_chg_pri - タスク優先度変更

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_chg_pri (ID tskid , PRI tskpri );

パラメータ

ID tskid Task IDタスクID
PRI tskpri Task Priorityタスク優先度

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_PAR パラメータエラー(tskpri が不正あるいは利用できない値)
E_ILUSE 不正使用(上限優先度違反)

利用可能なコンテキスト

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

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

TK_MAX_TSKPRI 指定可能な最大タスク優先度の値 (16以上であること)

解説

tskid で指定されるタスクのベース優先度を、tskpri で指定される値に変更する。それに伴って、タスクの現在優先度も変更する。

タスク優先度としては、1~140の値を指定することができ、数の小さい方が高い優先度となる。

tskidTSK_SELF(=0)が指定されると、自タスクを対象タスクとする。ただし、タスク独立部から発行したシステムコールで tskidTSK_SELF を指定した場合には、E_ID のエラーとなる。また、tskpriTPRI_INI(=0)が指定されると、対象タスクのベース優先度を、タスクの起動時優先度(itskpri)に変更する。

このシステムコールで変更した優先度は、タスクが終了するまで有効である。タスクが休止状態(DORMANT)に戻る時、終了前のタスクの優先度は捨てられ、タスク生成時に指定されたタスク起動時優先度(itskpri)になる。ただし、休止状態(DORMANT)中に変更した優先度は有効である。次にタスクを起動したときは、その変更された優先度で起動される。

このシステムコールを実行した結果、対象タスクの現在優先度がベース優先度に一致している場合(ミューテックス機能を使わない場合には、この条件は常に成り立つ)には、次の処理を行う。

対象タスクが実行できる状態である場合、タスクの優先順位を、変更後の優先度にしたがって変化させる。変更後の優先度と同じ優先度を持つタスクの間では、対象タスクの優先順位を最低とする。

対象タスクが何らかのタスク優先度順の待ち行列につながれている場合にも、その待ち行列の中での順序を、変更後の優先度にしたがって変化させる。変更後の優先度と同じ優先度を持つタスクの間では、対象タスクを最後につなぐ。

対象タスクが TA_CEILING 属性のミューテックスをロックしているか、ロックを待っている場合で、tskpri で指定されたベース優先度が、それらのミューテックスのいずれかの上限優先度よりも高い場合には、E_ILUSE エラーを返す。

補足事項

このシステムコールを呼び出した結果、対象タスクのタスク優先度順の待ち行列の中での順序が変化した場合、対象タスクないしはその待ち行列で待っている他のタスクの待ち解除が必要になる場合がある(メッセージバッファの送信待ち行列、および可変長メモリプールの獲得待ち行列)。

対象タスクが、TA_INHERIT 属性のミューテックスのロック待ち状態である場合、このシステムコールでベース優先度を変更したことにより、推移的な優先度継承の処理が必要になる場合がある。

ミューテックス機能を使わない場合には、対象タスクに自タスク、変更後の優先度に自タスクのベース優先度を指定してこのシステムコールが呼び出されると、自タスクの実行順位は同じ優先度を持つタスクの中で最低となる。そのため、このシステムコールを用いて、実行権の放棄を行うことができる。

T-Kernel 2.0との差異

最大のタスク優先度が140からTK_MAX_TSKPRIに変更されている。

μT-Kernel 1.0との差異

最大のタスク優先度が140からTK_MAX_TSKPRIに変更されている。

移植ガイドライン

最大のタスク優先度が140からTK_MAX_TSKPRIに変更されている。TK_MAX_TSKPRIの値は可変だが、16以上であることが保証されているため、利用するタスク優先度の範囲を1〜16に限定することで移植の際のタスク優先度の修正が不要となる。

tk_chg_slt - タスクスライスタイム変更

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_chg_slt (ID tskid , RELTIM slicetime );

パラメータ

ID tskid Task IDタスクID
RELTIM slicetime Slice Timeスライスタイム(ミリ秒)

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_PAR パラメータエラー(slicetime が不正)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_SLICETIME スライスタイムの指定が可能

解説

tskid で示されたタスクのスライスタイムを、slicetime で示される値に変更する。

スライスタイムはタスクのラウンドロビンスケジューリングのための機能である。タスクが slicetime 以上の時間、連続して実行されると、同じ優先度を持つタスクの中で最低の優先順位となり、自動的に実行権を次のタスクに譲る。

slicetime=0は無制限を示し、自動的に実行権を譲ることはない。タスク生成時には slicetime=0に設定される。

tskidTSK_SELF=0によって自タスクの指定を行うことができる。ただし、タスク独立部から発行したシステムコールで tskidTSK_SELF=0を指定した場合には、E_ID のエラーとなる。

このシステムコールで変更したスライスタイムは、タスクが終了するまで有効である。タスクが休止状態(DORMANT)に戻る時、終了前のタスクのスライスタイムは捨てられ、タスク生成時の値( slicetime=0)になる。ただし、休止状態(DORMANT)中に変更したスライスタイムは有効である。次にタスクを起動したときは、その変更されたスライスタイムが適用される。

補足事項

より優先度の高いタスクによって実行権が奪われている間は連続実行時間としてカウントされない。また、より高い優先度のタスクによって実行権が奪われても、不連続と扱わない。つまり、より高い優先度のタスクによって実行権が奪われている間は無視して、実行時間をカウントする。

同一優先度に一つしか実行できるタスクがなければ、スライスタイムは実質的に意味はなく、そのタスクが連続して実行される。

同一優先度のタスクの中に、slicetime=0のタスクが含まれていると、そのタスクが実行権を得た時点でラウンドロビンスケジューリングは停止することになる。

実行時間のカウント方法は実装依存だが、それほど高い精度は要求されない。逆に、アプリケーションは高い精度を期待してはいけない。

μT-Kernel 1.0との差異

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

tk_chg_slt_u - タスクスライスタイム変更(マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_chg_slt_u (ID tskid , RELTIM_U slicetime_u );

パラメータ

ID tskid Task IDタスクID
RELTIM_U slicetime_u Slice Timeスライスタイム(マイクロ秒)

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_PAR パラメータエラー(slicetime_u が不正)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_SLICETIME スライスタイムの指定が可能
TK_SUPPORT_USEC マイクロ秒命令をサポート

解説

tk_chg_slt のパラメータである slicetime を64ビットマイクロ秒単位の slicetime_u としたシステムコールである。

パラメータが slicetime_u となった点を除き、本システムコールの仕様は tk_chg_slt と同じである。詳細は tk_chg_slt の説明を参照のこと。

μT-Kernel 1.0との差異

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

tk_get_tsp - タスク固有空間の参照

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_get_tsp (ID tskid , T_TSKSPC *pk_tskspc );

パラメータ

ID tskid Task ID対象タスクのID
T_TSKSPC* pk_tskspc Packet of Task Spaceタスク固有空間の情報を返す領域へのポインタ

リターンパラメータ

ER ercd Error Codeエラーコード

pk_tskspc の内容

void* uatb Address of Task Space Page Tableタスク固有空間ページテーブルのアドレス
INT lsid Logical Space IDタスク固有空間ID(論理空間ID)

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_PAR パラメータエラー(pk_tskspc が不正)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_TASKSPACE タスク固有空間関連機能が利用可能

解説

tskid のタスクの現在のタスク固有空間情報を取得する。

tskidTSK_SELF=0で自タスクを指定することができる。ただし、タスク独立部から発行したシステムコールで tskidTSK_SELF=0を指定した場合には、E_ID のエラーとなる。

補足事項

pk_tskspc の内容(uatb, lsid)の正確な定義は、実装定義である。ただし、できる限り上記の定義に沿うよう実装すること。

μT-Kernel 1.0との差異

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

tk_set_tsp - タスク固有空間の設定

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_set_tsp (ID tskid , CONST T_TSKSPC *pk_tskspc );

パラメータ

ID tskid Task ID対象タスクのID
CONST T_TSKSPC* pk_tskspc Packet of Task Spaceタスク固有空間の情報

pk_tskspc の内容

void* uatb Address of Task Space Page Tableタスク固有空間ページテーブルのアドレス
INT lsid Logical Space IDタスク固有空間ID(論理空間ID)

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_PAR パラメータエラー(pk_tskspc が不正)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_TASKSPACE タスク固有空間関連機能が利用可能

解説

tskid のタスクのタスク固有空間を設定する。

tskidTSK_SELF=0で自タスクを指定することができる。ただし、タスク独立部から発行したシステムコールで tskidTSK_SELF=0を指定した場合には、E_ID のエラーとなる。

タスクの固有空間を変更したことによる影響は、カーネルは関知しない。例えば、タスク固有空間を実行中のタスクに対してタスク固有空間を変更すると、そのタスクが暴走するなどの可能性がある。このような問題が起きないようにするのは、呼出側の責任である。

補足事項

pk_tskspc の内容(uatb, lsid)の正確な定義は、実装定義である。ただし、できる限り上記の定義に沿うよう実装すること。

μT-Kernel 1.0との差異

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

tk_get_rid - タスクの所属リソースグループの参照

C言語インタフェース

#include <tk/tkernel.h>

ID resid = tk_get_rid (ID tskid );

パラメータ

ID tskid Task ID対象タスクのID

リターンパラメータ

ID resid Resource IDリソースID
またはError Codeエラーコード

エラーコード

E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_OBJ 所属リソースグループが存在しない

利用可能なコンテキスト

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

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

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

TK_SUPPORT_RESOURCE リソースグループが利用可能

解説

tskid のタスクが現在所属しているリソースグループのリソースIDを返す。

tskidTSK_SELF=0で自タスクを指定することができる。ただし、タスク独立部から発行したシステムコールで tskidTSK_SELF=0を指定した場合には、E_ID のエラーとなる。

補足事項

リソースグループについては「サブシステム管理機能」を参照。

所属しているリソースグループが削除されていた場合にも、削除されたリソースIDを返す場合がある。エラー(E_OBJ)を返すか否かは実装に依存する。(tk_cre_res, tk_del_res 参照)

本システムコールは、サブシステムで利用する。サブシステムは、リソースIDによってプロセスを認識している。しかしながら、アプリケーションから拡張SVCを発行してサブシステムに処理を実行させる場合、リソースIDを指定することはできない。そこでサブシステムでは本システムコールを利用してリソースIDを取得する。

μT-Kernel 1.0との差異

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

tk_set_rid - タスクの所属リソースグループの設定

C言語インタフェース

#include <tk/tkernel.h>

ID oldid = tk_set_rid (ID tskid , ID resid );

パラメータ

ID tskid Task ID対象タスクのID
ID resid Resource ID新リソースID

リターンパラメータ

ID oldid Old Resource ID旧リソースID
またはError Codeエラーコード

エラーコード

E_ID 不正ID番号(tskid, resid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid, resid のオブジェクトが存在しない)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_RESOURCE リソースグループが利用可能

解説

tskid のタスクが現在所属しているリソースグループを resid のリソースグループに変更する。戻値に変更前のリソースグループのリソースIDを返す。

tskidTSK_SELF=0で自タスクを指定することができる。ただし、タスク独立部から発行したシステムコールで tskidTSK_SELF=0を指定した場合には、E_ID のエラーとなる。

補足事項

リソースグループについては「サブシステム管理機能」を参照。

resid がすでに削除されたリソースグループであっても、エラーとならない場合がある。エラー(E_NOEXS)となるか否かは実装依存である。原則として、削除されたリソースグループを指定しないようにするのは、呼出側の責任となる。

μT-Kernel 1.0との差異

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

tk_get_reg - タスクレジスタの取得

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_get_reg (ID tskid , T_REGS *pk_regs , T_EIT *pk_eit , T_CREGS *pk_cregs );

パラメータ

ID tskid Task ID対象タスクのID
T_REGS* pk_regs Packet of Registers汎用レジスタの値を返す領域へのポインタ
T_EIT* pk_eit Packet of EIT Registers例外時に保存されるレジスタの値を返す領域へのポインタ
T_CREGS* pk_cregs Packet of Control Registers制御レジスタの値を返す領域へのポインタ

リターンパラメータ

ER ercd Error Codeエラーコード

T_REGS, T_EIT, T_CREGSの内容は、CPUおよび実装ごとに定義する。

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_OBJ オブジェクトの状態が不正(対象タスクが自タスク)
E_CTX コンテキストエラー(タスク独立部からの発行)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_REGOPS タスクレジスタ操作関連機能が利用可能

解説

tskid のタスクの現在のレジスタの内容を参照する。

pk_regs, pk_eit, pk_cregs にそれぞれ NULL を指定すると、対応するレジスタは参照されない。

参照されたレジスタの値が、タスク部実行中のものであるとは限らない。

自タスクに対して本システムコールを発行することはできない。(E_OBJ)

補足事項

参照可能なレジスタは、タスクのコンテキストに含まれるすべてのレジスタを原則とする。また、CPUに物理的に存在するレジスタ以外に、カーネルが仮想的にレジスタとして扱っているものがあればそれも含まれる。

tk_set_reg - タスクレジスタの設定

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_set_reg (ID tskid , CONST T_REGS *pk_regs , CONST T_EIT *pk_eit , CONST T_CREGS *pk_cregs );

パラメータ

ID tskid Task ID対象タスクのID
CONST T_REGS* pk_regs Packet of Registers汎用レジスタ
CONST T_EIT* pk_eit Packet of EIT Registers例外時に保存されるレジスタ
CONST T_CREGS* pk_cregs Packet of Control Registers制御レジスタ

T_REGS, T_EIT, T_CREGSの内容は、CPUおよび実装ごとに定義する。

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_OBJ オブジェクトの状態が不正(対象タスクが自タスク)
E_CTX コンテキストエラー(タスク独立部からの発行)
E_PAR 設定するレジスタ値が不正(実装依存)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_REGOPS タスクレジスタ操作関連機能が利用可能

解説

tskid のタスクのレジスタを指定の内容に設定する。

pk_regs, pk_eit, pk_cregs にそれぞれ NULL を指定すると、対応するレジスタは設定されない。

設定するレジスタの値が、タスク部実行中のものであるとは限らない。レジスタの値を設定したことによる影響には、カーネルは関知しない。

ただし、カーネルの動作上変更が許されないレジスタやレジスタ内の一部のビットが変更できないようになっている場合がある。(実装依存)

自タスクに対して本システムコールを発行することはできない。(E_OBJ)

tk_get_cpr - コプロセッサのレジスタの取得

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_get_cpr (ID tskid , INT copno , T_COPREGS *pk_copregs );

パラメータ

ID tskid Task ID対象タスクのID
INT copno Coprocessor Numberコプロセッサ番号(0~3)
T_COPREGS* pk_copregs Packet of Coprocessor Registersコプロセッサのレジスタの値を返す領域へのポインタ

リターンパラメータ

ER ercd Error Codeエラーコード

pk_copregs の内容

T_COP0REG cop0 Coprocessor Number 0 Registerコプロセッサ番号0のレジスタ
T_COP1REG cop1 Coprocessor Number 1 Registerコプロセッサ番号1のレジスタ
T_COP2REG cop2 Coprocessor Number 2 Registerコプロセッサ番号2のレジスタ
T_COP3REG cop3 Coprocessor Number 3 Registerコプロセッサ番号3のレジスタ

T_COPnREGの内容は、CPUおよび実装ごとに定義する。

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_OBJ オブジェクトの状態が不正(対象タスクが自タスク)
E_CTX コンテキストエラー(タスク独立部からの発行)
E_PAR パラメータエラー(copno が不正または指定のコプロセッサは存在しない)

利用可能なコンテキスト

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

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

TK_SUPPORT_COPn 番号nのコプロセッサが利用可能

なお、すべてのnについてTK_SUPPORT_COPnが無効である場合、本APIはサポートされない。

解説

tskid のタスクの copno で指定したコプロセッサの現在のレジスタ内容を参照する。

参照されたレジスタの値が、タスク部実行中のものであるとは限らない。

自タスクに対して本システムコールを発行することはできない。(E_OBJ)

補足事項

参照可能なレジスタは、タスクのコンテキストに含まれるすべてのレジスタを原則とする。また、CPUに物理的に存在するレジスタ以外に、カーネルが仮想的にレジスタとして扱っているものがあればそれも含まれる。

μT-Kernel 1.0との差異

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

tk_set_cpr - コプロセッサのレジスタの設定

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_set_cpr (ID tskid , INT copno , CONST T_COPREGS *pk_copregs );

パラメータ

ID tskid Task ID対象タスクのID
INT copno Coprocessor Numberコプロセッサ番号(0~3)
CONST T_COPREGS* pk_copregs Packet of Coprocessor Registersコプロセッサのレジスタ

pk_copregs の内容

T_COP0REG cop0 Coprocessor Number 0 Registerコプロセッサ番号0のレジスタ
T_COP1REG cop1 Coprocessor Number 1 Registerコプロセッサ番号1のレジスタ
T_COP2REG cop2 Coprocessor Number 2 Registerコプロセッサ番号2のレジスタ
T_COP3REG cop3 Coprocessor Number 3 Registerコプロセッサ番号3のレジスタ

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_OBJ オブジェクトの状態が不正(対象タスクが自タスク)
E_CTX コンテキストエラー(タスク独立部からの発行)
E_PAR パラメータエラー(copno が不正または指定のコプロセッサは存在しない)、設定するレジスタ値が不正(実装依存)

利用可能なコンテキスト

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

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

TK_SUPPORT_COPn 番号nのコプロセッサが利用可能

なお、すべてのnについてTK_SUPPORT_COPnが無効である場合、本APIはサポートされない。

解説

tskid のタスクの copno で指定したコプロセッサのレジスタに指定の内容を設定する。

設定するレジスタの値が、タスク部実行中のものであるとは限らない。レジスタの値を設定したことによる影響には、カーネルは関知しない。

ただし、カーネルの動作上変更が許されないレジスタやレジスタ内の一部のビットが変更できないようになっている場合がある。(実装依存)

自タスクに対して本システムコールを発行することはできない。(E_OBJ)

μT-Kernel 1.0との差異

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

tk_inf_tsk - タスク統計情報参照

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_inf_tsk (ID tskid , T_ITSK *pk_itsk , BOOL clr );

パラメータ

ID tskid Task IDタスクID
T_ITSK* pk_itsk Packet to Refer Task Statisticsタスク統計情報を返す領域へのポインタ
BOOL clr Clearタスク統計情報のクリアの有無

リターンパラメータ

ER ercd Error Codeエラーコード

pk_itsk の内容

RELTIM stime System Time累積システムレベル実行時間(ミリ秒)
RELTIM utime User Time累積ユーザレベル実行時間(ミリ秒)
──(以下に実装独自に他の情報を追加してもよい)──

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_PAR パラメータエラー(pk_itsk が不正)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_TASKINF タスク統計情報の取得機能が利用可能

解説

tskid で示された対象タスクの統計情報を参照する。

clrTRUE≠0の場合は、統計情報を取り出した後、累積時間をリセット(0クリア)する。

tskidTSK_SELF=0によって自タスクの指定を行うことができる。ただし、タスク独立部から発行したシステムコールで tskidTSK_SELF=0を指定した場合には、E_ID のエラーとなる。

タスク統計情報(T_ITSK)の stime, utime は、ミリ秒単位に切り上げた値(単位ミリ秒)を返す。マイクロ秒単位の情報を知りたい場合には、tk_inf_tsk_u を使う。

補足事項

システムレベル実行時間は TA_RNG0 で実行していた時間、ユーザレベル実行時間は TA_RNG0 以外で実行していた時間である。したがって、TA_RNG0 で生成されたタスクは、すべてシステムレベル実行時間としてカウントされることになる。

実行時間のカウント方法は実装依存だが、それほど高い精度は要求されない。逆に、アプリケーションは高い精度を期待してはいけない。

μT-Kernel 1.0との差異

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

tk_inf_tsk_u - タスク統計情報参照(マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_inf_tsk_u (ID tskid , T_ITSK_U *pk_itsk_u , BOOL clr );

パラメータ

ID tskid Task IDタスクID
T_ITSK_U* pk_itsk_u Packet to Refer Task Statisticsタスク統計情報を返す領域へのポインタ
BOOL clr Clearタスク統計情報のクリアの有無

リターンパラメータ

ER ercd Error Codeエラーコード

pk_itsk_u の内容

RELTIM_U stime_u System Time累積システムレベル実行時間(マイクロ秒)
RELTIM_U utime_u User Time累積ユーザレベル実行時間(マイクロ秒)
──(以下に実装独自に他の情報を追加してもよい)──

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_PAR パラメータエラー(pk_itsk_u が不正)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_TASKINF タスク統計情報の取得機能が利用可能
TK_SUPPORT_USEC マイクロ秒命令をサポート

解説

tk_inf_tsk のリターンパラメータである stimeutime を64ビットマイクロ秒単位の stime_u, utime_u としたシステムコールである。

リターンパラメータが stime_u, utime_u となった点を除き、本システムコールの仕様は tk_inf_tsk と同じである。詳細は tk_inf_tsk の説明を参照のこと。

μT-Kernel 1.0との差異

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

tk_ref_tsk - タスク状態参照

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_ref_tsk (ID tskid , T_RTSK *pk_rtsk );

パラメータ

ID tskid Task IDタスクID
T_RTSK* pk_rtsk Packet to Refer Task Statusタスク状態を返す領域へのポインタ

リターンパラメータ

ER ercd Error Codeエラーコード

pk_rtsk の内容

void* exinf Extended Information拡張情報
PRI tskpri Task Priority現在の優先度
PRI tskbpri Task Base Priorityベース優先度
UINT tskstat Task Stateタスク状態
UW tskwait Task Wait Factor待ち要因
ID wid Waiting Object ID待ちオブジェクトID
INT wupcnt Wakeup Count起床要求キューイング数
INT suscnt Suspend Count強制待ち要求ネスト数
RELTIM slicetime Slice Time最大連続実行時間(ミリ秒)
UW waitmask Wait Mask待ちを禁止されている待ち要因
UINT texmask Task Exception Mask許可されているタスク例外
UINT tskevent Task Event発生しているタスクイベント
──(以下に実装独自に他の情報を追加してもよい)──

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_PAR パラメータエラー(pk_rtsk が不正)

利用可能なコンテキスト

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

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

TK_SUPPORT_SLICETIME スライスタイム(slicetime)の取得が可能
TK_SUPPORT_DISWAI 待ち禁止状態に関する情報(waitmask)の取得が可能
TK_SUPPORT_TASKEXCEPTION タスク例外情報(texmask)の取得が可能
TK_SUPPORT_TASKEVENT タスクイベント発生情報(tskevent)の取得が可能

解説

tskid で示された対象タスクの各種の状態を参照する。

tskstat は次のような値をとる。

TTS_RUN 0x0001実行状態(RUNNING)
TTS_RDY 0x0002実行可能状態(READY)
TTS_WAI 0x0004待ち状態(WAITING)
TTS_SUS 0x0008強制待ち状態(SUSPENDED)
TTS_WAS 0x000c二重待ち状態(WAITING-SUSPENDED)
TTS_DMT 0x0010休止状態(DORMANT)
TTS_NODISWAI 0x0080待ち禁止拒否状態

TTS_RUN, TTS_WAI などによるタスク状態の表現はビット対応になっているため、和集合の判定を行う(例えば、実行状態(RUNNING)または実行可能状態(READY)であることを判定する)場合に便利である。なお、上記の状態のうち、TTS_WASTTS_SUSTTS_WAI が複合したものであるが、TTS_SUS がこれ以外の状態(TTS_RUN, TTS_RDY, TTS_DMT)と複合することはない。

TTS_WAI(TTS_WAS 含む)の場合、tk_dis_wai による待ち禁止を拒否している状態であれば、TTS_NODISWAI がセットされる。TTS_WAI 以外と TTS_NODISWAI が組み合わされることはない。

割込みハンドラの中から、割り込まれたタスクを対象とした tk_ref_tsk を実行した場合は、tskstat として実行状態(RUNNING)(TTS_RUN)を返す。

tskstatTTS_WAI(TTS_WAS を含む)の場合、tskwait, wid表2のような値をとる。

表 2. tskwaitwid の値

tskwait 意味 wid
TTW_SLP 0x00000001 tk_slp_tsk による待ち0
TTW_DLY 0x00000002 tk_dly_tsk による待ち0
TTW_SEM 0x00000004 tk_wai_sem による待ち待ち対象の semid
TTW_FLG 0x00000008 tk_wai_flg による待ち待ち対象の flgid
TTW_MBX 0x00000040 tk_rcv_mbx による待ち待ち対象の mbxid
TTW_MTX 0x00000080 tk_loc_mtx による待ち待ち対象の mtxid
TTW_SMBF 0x00000100 tk_snd_mbf による待ち待ち対象の mbfid
TTW_RMBF 0x00000200 tk_rcv_mbf による待ち待ち対象の mbfid
TTW_CAL 0x00000400ランデブ呼出待ち待ち対象の porid
TTW_ACP 0x00000800ランデブ受付待ち待ち対象の porid
TTW_RDV 0x00001000ランデブ終了待ち0
(TTW_CAL | TTW_RDV)0x00001400ランデブ呼出または終了待ち0
TTW_MPF 0x00002000 tk_get_mpf による待ち待ち対象の mpfid
TTW_MPL 0x00004000 tk_get_mpl による待ち待ち対象の mplid
TTW_EV1 0x00010000タスクイベント#1待ち0
TTW_EV2 0x00020000タスクイベント#2待ち0
TTW_EV3 0x00040000タスクイベント#3待ち0
TTW_EV4 0x00080000タスクイベント#4待ち0
TTW_EV5 0x00100000タスクイベント#5待ち0
TTW_EV6 0x00200000タスクイベント#6待ち0
TTW_EV7 0x00400000タスクイベント#7待ち0
TTW_EV8 0x00800000タスクイベント#8待ち0

tskstatTTS_WAI (TTS_WAS を含む) でない場合は、tskwait, wid はともに0となる。

waitmask は、tskwait と同じビット並びとなる。

texmask は、許可されている各タスク例外を1<<タスク例外コードのビット値として、論理和(OR)した値である。

tskevent は、発生している各タスクイベントを1<<(タスクイベント番号-1)のビット値として論理和(OR)した値である。

休止状態(DORMANT)のタスクでは wupcnt=0, suscnt=0, tskevent=0 である。

tskidTSK_SELF=0によって自タスクの指定を行うことができる。ただし、タスク独立部から発行したシステムコールで tskidTSK_SELF=0を指定した場合には、E_ID のエラーとなる。

tk_ref_tsk で、対象タスクが存在しない場合には、エラー E_NOEXS となる。

タスク状態情報(T_RTSK)の slicetime は、ミリ秒単位に切り上げた値(単位ミリ秒)を返す。マイクロ秒単位の情報を知りたい場合には、tk_ref_tsk_u を使う。

補足事項

このシステムコールで tskidTSK_SELF を指定した場合でも、自タスクのIDは分からない。自タスクのIDを知りたい場合には、tk_get_tid を利用する。

T-Kernel 2.0との差異

T_RTSKのメンバtskwaitwaitmaskの型がUINTからUWに変更されている。

μT-Kernel 1.0との差異

サービスプロファイルの導入により、μT-Kernelの仕様から除外されていたスライスタイム(slicetime)、待ち禁止状態に関する情報(waitmask)、タスク例外情報(texmask)、タスクイベント発生情報(tskevent)の取得が、プロファイルの制約に従う範囲で可能となった。

tk_ref_tsk_u - タスク状態参照(マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_ref_tsk_u (ID tskid , T_RTSK_U *pk_rtsk_u );

パラメータ

ID tskid Task IDタスクID
T_RTSK_U* pk_rtsk_u Packet to Refer Task Statusタスク状態を返す領域へのポインタ

リターンパラメータ

ER ercd Error Codeエラーコード

pk_rtsk_u の内容

void* exinf Extended Information拡張情報
PRI tskpri Task Priority現在の優先度
PRI tskbpri Task Base Priorityベース優先度
UINT tskstat Task Stateタスク状態
UW tskwait Task Wait Factor待ち要因
ID wid Waiting Object ID待ちオブジェクトID
INT wupcnt Wakeup Count起床要求キューイング数
INT suscnt Suspend Count強制待ち要求ネスト数
RELTIM_U slicetime_u Slice Time最大連続実行時間(マイクロ秒)
UW waitmask Wait Mask待ちを禁止されている待ち要因
UINT texmask Task Exception Mask許可されているタスク例外
UINT tskevent Task Event発生しているタスクイベント
──(以下に実装独自に他の情報を追加してもよい)──

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_PAR パラメータエラー(pk_rtsk_u が不正)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_USEC マイクロ秒命令をサポート

その他の関連するサービスプロファイルについては、tk_ref_tsk と同様である。

解説

tk_ref_tsk のリターンパラメータである slicetime を64ビットマイクロ秒単位の slicetime_u としたシステムコールである。

リターンパラメータが slicetime_u となった点を除き、本システムコールの仕様は tk_ref_tsk と同じである。詳細は tk_ref_tsk の説明を参照のこと。

T-Kernel 2.0との差異

T_RTSKのメンバtskwaitwaitmaskの型がUINTからUWに変更されている。

μT-Kernel 1.0との差異

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