ユーティリティ機能

ユーティリティ機能は、μT-Kernel上のアプリケーション、ミドルウェア、デバイスドライバなどプログラム全般から利用される共通性の高い機能である。

ユーティリティ機能は、ライブラリ関数またはC言語のマクロで提供される。

オブジェクト名設定

オブジェクト名設定のAPIは、C言語のマクロで提供され、タスク独立部およびディスパッチ禁止・割込み禁止の状態から呼び出すことができる。

SetOBJNAME - オブジェクト名設定

C言語インタフェース

#include <tk/tkernel.h>

void SetOBJNAME(void *exinf, CONST UB *name);

パラメータ

void* exinf Extended Information拡張情報を設定する変数
CONST UB* name Object Name設定するオブジェクト名

利用可能なコンテキスト

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

解説

name で指定される4文字以下のASCII文字列を、1つの32ビットデータと解釈して、exinf に格納する。

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

補足事項

本APIを使うことにより、μT-Kernelの各オブジェクトの拡張情報 exinf の中に、個々のオブジェクトに対するASCII文字列の名称(タスク名など)を設定することができる。デバッガ等でオブジェクトの状態を表示する際、exinf の値をASCII文字列として表示することにより、本APIによって設定されたオブジェクトの名称を表示できる。

例 7. SetOBJNAMEの使用例


T_CTSK  ctsk;
...
/* ctskのタスクに "TEST" のオブジェクト名を設定 */
SetOBJNAME(ctsk.exinf, "TEST");
task_id = tk_cre_tsk ( &ctsk );

ただし、C言語の関数でこの文字列を扱う場合には、文字列の終端を表す '\0' を補う必要がある。

高速ロック・マルチロックライブラリ

高速ロック・マルチロックライブラリは、デバイスドライバやサブシステムの中において、複数タスク間の排他制御をより高速に行うためのライブラリである。排他制御を行うには、セマフォやミューテックスを使うこともできるが、高速ロックはμT-Kernel/SMのライブラリ関数として実装されており、待ちに入らない場合のロック獲得の操作を特に高速に処理する。

高速ロック・マルチロックライブラリのうち、高速ロックは、セマフォやミューテックスよりも高速な排他制御用バイナリセマフォである。一方の高速マルチロックは、独立した排他制御用バイナリセマフォを複数個あわせて一つのオブジェクトにしたものである。バイナリセマフォの数はUINT型のビット幅に一致するものとし、0番~(UINT型のビット幅 - 1)番のロック番号で区別する。

たとえば10箇所で排他制御を行う場合、10個の高速ロックを使う方法でもよいが、1個の高速マルチロックを生成し、その中の0番~9番を使って排他制御を行う方法も可能である。前者の方がより高速になるが、必要リソースの合計は後者の方が少なくて済む。

注意補足事項
 

高速ロックの機能は、ロックの状態を示すカウンタとセマフォにより実装される。また、高速マルチロックの機能は、ロックの状態を示すカウンタとイベントフラグにより実装される。ロック獲得時に待ちに入らない場合は、カウンタ操作のみを行うため、通常のセマフォやイベントフラグよりも高速に処理される。一方、ロック獲得時に待ちに入る場合は、通常のセマフォやイベントフラグの機能を使って待ち状態への移行や待ち行列の管理を行うため、セマフォやイベントフラグより高速というわけではない。高速ロック・マルチロックの機能が有効なのは、排他制御の際に待ちに入る可能性が低い場合である。

CreateLock - 高速ロックの生成

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = CreateLock(FastLock *lock, CONST UB *name);

パラメータ

FastLock* lock Control Block of FastLock高速ロックの管理ブロック
CONST UB* name Name of FastLock高速ロックの名前

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_NOMEM メモリ不足(管理ブロック用の領域が確保できない)
E_LIMIT 高速ロックの数がシステムの上限を超えた

利用可能なコンテキスト

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

解説

高速ロックを生成する。

lock は高速ロックの管理のための構造体である。name は高速ロックに付ける名前であるが、NULL でもよい。

高速ロックは排他制御のためのバイナリセマフォであり、なるべく高速に操作できるように実装されている。

DeleteLock - 高速ロックの削除

C言語インタフェース

#include <tk/tkernel.h>

void DeleteLock(FastLock *lock);

パラメータ

FastLock* lock Control Block of FastLock高速ロックの管理ブロック

利用可能なコンテキスト

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

解説

高速ロックを削除する。

高速化のため、エラーの検出は行わない。

Lock - 高速ロックのロック操作

C言語インタフェース

#include <tk/tkernel.h>

void Lock(FastLock *lock);

パラメータ

FastLock* lock Control Block of FastLock高速ロックの管理ブロック

利用可能なコンテキスト

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

解説

高速ロックに対してロックの操作を行う。

既にロックされていれば、ロック解除されるまで自タスクは待ち状態となり、待ち行列につながれる。待ち行列はタスク優先度順である。

高速化のため、エラーの検出は行わない。

Unlock - 高速ロックのロック解除操作

C言語インタフェース

#include <tk/tkernel.h>

void Unlock(FastLock *lock);

パラメータ

FastLock* lock Control Block of FastLock高速ロックの管理ブロック

利用可能なコンテキスト

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

解説

高速ロックに対してロック解除の操作を行う。

対象となる高速ロックを待っているタスクがあれば、待ち行列の先頭のタスクが新たにロックを獲得する。

高速化のため、エラーの検出は行わない。

CreateMLock - 高速マルチロックの生成

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = CreateMLock(FastMLock *lock, CONST UB *name);

パラメータ

FastMLock* lock Control Block of FastMLock高速マルチロックの管理ブロック
CONST UB* name Name of FastMLock高速マルチロックの名前

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_NOMEM メモリ不足(管理ブロック用の領域が確保できない)
E_LIMIT 高速マルチロックの数がシステムの上限を超えた

利用可能なコンテキスト

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

解説

高速マルチロックを生成する。

lock は高速マルチロックの管理のための構造体である。name は高速マルチロックに付ける名前であるが、NULL でもよい。

高速マルチロックは、排他制御のための独立したバイナリセマフォを複数個並べたものであり、なるべく高速に操作できるように実装されている。バイナリセマフォの数はUINT型のビット幅に一致するものとし、0番から(UINT型のビット幅 - 1)番のロック番号により指定する。例えばUINTが16ビットの環境では、0番~15番のロック番号が指定できる。

移植ガイドライン

指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。

DeleteMLock - 高速マルチロックの削除

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = DeleteMLock(FastMLock *lock);

パラメータ

FastMLock* lock Control Block of FastMLock高速マルチロックの管理ブロック

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_PAR パラメータエラー

利用可能なコンテキスト

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

解説

高速マルチロックを削除する。

MLock - 高速マルチロックのロック操作

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = MLock(FastMLock *lock, INT no);

パラメータ

FastMLock* lock Control Block of FastMLock高速マルチロックの管理ブロック
INT no Lock Numberロック番号

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_PAR パラメータエラー
E_DLT 待ちオブジェクトが削除された
E_RLWAI 待ち状態強制解除
E_CTX コンテキストエラー

利用可能なコンテキスト

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

解説

高速マルチロックに対してロックの操作を行う。

no はロック番号で、0~(UINT型のビット幅 - 1)を使用できる。例えばUINTが16ビットの環境では、0番~15番のロック番号が指定できる。

既に同じロック番号でロックされていれば、同じロック番号でロック解除されるまで自タスクは待ち状態となり、待ち行列につながれる。待ち行列はタスク優先度順である。

移植ガイドライン

指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。

MLockTmo - 高速マルチロックのロック操作(タイムアウト指定付き)

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = MLockTmo(FastMLock *lock, INT no, TMO tmout);

パラメータ

FastMLock* lock Control Block of FastMLock高速マルチロックの管理ブロック
INT no Lock Numberロック番号
TMO tmout Timeoutタイムアウト指定(ミリ秒)

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_PAR パラメータエラー
E_DLT 待ちオブジェクトが削除された
E_RLWAI 待ち状態強制解除
E_TMOUT タイムアウト
E_CTX コンテキストエラー

利用可能なコンテキスト

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

解説

高速マルチロックに対して、タイムアウト指定付きのロックの操作を行う。

tmout でタイムアウト時間の指定ができる点以外は、MLock と同じである。tmout で指定した時間が経過してもロックの獲得ができない場合は、E_TMOUT を返す。

移植ガイドライン

指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。

MLockTmo_u - 高速マルチロックのロック操作(タイムアウト指定付き、マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = MLockTmo_u(FastMLock *lock, INT no, TMO_U tmout_u);

パラメータ

FastMLock* lock Control Block of FastMLock高速マルチロックの管理ブロック
INT no Lock Numberロック番号
TMO_U tmout_u Timeoutタイムアウト指定(マイクロ秒)

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_PAR パラメータエラー
E_DLT 待ちオブジェクトが削除された
E_RLWAI 待ち状態強制解除
E_TMOUT タイムアウト
E_CTX コンテキストエラー

利用可能なコンテキスト

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

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

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

TK_SUPPORT_USEC マイクロ秒のサポート

解説

高速マルチロックに対して、マイクロ秒単位のタイムアウト指定付きのロックの操作を行う。

タイムアウト時間の指定が64ビットのマイクロ秒単位になる点以外は、MLockTmo と同じである。

移植ガイドライン

指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。

MUnlock - 高速マルチロックのロック解除操作

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = MUnlock(FastMLock *lock, INT no);

パラメータ

FastMLock* lock Control Block of FastMLock高速マルチロックの管理ブロック
INT no Lock Numberロック番号

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了

利用可能なコンテキスト

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

解説

高速マルチロックに対してロック解除操作を行う。

no はロック番号で、0~(UINT型のビット幅 - 1)を使用できる。例えばUINTが16ビットの環境では、0番~15番のロック番号が指定できる。

同じロック番号に対して待ち状態のタスクがあれば、待ち行列の先頭のタスクが新たにロックを獲得する。

移植ガイドライン

指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。