タスク付属同期機能は、タスクの状態を直接的に操作することによって同期を行うための機能である。タスクを起床待ちにする機能とそこから起床する機能、タスクの起床要求をキャンセルする機能、タスクの待ち状態を強制解除する機能、タスクを強制待ち状態へ移行する機能とそこから再開する機能、自タスクの実行を遅延する機能、タスクイベントに関する機能、タスクの待ち状態を禁止する機能が含まれる。
タスクに対する起床要求は、キューイングされる。すなわち、起床待ち状態でないタスクを起床しようとすると、そのタスクを起床しようとしたという記録が残り、後でそのタスクが起床待ちに移行しようとした時に、タスクを起床待ち状態にしない。タスクに対する起床要求のキューイングを実現するために、タスクは起床要求キューイング数を持つ。タスクの起床要求キューイング数は、タスクの起動時に0にクリアする。
タスクに対する強制待ち要求は、ネストされる。すなわち、すでに強制待ち状態(二重待ち状態を含む)になっているタスクを再度強制待ち状態に移行させようとすると、そのタスクを強制待ち状態に移行させようとしたという記録が残り、後でそのタスクを強制待ち状態(二重待ち状態を含む)から再開させようとした時に、強制待ちからの再開を行わない。タスクに対する強制待ち要求のネストを実現するために、タスクは強制待ち要求ネスト数を持つ。タスクの強制待ち要求ネスト数は、タスクの起動時に0にクリアする。
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 となる。なお、tmout
=TMO_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ヵ所以上でタスク起床待ちによる同期を行うと、起床要求が混同してしまい誤動作することになる。例えば、アプリケーションとミドルウェアの双方で起床待ちによる同期を利用していた場合、ミドルウェア内で起床待ちしている間に、アプリケーションが起床要求してしまうことがありえる。このような状況になれば、ミドルウェアもアプリケーションも正常な動作はできなくなる。
このように、どこで起床待ちしているかなどの状況がわからないと、正しいタスクの同期ができなくなる。タスク起床待ちによるタスクの同期は簡便な方法としてよく利用されるため、アプリケーションで自由に利用できることを確保するために、ミドルウェアでは使用しないことを原則とする。
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 の説明を参照のこと。
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
)の最大値は実装依存であり、最大値はサービスプロファイル TK_WAKEUP_MAXCNT で規定される。すなわち、待ち状態でないタスクに対して tk_wup_tsk を1回発行してもエラーとはならないが、2回目以降の tk_wup_tsk がエラーとなるかどうかは実装依存である。
起床要求キューイング数(wupcnt
)の最大値の制限を越えて tk_wup_tsk を発行した場合には、E_QOVR のエラーとなる。
tskid
で示されたタスクの起床要求キューイング数(wupcnt
)をリターンパラメータとして返し、同時にその起床要求をすべてキャンセルする。すなわち、対象タスクの起床要求キューイング数(wupcnt
)を0にする。
tskid
=TSK_SELF=0によって自タスクの指定になる。ただし、タスク独立部から発行したシステムコールで tskid
=TSK_SELF=0を指定した場合には、E_ID のエラーとなる。
このシステムコールは、周期的にタスクを起床して動かすような処理を行う場合に、時間内に処理が終わっているかどうかを判定するために利用できる。すなわち、前の起床要求に対する処理が終了して tk_slp_tsk を発行する前に、それを監視するタスクが tk_can_wup を発行し、そのリターンパラメータである wupcnt
が1以上の値であった場合、前の起床要求に対する処理が時間内に終了しなかったということを示す。したがって、処理の遅れに対して何らかの処置をとることができる。
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_wai の ercd | 処理 |
---|---|---|
実行できる状態(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_wai と tk_wup_tsk とは次のような違いがある。
tk_wup_tsk は tk_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 のエラーとなる。
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_tsk~tk_rsm_tsk の対をネストすることが可能である。
強制待ち要求のネストの機能(同一タスクに対して2回以上の tk_sus_tsk を発行する機能)の有無およびその回数の上限値は、実装依存である。
強制待ち要求をネストできないシステムで複数の tk_sus_tsk が発行された場合や、ネスト回数の制限値を越えた場合には、E_QOVR のエラーとなる。
あるタスクが資源獲得のための待ち状態(セマフォ待ちなど)で、かつ強制待ち状態(SUSPENDED)の場合でも、強制待ち状態(SUSPENDED)でない時と同じ条件によって資源の割当て(セマフォの割当てなど)が行われる。強制待ち状態(SUSPENDED)であっても、資源割当ての遅延などが行われるわけではなく、資源割当てや待ち状態の解除に関する条件や優先度は全く変わらない。すなわち、強制待ち状態(SUSPENDED)は、他の処理やタスク状態と直交関係にある。
強制待ち状態(SUSPENDED)のタスクに対して資源割当ての遅延(一時的な優先度の低下) を行いたいのであれば、ユーザ側で、tk_sus_tsk, tk_rsm_tsk に tk_chg_pri を組み合せて発行すれば良い。
タスク強制待ちは、デバッガのブレークポイント処理等のOSに密接に関連したごく一部でのみ使用することを原則とする。一般のアプリケーションおよびミドルウェアでは原則として使用してはいけない。これは、次のような理由による。
タスク強制待ちは、対象のタスクの実行状態に関係なく行われる。例えば、タスクがあるミドルウェアの機能を呼び出しているとき、そのタスクを強制待ち状態にするとミドルウェアの内部でタスクが停止することになる。ミドルウェアでは、リソース管理などで排他制御等を行っている場合があり、あるタスクがミドルウェア内でリソースを獲得したまま停止してしまったことにより、他のタスクがそのミドルウェアを使用できなくなる状況が起きうる。このようにして連鎖的にタスクが停止してしまい、システム全体が停止(デッドロック)することもありうる。
このように、タスクの状態(何を実行中か)が不明な状況で、そのタスクを停止させることはできない。したがって、一般にタスク強制待ちは使用してはならない。
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_tsk や tk_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となる */
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_tsk や tk_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となる */
E_OK | 正常終了 |
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_tsk や tk_rel_wai が発行された場合に限られる。
E_OK | 正常終了 |
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 の説明を参照のこと。
tskid
のタスクへ tskevt
で指定したタスクイベントを送信する。
タスクイベントは、タスクごとに保持される8種類のイベントであり、1~8の番号で指定する。
タスクイベントの発生回数は保持されず、発生の有無のみが保持される。
tskid
=TSK_SELF=0によって自タスクの指定になる。ただし、タスク独立部から発行したシステムコールで tskid
=TSK_SELF=0を指定した場合には、E_ID のエラーとなる。
タスクイベントは、tk_slp_tsk~tk_wup_tsk と同様のタスク付属の同期機能であるが、次の点が異なる。
起床要求(タスクイベント)の回数は保持されない。
8種類のイベントタイプで起床要求を分類できる。
同一タスクにおいて、同じイベントタイプを使用して2ヵ所以上で同期を行うと混乱することになる。イベントタイプの割当ては明確に行うべきである。
タスクイベントは、ミドルウェアでの利用を前提とし、アプリケーションでは原則として使用しない。アプリケーションでは、tk_slp_tsk~tk_wup_tsk の利用を推奨する。
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
により待ち時間の最大値(タイムアウト値)を指定することができる。tmout
の基準時間(時間の単位)はシステム時刻の基準時間(=1ミリ秒)と同じである。待ち解除の条件が満足されない(tk_sig_tev が実行されない)まま tmout
の時間が経過すると、タイムアウトエラー E_TMOUT となってシステムコールが終了する。
tmout
として TMO_POL=0を指定した場合は、タイムアウト値として0を指定したことを示し、タスクイベントが発生していなくても待ちに入らず E_TMOUT を返す。また、tmout
として TMO_FEVR=(-1)を指定した場合は、タイムアウト値として無限大の時間を指定したことを示し、タイムアウトせずにタスクイベントが発生するまで待ち続ける。
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 の説明を参照のこと。
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 によって待ち禁止処理が行われた後のタスクの待ち状態を(INT型のビット幅 - 1)個分のビットパターンで返す。INT型のビット幅が32ビットの場合、この値は tk_ref_tsk の tskwait
と同じ値となる。なお、tskwait
には TTX_SVC に関する情報は返されない。tskwait
が0であれば、タスクは待ち状態に入っていない(または待ちが解除された)ことを示す。tskwait
が0でなければ、waitmask
に指定した以外の要因で待っていることになる。INT型のビット幅が32ビットより小さい場合、ビット幅に入りきらない上位ビット分の情報は返されない。そのため、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 による待ち禁止は拒否され、待ちは禁止されない。
tskid
=TSK_SELF=0によって自タスクの指定になる。ただし、タスク独立部から発行したシステムコールで tskid
=TSK_SELF=0を指定した場合には、E_ID のエラーとなる。
待ち禁止機能は、拡張SVCの処理を途中で中止したい場合に使用することを想定した機能である。ただし、その用途に限定されるものではない。
tk_dis_wai の戻値(tskwait
)がINT型であり、処理系によってとれる値の範囲に異なる可能性があるため注意が必要である。例えば、16ビット環境ではタスクイベントの待ちに関する情報をすべては取得できない。μT-Kernelでプロセッサのビット幅に関係なくタスク待ち状態を取得するには、tk_ref_tsk の tskwait
を参照する必要がある。なお、T-KernelではINT型のビット幅が32ビット以上であると定義されているので、tk_dis_wai の戻値でタスクの待ち状態をすべて取得できる。
tskid
のタスクに tk_dis_wai によって設定された待ち禁止をすべて解除する。
tskid
=TSK_SELF=0によって自タスクの指定になる。ただし、タスク独立部から発行したシステムコールで tskid
=TSK_SELF=0を指定した場合には、E_ID のエラーとなる。