タスク付属同期機能

タスク付属同期機能は、タスクの状態を直接的に操作することによって同期を行うための機能である。タスクを起床待ちにする機能とそこから起床する機能、タスクの起床要求をキャンセルする機能、タスクの待ち状態を強制解除する機能、タスクを強制待ち状態へ移行する機能とそこから再開する機能、自タスクの実行を遅延する機能、タスクイベントに関する機能、タスクの待ち状態を禁止する機能が含まれる。

タスクに対する起床要求は、キューイングされる。すなわち、起床待ち状態でないタスクを起床しようとすると、そのタスクを起床しようとしたという記録が残り、後でそのタスクが起床待ちに移行しようとした時に、タスクを起床待ち状態にしない。タスクに対する起床要求のキューイングを実現するために、タスクは起床要求キューイング数を持つ。タスクの起床要求キューイング数は、タスクの起動時に0にクリアする。

タスクに対する強制待ち要求は、ネストされる。すなわち、すでに強制待ち状態(二重待ち状態を含む)になっているタスクを再度強制待ち状態に移行させようとすると、そのタスクを強制待ち状態に移行させようとしたという記録が残り、後でそのタスクを強制待ち状態(二重待ち状態を含む)から再開させようとした時に、強制待ちからの再開を行わない。タスクに対する強制待ち要求のネストを実現するために、タスクは強制待ち要求ネスト数を持つ。タスクの強制待ち要求ネスト数は、タスクの起動時に0にクリアする。

tk_slp_tsk - 自タスクを起床待ち状態へ移行

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_slp_tsk (TMO tmout );

パラメータ

TMO tmout Timeoutタイムアウト指定(ミリ秒)

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_PAR パラメータエラー(tmout≦(-2))
E_RLWAI 待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
E_DISWAI 待ち禁止による待ち解除
E_TMOUT ポーリング失敗またはタイムアウト
E_CTX コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)

利用可能なコンテキスト

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

解説

tk_slp_tsk システムコールでは、自タスクを実行状態(RUNNING)から起床待ち状態(tk_wup_tsk を待つ状態)に移す。ただし、自タスクに対する起床要求がキューイングされている場合、具体的には自タスクの起床要求キューイング数が1以上の場合には、起床要求キューイング数から1を減じ、自タスクを待ち状態に移行させず、そのまま実行を継続する。

tmout で指定した時間が経過する前にこのタスクを対象とした tk_wup_tsk が発行された場合は、このシステムコールは正常終了する。一方、tmout で指定した時間が経過する間に tk_wup_tsk が発行されなかった場合は、タイムアウトエラー E_TMOUT となる。なお、tmoutTMO_FEVR=(-1)により、タイムアウトまでの時間が無限大であることを示す。この場合は、tk_wup_tsk が発行されるまで永久に待ち状態になる。

補足事項

tk_slp_tsk は自タスクを待ち状態に移すシステムコールであるため、tk_slp_tsk がネストすることはあり得ない。しかし、tk_slp_tsk によって待ち状態になっているタスクに対して、他のタスクから tk_sus_tsk が実行される可能性はある。この場合、このタスクは二重待ち状態(WAITING-SUSPENDED)となる。

タスクの単純な遅延(時間待ち)を行うのであれば、tk_slp_tsk ではなく、tk_dly_tsk を用いるべきである。

タスク起床待ちはアプリケーションでの利用を前提とし、ミドルウェアでは原則として使用してはいけない。これは、次の理由による。

同一タスクにおいて、2ヵ所以上でタスク起床待ちによる同期を行うと、起床要求が混同してしまい誤動作することになる。例えば、アプリケーションとミドルウェアの双方で起床待ちによる同期を利用していた場合、ミドルウェア内で起床待ちしている間に、アプリケーションが起床要求してしまうことがありえる。このような状況になれば、ミドルウェアもアプリケーションも正常な動作はできなくなる。

このように、どこで起床待ちしているかなどの状況がわからないと、正しいタスクの同期ができなくなる。タスク起床待ちによるタスクの同期は簡便な方法としてよく利用されるため、アプリケーションで自由に利用できることを確保するために、ミドルウェアでは使用しないことを原則とする。

tk_slp_tsk_u - 自タスクを起床待ち状態へ移行(マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_slp_tsk_u (TMO_U tmout_u );

パラメータ

TMO_U tmout_u Timeoutタイムアウト指定(マイクロ秒)

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_PAR パラメータエラー(tmout_u≦(-2))
E_RLWAI 待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
E_DISWAI 待ち禁止による待ち解除
E_TMOUT ポーリング失敗またはタイムアウト
E_CTX コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)

利用可能なコンテキスト

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

解説

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

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

T-Kernel 1.0との差異

T-Kernel 2.0で追加されたシステムコールである。

tk_wup_tsk - 他タスクの起床

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_wup_tsk (ID tskid );

パラメータ

ID tskid Task IDタスクID

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_OBJ オブジェクトの状態が不正(対象タスクが自タスクまたは休止状態(DORMANT))
E_QOVR キューイングまたはネストのオーバーフロー(キューイング数 wupcnt のオーバーフロー)

利用可能なコンテキスト

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

解説

tskid で示されるタスクが tk_slp_tsk の実行による待ち状態であった場合に、その待ち状態を解除する。

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

対象タスクが tk_slp_tsk を実行しておらず、待ち状態でない場合には、tk_wup_tsk による起床要求はキューイングされる。すなわち、対象タスクに対して tk_wup_tsk が発行されたという記録が残り、この後で対象タスクが tk_slp_tsk を実行した場合にも、待ち状態にはならない。これを起床要求のキューイングと呼ぶ。

起床要求のキューイングの動作は、具体的には次のようになる。各タスクは、TCBの中に起床要求キューイング数(wupcnt)という状態を持っており、その初期値(tk_sta_tsk 実行時の値)は0である。起床待ち状態でないタスクに対して tk_wup_tsk を実行することにより、対象タスクの起床要求キューイング数がプラス1される。一方、タスクが tk_slp_tsk を実行することにより、そのタスクの起床要求キューイング数がマイナス1される。そうして、起床要求キューイング数=0のタスクが tk_slp_tsk を実行した時に、起床要求キューイング数がマイナスになる代わりに、そのタスクが待ち状態になる。

tk_wup_tsk を1回キューイングすること(wupcnt=1)は常に可能であるが、起床要求キューイング数(wupcnt)の最大値は実装依存であり、1以上の適当な値をとる。すなわち、待ち状態でないタスクに対して tk_wup_tsk を1回発行してもエラーとはならないが、2回目以降の tk_wup_tsk がエラーとなるかどうかは実装依存である。

起床要求キューイング数(wupcnt)の最大値の制限を越えて tk_wup_tsk を発行した場合には、E_QOVR のエラーとなる。

tk_can_wup - タスクの起床要求を無効化

C言語インタフェース

#include <tk/tkernel.h>

INT wupcnt = tk_can_wup (ID tskid );

パラメータ

ID tskid Task IDタスクID

リターンパラメータ

INT wupcnt Wakeup Countキューイングされていた起床要求回数
またはError Codeエラーコード

エラーコード

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

利用可能なコンテキスト

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

解説

tskid で示されたタスクの起床要求キューイング数(wupcnt)をリターンパラメータとして返し、同時にその起床要求をすべてキャンセルする。すなわち、対象タスクの起床要求キューイング数(wupcnt)を0にする。

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

補足事項

このシステムコールは、周期的にタスクを起床して動かすような処理を行う場合に、時間内に処理が終わっているかどうかを判定するために利用できる。すなわち、前の起床要求に対する処理が終了して tk_slp_tsk を発行する前に、それを監視するタスクが tk_can_wup を発行し、そのリターンパラメータである wupcnt が1以上の値であった場合、前の起床要求に対する処理が時間内に終了しなかったということを示す。したがって、処理の遅れに対して何らかの処置をとることができる。

tk_rel_wai - 他タスクの待ち状態解除

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_rel_wai (ID tskid );

パラメータ

ID tskid Task IDタスクID

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

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

利用可能なコンテキスト

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

解説

tskid で示されるタスクが何らかの待ち状態(強制待ち状態(SUSPENDED)を除く)にある場合に、それを強制的に解除する。

tk_rel_wai により待ち状態が解除されたタスクに対しては、エラー E_RLWAI が返る。このとき、対象タスクは資源を確保せずに(待ち解除の条件が満たされないまま)待ち解除となることが保証される。

tk_rel_wai では、待ち状態解除要求のキューイングは行わない。すなわち、tskid で示される対象タスクが既に待ち状態であればその待ち状態を解除するが、対象タスクが待ち状態でなければ、発行元にエラー E_OBJ が返る。本システムコールで自タスクを指定した場合にも、同様に E_OBJ のエラーとなる。

tk_rel_wai では、強制待ち状態(SUSPENDED)の解除は行わない。二重待ち状態(WAITING-SUSPENDED)のタスクを対象として tk_rel_wai を発行すると、対象タスクは強制待ち状態(SUSPENDED)となる。強制待ち状態(SUSPENDED)も解除する必要がある場合には、別に tk_rsm_tsk または tk_frsm_tsk を発行する。

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

表 3. tk_rel_waiの対象タスクの状態と実行結果

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

補足事項

アラームハンドラ等を用いて、あるタスクが待ち状態に入ってから一定時間後にこのシステムコールを発行することにより、タイムアウトに類似した機能を実現することができる。

tk_rel_waitk_wup_tsk とは次のような違いがある。

  • tk_wup_tsktk_slp_tsk による待ち状態のみを解除するが、tk_rel_wai ではそれ以外の要因(tk_wai_flg, tk_wai_sem, tk_rcv_mbx, tk_get_mpl, tk_dly_tsk 等) による待ち状態も解除する。

  • 待ち状態に入っていたタスクから見ると、tk_wup_tsk による待ち状態の解除は正常終了(E_OK)であるのに対して、tk_rel_wai による待ち状態の解除はエラー(E_RLWAI)である。

  • tk_wup_tsk の場合は、対象タスクがまだ tk_slp_tsk を実行していなくても、要求がキューイングされる。一方、tk_rel_wai の場合は、対象タスクが既に待ち状態に無い場合には、E_OBJ のエラーとなる。

tk_sus_tsk - 他タスクを強制待ち状態へ移行

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_sus_tsk (ID tskid );

パラメータ

ID tskid Task IDタスクID

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_OBJ オブジェクトの状態が不正(対象タスクが自タスクまたは休止状態(DORMANT))
E_CTX ディスパッチ禁止状態で実行状態のタスクを指定した
E_QOVR キューイングまたはネストのオーバーフロー(ネスト数 suscnt のオーバーフロー)

利用可能なコンテキスト

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

解説

tskid で示されたタスクを強制待ち状態(SUSPENDED)に移し、タスクの実行を中断させる。

強制待ち状態(SUSPENDED)は、tk_rsm_tsk, tk_frsm_tsk システムコールの発行によって解除される。

tk_sus_tsk の対象タスクが既に待ち状態であった場合には、tk_sus_tsk の実行により、対象タスクは待ち状態と強制待ち状態が複合した二重待ち状態(WAITING-SUSPENDED)となる。その後、このタスクの待ち解除の条件が満たされると、対象タスクは強制待ち状態(SUSPENDED)に移行する。一方、このタスクに対して tk_rsm_tsk が発行されると、対象タスクは前と同じ待ち状態に戻る。([図1タスク状態T-Kernelの概念]を参照)

強制待ち状態(SUSPENDED)は他タスクの発行したシステムコールによる中断状態を意味するものなので、本システムコールで自タスクを指定することはできない。自タスクを指定した場合には、E_OBJ のエラーとなる。

タスク独立部からの本システムコールの発行において、ディスパッチ禁止状態で実行状態(RUNNING)のタスクを指定した場合は E_CTX のエラーとなる。

あるタスクに対して複数回の tk_sus_tsk が発行された場合、そのタスクは多重の強制待ち状態(SUSPENDED)になる。これを強制待ち要求のネストと呼ぶ。この場合、tk_sus_tsk が発行された回数(suscnt)と同じ回数の tk_rsm_tsk を発行することにより、対象タスクが元の状態に戻る。したがって、tk_sus_tsktk_rsm_tsk の対をネストすることが可能である。

強制待ち要求のネストの機能(同一タスクに対して2回以上の tk_sus_tsk を発行する機能)の有無およびその回数の制限値は、実装依存である。

強制待ち要求をネストできないシステムで複数の tk_sus_tsk が発行された場合や、ネスト回数の制限値を越えた場合には、E_QOVR のエラーとなる。

補足事項

あるタスクが資源獲得のための待ち状態(セマフォ待ちなど)で、かつ強制待ち状態(SUSPENDED)の場合でも、強制待ち状態(SUSPENDED)でない時と同じ条件によって資源の割当て(セマフォの割当てなど)が行われる。強制待ち状態(SUSPENDED)であっても、資源割当ての遅延などが行われるわけではなく、資源割当てや待ち状態の解除に関する条件や優先度は全く変わらない。すなわち、強制待ち状態(SUSPENDED)は、他の処理やタスク状態と直交関係にある。

強制待ち状態(SUSPENDED)のタスクに対して資源割当ての遅延(一時的な優先度の低下) を行いたいのであれば、ユーザ側で、tk_sus_tsk, tk_rsm_tsktk_chg_pri を組み合せて発行すれば良い。

タスク強制待ちは、仮想記憶システムにおけるページフォルト処理やデバッガのブレークポイント処理等のOSに密接に関連したごく一部でのみ使用することを原則とする。一般のアプリケーションおよびミドルウェアでは原則として使用してはいけない。これは、次のような理由による。

タスク強制待ちは、対象のタスクの実行状態に関係なく行われる。例えば、タスクがあるミドルウェアの機能を呼び出しているとき、そのタスクを強制待ち状態にするとミドルウェアの内部でタスクが停止することになる。ミドルウェアでは、リソース管理などで排他制御等を行っている場合があり、あるタスクがミドルウェア内でリソースを獲得したまま停止してしまったことにより、他のタスクがそのミドルウェアを使用できなくなる状況が起きうる。このようにして連鎖的にタスクが停止してしまい、システム全体が停止(デッドロック)することもありうる。

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

tk_rsm_tsk - 強制待ち状態のタスクを再開

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_rsm_tsk (ID tskid );

パラメータ

ID tskid Task IDタスクID

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_OBJ オブジェクトの状態が不正(対象タスクが強制待ち状態(SUSPENDED)ではない(自タスクや休止状態(DORMANT)の場合を含む))

利用可能なコンテキスト

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

解説

tskid で示されたタスクの強制待ち状態(SUSPENDED)を解除する。すなわち、対象タスクが以前に発行された tk_sus_tsk によって強制待ち状態(SUSPENDED)に入り、その実行が中断している場合に、その状態を解除し、実行を再開させる。

対象タスクが待ち状態(WAITING)と強制待ち状態(SUSPENDED)の複合した二重待ち状態(WAITING-SUSPENDED)であった場合には、tk_rsm_tsk の実行により強制待ち状態(SUSPENDED)のみが解除され、対象タスクは待ち状態となる。([図1タスク状態T-Kernelの概念]を参照)

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

tk_rsm_tsk では、強制待ち要求のネスト(suscnt)を1回分だけ解除する。したがって、対象タスクに対して2回以上の tk_sus_tsk が発行されていた場合(suscnt≧2)には、tk_rsm_tsk の実行が終わった後も、対象タスクはまだ強制待ち状態(SUSPENDED)のままである。

補足事項

実行状態(RUNNING)もしくは実行可能状態(READY)のタスクが tk_sus_tsk により強制待ち状態(SUSPENDED)になった後、tk_rsm_tsktk_frsm_tsk によって実行を再開した場合、そのタスクは同じ優先度を持つタスクの中で最低の優先順位となる。

たとえば、同じ優先度のtask_Aとtask_Bに対して以下のシステムコールを実行した場合、次のような動作をする。

tk_sta_tsk (tskid=task_A, stacd_A);
tk_sta_tsk (tskid=task_B, stacd_B);
  /* この時はFCFSの原則により、優先順位はtask_A→task_Bとなっている */

tk_sus_tsk (tskid=task_A);
tk_rsm_tsk (tskid=task_A);
  /* この時に優先順位はtask_B→task_Aとなる */

tk_frsm_tsk - 強制待ち状態のタスクを強制再開

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_frsm_tsk (ID tskid );

パラメータ

ID tskid Task IDタスクID

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(tskid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_OBJ オブジェクトの状態が不正(対象タスクが強制待ち状態(SUSPENDED)ではない(自タスクや休止状態(DORMANT)の場合を含む))

利用可能なコンテキスト

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

解説

tskid で示されたタスクの強制待ち状態(SUSPENDED)を解除する。すなわち、対象タスクが以前に発行された tk_sus_tsk によって強制待ち状態(SUSPENDED)に入り、その実行が中断している場合に、その状態を解除し、実行を再開させる。

対象タスクが待ち状態(WAITING)と強制待ち状態(SUSPENDED)の複合した二重待ち状態(WAITING-SUSPENDED)であった場合には、tk_frsm_tsk の実行により強制待ち状態(SUSPENDED)のみが解除され、対象タスクは待ち状態となる。([図1タスク状態T-Kernelの概念]を参照)

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

tk_frsm_tsk では、強制待ち要求のネスト(suscnt)をすべて解除(suscnt=0)する。したがって、対象タスクに対して2回以上の tk_sus_tsk が発行されていた場合(suscnt≧2)でも、それらの要求をすべて解除(suscnt=0)する。すなわち、強制待ち状態(SUSPENDED)は必ず解除され、対象タスクが二重待ち状態(WAITING-SUSPENDED)でない限り実行を再開できる。

補足事項

実行状態(RUNNING)もしくは実行可能状態(READY)のタスクが tk_sus_tsk により強制待ち状態(SUSPENDED)になった後、tk_rsm_tsktk_frsm_tsk によって実行を再開した場合、そのタスクは同じ優先度を持つタスクの中で最低の優先順位となる。

たとえば、同じ優先度のtask_Aとtask_Bに対して以下のシステムコールを実行した場合、次のような動作をする。

tk_sta_tsk (tskid=task_A, stacd_A);
tk_sta_tsk (tskid=task_B, stacd_B);
  /* この時はFCFSの原則により、優先順位はtask_A→task_Bとなっている */

tk_sus_tsk (tskid=task_A);
tk_frsm_tsk (tskid=task_A);
  /* この時に優先順位はtask_B→task_Aとなる */

tk_dly_tsk - タスク遅延

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_dly_tsk (RELTIM dlytim );

パラメータ

RELTIM dlytim Delay Time遅延時間(ミリ秒)

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_NOMEM メモリ不足
E_PAR パラメータエラー(dlytim が不正)
E_CTX コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)
E_RLWAI 待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
E_DISWAI 待ち禁止による待ち解除

利用可能なコンテキスト

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

解説

自タスクの実行を一時的に停止し、時間経過待ちの状態に入る。タスクの実行を停止する時間は、dlytim により指定される。

時間経過待ちの状態は待ち状態の一つであり、tk_rel_wai により時間経過待ちを解除することができる。

このシステムコールを発行したタスクが強制待ち状態(SUSPENDED)または二重待ち状態(WAITING-SUSPENDED)になっている間も、時間経過のカウントは行われる。

dlytim の基準時間(時間の単位)はシステム時刻の基準時間(=1ミリ秒)と同じである。

補足事項

このシステムコールは、tk_slp_tsk とは異なり、遅延時間として指定された時間が経過した場合に正常終了となる。また、遅延時間中に tk_wup_tsk が実行されても、待ち解除とはならない。遅延時間が経過する前に tk_dly_tsk が終了するのは、tk_ter_tsktk_rel_wai が発行された場合に限られる。

tk_dly_tsk_u - タスク遅延(マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_dly_tsk_u (RELTIM_U dlytim_u );

パラメータ

RELTIM_U dlytim_u Delay Time遅延時間(マイクロ秒)

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_NOMEM メモリ不足
E_PAR パラメータエラー(dlytim_u が不正)
E_CTX コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)
E_RLWAI 待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
E_DISWAI 待ち禁止による待ち解除

利用可能なコンテキスト

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

解説

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

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

T-Kernel 1.0との差異

T-Kernel 2.0で追加されたシステムコールである。

tk_sig_tev - タスクイベントの送信

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_sig_tev (ID tskid , INT tskevt );

パラメータ

ID tskid Task IDタスクID
INT tskevt Task Eventタスクイベント番号(1~8)

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

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

利用可能なコンテキスト

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

解説

tskid のタスクへ tskevt で指定したタスクイベントを送信する。

タスクイベントは、タスクごとに保持される8種類のイベントであり、1~8の番号で指定する。

タスクイベントの発生回数は保持されず、発生の有無のみが保持される。

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

補足事項

タスクイベントは、tk_slp_tsktk_wup_tsk と同様のタスク付属の同期機能であるが、次の点が異なる。

  • 起床要求(タスクイベント)の回数は保持されない。

  • 8種類のイベントタイプで起床要求を分類できる。

同一タスクにおいて、同じイベントタイプを使用して2ヵ所以上で同期を行うと混乱することになる。イベントタイプの割当ては明確に行うべきである。

タスクイベントは、ミドルウェアでの利用を前提とし、アプリケーションでは原則として使用しない。アプリケーションでは、tk_slp_tsktk_wup_tsk の利用を推奨する。

tk_wai_tev - タスクイベント待ち

C言語インタフェース

#include <tk/tkernel.h>

INT tevptn = tk_wai_tev (INT waiptn , TMO tmout );

パラメータ

INT waiptn Wait Event Pattern待ちタスクイベントのパターン
TMO tmout Timeoutタイムアウト指定(ミリ秒)

リターンパラメータ

INT tevptn Task Event Pattern待ち解除時のタスクイベント発生状況
またはError Codeエラーコード

エラーコード

E_PAR パラメータエラー(waiptn, tmout が不正)
E_RLWAI 待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
E_DISWAI 待ち禁止による待ち解除
E_TMOUT ポーリング失敗またはタイムアウト
E_CTX コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)

利用可能なコンテキスト

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

解説

waiptn で指定したタスクイベントのいずれかが発生するまで待つ。タスクイベントの発生で待ちが解除された場合、waiptn で指定したタスクイベントはクリア(発生中のタスクイベント &= ~waiptn)される。また、戻値(tevptn)に待ちが解除された時に発生していたタスクイベントの状態(クリア前の状態)を返す。

waiptn および tevptn は、各タスクイベントを1<<(タスクイベント番号-1)のビット値として論理和(OR)した値である。

tmout により待ち時間の最大値(タイムアウト値)を指定することができる。待ち解除の条件が満足されない(tk_sig_tev が実行されない)まま tmout の時間が経過すると、タイムアウトエラー E_TMOUT となってシステムコールが終了する。

tmout としては、正の値のみを指定することができる。tmout の基準時間(時間の単位)はシステム時刻の基準時間(=1ミリ秒)と同じである。

tmout として TMO_POL=0を指定した場合は、タイムアウト値として0を指定したことを示し、タスクイベントが発生していなくても待ちに入らず E_TMOUT を返す。また、tmout として TMO_FEVR=(-1)を指定した場合は、タイムアウト値として無限大の時間を指定したことを示し、タイムアウトせずにタスクイベントが発生するまで待ち続ける。

tk_wai_tev_u - タスクイベント待ち(マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

INT tevptn = tk_wai_tev_u (INT waiptn , TMO_U tmout_u );

パラメータ

INT waiptn Wait Event Pattern待ちタスクイベントのパターン
TMO_U tmout_u Timeoutタイムアウト指定(マイクロ秒)

リターンパラメータ

INT tevptn Task Event Pattern待ち解除時のタスクイベント発生状況
またはError Codeエラーコード

エラーコード

E_PAR パラメータエラー(waiptn, tmout_u が不正)
E_RLWAI 待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
E_DISWAI 待ち禁止による待ち解除
E_TMOUT ポーリング失敗またはタイムアウト
E_CTX コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)

利用可能なコンテキスト

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

解説

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

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

T-Kernel 1.0との差異

T-Kernel 2.0で追加されたシステムコールである。

tk_dis_wai - タスク待ち状態の禁止

C言語インタフェース

#include <tk/tkernel.h>

INT tskwait = tk_dis_wai (ID tskid , UINT waitmask );

パラメータ

ID tskid Task IDタスクID
UINT waitmask Wait Maskタスク待ち禁止設定

リターンパラメータ

INT tskwait Task Waitタスク待ち禁止後のタスク待ち状態
またはError Codeエラーコード

エラーコード

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

利用可能なコンテキスト

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

解説

tskid のタスクに対して、waitmask で指定した待ち要因による待ちに入ることを禁止する。タスクがすでに waitmask で指定した待ち要因の待ちに入っている場合は、その待ちを解除する。

waitmask には、以下の待ち要因を任意に組み合わせて論理和(OR)で指定する。

#define TTW_SLP         0x00000001      /* 起床待ちによる待ち */
#define TTW_DLY         0x00000002      /* タスクの遅延による待ち */
#define TTW_SEM         0x00000004      /* セマフォ待ち */
#define TTW_FLG         0x00000008      /* イベントフラグ待ち */
#define TTW_MBX         0x00000040      /* メールボックス待ち */
#define TTW_MTX         0x00000080      /* ミューテックス待ち */
#define TTW_SMBF        0x00000100      /* メッセージバッファ送信待ち */
#define TTW_RMBF        0x00000200      /* メッセージバッファ受信待ち */
#define TTW_CAL         0x00000400      /* ランデブ呼出待ち */
#define TTW_ACP         0x00000800      /* ランデブ受付待ち */
#define TTW_RDV         0x00001000      /* ランデブ終了待ち */
#define TTW_MPF         0x00002000      /* 固定長メモリプール待ち */
#define TTW_MPL         0x00004000      /* 可変長メモリプール待ち */
#define TTW_EV1         0x00010000      /* タスクイベント#1待ち */
#define TTW_EV2         0x00020000      /* タスクイベント#2待ち */
#define TTW_EV3         0x00040000      /* タスクイベント#3待ち */
#define TTW_EV4         0x00080000      /* タスクイベント#4待ち */
#define TTW_EV5         0x00100000      /* タスクイベント#5待ち */
#define TTW_EV6         0x00200000      /* タスクイベント#6待ち */
#define TTW_EV7         0x00400000      /* タスクイベント#7待ち */
#define TTW_EV8         0x00800000      /* タスクイベント#8待ち */
#define TTX_SVC         0x80000000      /* 拡張SVC呼出禁止 */

TTX_SVC はタスクの待ちではないが、拡張SVCの呼出を禁止する特殊な指定となる。TTX_SVC が指定されている場合、そのタスクが拡張SVCを呼び出そうとすると、拡張SVCを呼び出さずに E_DISWAI を返す。すでに呼び出している拡張SVCを終了させるような効果はない。

戻値(tskwait)には、tk_dis_wai によって待ち禁止処理が行われた後のタスクの待ち状態を返す。この値は、tk_ref_tsktskwait と同じ値となる。なお、tskwait には TTX_SVC に関する情報は返されない。tskwait が0であれば、タスクは待ち状態に入っていない(または待ちが解除された)ことを示す。tskwait が0でなければ、waitmask に指定した以外の要因で待っていることになる。

タスクの待ちが tk_dis_wai により解除された場合、または待ち禁止状態で新たに待ちに入ろうとした場合は、E_DISWAI が返される。

待ち禁止状態でその待ちに入る可能性があるシステムコールを呼び出したとき、待ちに入らずに処理できる場合であっても E_DISWAI が返される。例えば、メッセージバッファに空きがあり、待ちに入ることなく送信できるような状況で、メッセージバッファへ送信(tk_snd_mbf)を行った場合も、メッセージの送信は行われずに E_DISWAI が返される。

拡張SVCの実行中に設定された待ち禁止は、拡張SVCから呼出元に戻る際に自動的に解除される。また、拡張SVCを呼び出した時も自動的に解除され、拡張SVCから戻ってきたときに元の設定に復帰する。

タスクが休止状態(DORMANT)に戻るときにも、自動的に解除される。ただし、休止状態(DORMANT)であるときの設定は有効であり、次にタスクが起動したときはその待ち禁止が適用される。

セマフォなど主なオブジェクトでは、オブジェクト生成時に TA_NODISWAI を指定することができる。TA_NODISWAI を指定して生成されたオブジェクトでは、tk_dis_wai による待ち禁止は拒否され、待ちは禁止されない。

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

補足事項

待ち禁止機能は、拡張SVCハンドラの実行を中止するために用意された機能で、一般的にはブレーク関数で使用される。(その用途に限定されるものではない。)

ランデブの場合の待ち禁止は、他に比べて複雑である。基本的には、ランデブの待ち状態が変化するときに待ち禁止が検出されると待ちが解除される。

いくつか具体例を挙げる。

TTW_CAL の待ちが禁止されておらず、TTW_RDV の待ちが禁止されている場合、ランデブ呼出の待ちには入るが、ランデブが受け付けられてランデブ終了待ちになる時点で待ちが解除され E_DISWAI を返す。このとき、メッセージは受付タスクに送られ、受付タスクはメッセージを受け取りランデブ成立状態となる。受付タスクは返答(tk_rpl_rdv)を行った時点で相手タスクがないことがわかりエラー(E_OBJ)となる。

ランデブの回送の場合も待ち禁止は適用される。このとき、回送先のランデブポートの属性に従うことになる。つまり、回送先のランデブポートに TA_NODISWAI 属性の指定があれば、待ち禁止は拒否される。

ランデブ終了待ち状態となったあと TTW_CAL の待ちが禁止された場合、その状態で回送を行うと、回送によっていったんランデブ呼出待ちの状態になるため、TTW_CAL の指定により待ちが禁止される。このとき、ランデブ呼出側(tk_cal_por)と回送側(tk_fwd_por)の双方に E_DISWAI が返される。

tk_ena_wai - タスク待ち禁止の解除

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_ena_wai (ID tskid );

パラメータ

ID tskid Task IDタスクID

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

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

利用可能なコンテキスト

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

解説

tskid のタスクに tk_dis_wai によって設定された待ち禁止をすべて解除する。

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