ユーティリティ機能は、μT-Kernel上のアプリケーション、ミドルウェア、デバイスドライバなどプログラム全般から利用される共通性の高い機能である。
ユーティリティ機能は、ライブラリ関数またはC言語のマクロで提供される。
オブジェクト名設定のAPIは、C言語のマクロで提供され、タスク独立部およびディスパッチ禁止・割込み禁止の状態から呼び出すことができる。
なし
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番を使って排他制御を行う方法も可能である。前者の方がより高速になるが、必要リソースの合計は後者の方が少なくて済む。
補足事項 | |
---|---|
高速ロックの機能は、ロックの状態を示すカウンタとセマフォにより実装される。また、高速マルチロックの機能は、ロックの状態を示すカウンタとイベントフラグにより実装される。ロック獲得時に待ちに入らない場合は、カウンタ操作のみを行うため、通常のセマフォやイベントフラグよりも高速に処理される。一方、ロック獲得時に待ちに入る場合は、通常のセマフォやイベントフラグの機能を使って待ち状態への移行や待ち行列の管理を行うため、セマフォやイベントフラグより高速というわけではない。高速ロック・マルチロックの機能が有効なのは、排他制御の際に待ちに入る可能性が低い場合である。 |
高速ロックを生成する。
lock
は高速ロックの管理のための構造体である。name
は高速ロックに付ける名前であるが、NULL でもよい。
高速ロックは排他制御のためのバイナリセマフォであり、なるべく高速に操作できるように実装されている。
なし
高速ロックに対してロックの操作を行う。
既にロックされていれば、ロック解除されるまで自タスクは待ち状態となり、待ち行列につながれる。待ち行列はタスク優先度順である。
高速化のため、エラーの検出は行わない。
高速マルチロックを生成する。
lock
は高速マルチロックの管理のための構造体である。name
は高速マルチロックに付ける名前であるが、NULL でもよい。
高速マルチロックは、排他制御のための独立したバイナリセマフォを複数個並べたものであり、なるべく高速に操作できるように実装されている。バイナリセマフォの数はUINT型のビット幅に一致するものとし、0番から(UINT型のビット幅 - 1)番のロック番号により指定する。例えばUINTが16ビットの環境では、0番~15番のロック番号が指定できる。
指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。
高速マルチロックに対してロックの操作を行う。
no
はロック番号で、0~(UINT型のビット幅 - 1)を使用できる。例えばUINTが16ビットの環境では、0番~15番のロック番号が指定できる。
既に同じロック番号でロックされていれば、同じロック番号でロック解除されるまで自タスクは待ち状態となり、待ち行列につながれる。待ち行列はタスク優先度順である。
指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。
高速マルチロックに対して、タイムアウト指定付きのロックの操作を行う。
tmout
でタイムアウト時間の指定ができる点以外は、MLock と同じである。tmout
で指定した時間が経過してもロックの獲得ができない場合は、E_TMOUT を返す。
指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。
指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。
高速マルチロックに対してロック解除操作を行う。
no
はロック番号で、0~(UINT型のビット幅 - 1)を使用できる。例えばUINTが16ビットの環境では、0番~15番のロック番号が指定できる。
同じロック番号に対して待ち状態のタスクがあれば、待ち行列の先頭のタスクが新たにロックを獲得する。
指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。