第 4 章 µITRON4.0 仕様の機能 81
4.2 タスク付属同期機能
タスク付属同期機能は,タスクの状態を直接的に操作することによって同期を 行うための機能である.タスクを起床待ちにする機能とそこから起床する機 能,タスクの起床要求をキャンセルする機能,タスクの待ち状態を強制解除す る機能,タスクを強制待ち状態へ移行する機能とそこから再開する機能,自タ スクの実行を遅延する機能が含まれる.
タスクに対する起床要求は,キューイングされる.すなわち,起床待ち状態で ないタスクを起床しようとすると,そのタスクを起床しようとしたという記録 が残り,後でそのタスクが起床待ちに移行しようとした時に,タスクを起床待 ち状態にしない.タスクに対する起床要求のキューイングを実現するために,
タスクは起床要求キューイング数を持つ.タスクの起床要求キューイング数 は,タスクの起動時に 0にクリアする.
タスクに対する強制待ち要求は,ネストされる.すなわち,すでに強制待ち状 態(二重待ち状態を含む)になっているタスクを再度強制待ち状態に移行させ ようとすると,そのタスクを強制待ち状態に移行させようとしたという記録が 残り,後でそのタスクを強制待ち状態(二重待ち状態を含む)から再開させよ うとした時に,強制待ちからの再開を行わない.タスクに対する強制待ち要求 のネストを実現するために,タスクは強制待ち要求ネスト数を持つ.タスクの 強制待ち要求ネスト数は,タスクの起動時に 0にクリアする.
タスク付属同期機能に関連して,次のカーネル構成定数を定義する.
TMAX_WUPCNT タスクの起床要求キューイング数の最大値
TMAX_SUSCNT タスクの強制待ち要求ネスト数の最大値
タスク付属同期機能の各サービスコールの機能コードは次の通りである.
TFN_SLP_TSK –0x11 slp_tskの機能コード TFN_TSLP_TSK –0x12 tslp_tskの機能コード TFN_WUP_TSK –0x13 wup_tskの機能コード TFN_IWUP_TSK –0x72 iwup_tskの機能コード TFN_CAN_WUP –0x14 can_wupの機能コード TFN_REL_WAI –0x15 rel_waiの機能コード TFN_IREL_WAI –0x73 irel_waiの機能コード TFN_SUS_TSK –0x16 sus_tskの機能コード TFN_RSM_TSK –0x17 rsm_tskの機能コード TFN_FRSM_TSK –0x18 frsm_tskの機能コード TFN_DLY_TSK –0x19 dly_tskの機能コード
【スタンダードプロファイル】
スタンダードプロファイルでは,タスク付属同期機能をサポートしなければな らない.
スタンダードプロファイルでは,少なくとも 1回のタスクの起床要求キューイ
ングをサポートしなければならない.また,タスクの強制待ち状態をサポート しなければならない.したがって, TMAX_WUPCNTと TMAX_SUSCNTは,
ともに 1以上でなければならない.
【補足説明】
TMAX_WUPCNTは,タスクの起床待ちをサポートしない場合には未定義,タ
スクの起床要求キューイングをサポートしない場合には 0とする.また,タス クの強制待ち状態をサポートしない場合には, TMAX_SUSCNTは未定義とす る.したがって, TMAX_SUSCNTが 0に定義されることはない.
【 µITRON3.0仕様との相違】
タスクの待ち状態を強制解除する機能( rel_wai),自タスクの実行を遅延する 機能( dly_tsk)をタスク付属同期機能に分類することにした.
slp_tsk
起床待ち 【 S】tslp_tsk
起床待ち(タイムアウトあり) 【 S】【 C言語 API】
ER ercd = slp_tsk ( ) ;
ER ercd = tslp_tsk ( TMO tmout ) ;
【パラメータ】
TMO tmout タイムアウト指定( tslp_tskのみ)
【リターンパラメータ】
ER ercd 正常終了( E_OK)またはエラーコード
【エラーコード】
E_PAR パラメータエラー( tmoutが不正; tslp_tskのみ)
E_RLWAI 待ち状態の強制解除(待ち状態の間に rel_waiを受付)
E_TMOUT ポーリング失敗またはタイムアウト( tslp_tskのみ)
【機能】
自タスクを起床待ち状態に移行させる.ただし,自タスクに対する起床要求が キューイングされている場合,具体的には,自タスクの起床要求キューイング 数が 1以上の場合には,起床要求キューイング数から 1を減じ,自タスクを待 ち状態に移行させず,そのまま実行を継続する.
tslp_tskは, slp_tskにタイムアウトの機能を付け加えたサービスコールであ る. tmoutには,正の値のタイムアウト時間に加えて, TMO_POL(= 0)と TMO_FEVR(= –1)を指定することができる.
【補足説明】
このサービスコールは,自タスクに対する起床要求がキューイングされている 場合に,自タスクをいったん待ち状態とはしない.そのため,自タスクの優先 順位は変化しない.
slp_tskの処理をポーリングで行う専用のサービスコールは用意されてない.
必要があれば, can_wupにより類似の機能を実現することができる.
wup_tsk
タスクの起床 【 S】iwup_tsk
【 S】【 C言語 API】
ER ercd = wup_tsk ( ID tskid ) ; ER ercd = iwup_tsk ( ID tskid ) ;
【パラメータ】
ID tskid 起床対象のタスクの ID番号
【リターンパラメータ】
ER ercd 正常終了( E_OK)またはエラーコード
【エラーコード】
E_ID 不正 ID番号( tskidが不正あるいは使用できない)
E_NOEXS オブジェクト未生成(対象タスクが未登録)
E_OBJ オブジェクト状態エラー(対象タスクが休止状態)
E_QOVR キューイングオーバフロー(起床要求キューイング数の
オーバフロー)
【機能】
tskidで指定されるタスクを,起床待ち状態から待ち解除する.待ち解除され
たタスクに対しては,待ち状態に入ったサービスコールの返値として E_OKを 返す.
対象タスクが起床待ち状態でない場合には,タスクに対する起床要求をキュー イングする(ただし,対象タスクが未登録状態の時は E_NOEXSエラー,休止 状態の時は E_OBJエラーとなる).具体的には,タスクの起床要求キューイン グ数に 1を加える.タスクの起床要求キューイング数に 1を加えると起床要求 キューイング数の最大値を越える場合には, E_QOVRエラーを返す.
非タスクコンテキストから呼び出された場合で,サービスコールを遅延実行す る場合には, E_OBJエラーと E_QOVRエラーを返すことを,実装定義で省略 することができる.
tskidに TSK_SELF(= 0)が指定されると,自タスクを対象タスクとする.た だし,非タスクコンテキストからの呼出しでこの指定が行われた場合には,
E_IDエラーを返す.
【補足説明】
スタンダードプロファイルでは,タスクの起床要求キューイング数の最大値
は, 1以上であればいくつであってもよい.したがって,スタンダードプロファ
イルに準拠したカーネルで,起床要求がキューイングされているタスクを指定 してこのサービスコールを呼び出しても, E_QOVRエラーが返るとは限らな い.
【 µITRON3.0仕様との相違】
対象タスクに自タスクを指定できることとした.これは, act_tskとの整合性 を考慮したためである.
can_wup
タスク起床要求のキャンセル 【 S】【 C言語 API】
ER_UINT wupcnt = can_wup ( ID tskid ) ;
【パラメータ】
ID tskid 起床要求のキャンセル対象のタスクの ID番号
【リターンパラメータ】
ER_UINT wupcnt キューイングされていた起床要求の回数(正の
値または 0)またはエラーコード
【エラーコード】
E_ID 不正 ID番号( tskidが不正あるいは使用できない)
E_NOEXS オブジェクト未生成(対象タスクが未登録)
E_OBJ オブジェクト状態エラー(対象タスクが休止状態)
【機能】
tskidで指定されるタスクに対してキューイングされている起床要求をキャン
セルし,キューイングされていた起床要求の回数を返す.具体的には,タスク の起床要求キューイング数を 0にクリアし,クリアする前の起床要求キューイ ング数を返す.
tskidに TSK_SELF(= 0)が指定されると,自タスクを対象タスクとする.
【補足説明】
このサービスコールは,タスクを周期的に起床して処理を行う場合に,周期内 に処理が終わっているかどうかを判定するために用いることができる.具体的 には,前の起床要求に対する処理が終了した時点で can_wupを呼び出し,そ の返値が 1以上の値であった場合,前の起床要求に対する処理が周期内に終了 せず,次の起床要求が行われたことがわかる.したがって,処理の遅れに対す る処置をとることができる.
【 µITRON3.0仕様との相違】
キューイングされていた起床要求の回数( wupcnt)を,サービスコールの返 値として返すこととした.
rel_wai
待ち状態の強制解除 【 S】irel_wai
【 S】【 C言語 API】
ER ercd = rel_wai ( ID tskid ) ; ER ercd = irel_wai ( ID tskid ) ;
【パラメータ】
ID tskid 待ち状態の強制解除対象のタスクの ID番号
【リターンパラメータ】
ER ercd 正常終了( E_OK)またはエラーコード
【エラーコード】
E_ID 不正 ID番号( tskidが不正あるいは使用できない)
E_NOEXS オブジェクト未生成(対象タスクが未登録)
E_OBJ オブジェクト状態エラー(対象タスクが待ち状態でな
い)
【機能】
tskidで指定されるタスクが待ち状態にある場合に,強制的に待ち解除を行う.
すなわち,対象タスクが待ち状態の時は実行可能状態に,二重待ち状態の時は 強制待ち状態に移行させる.このサービスコールにより待ち解除されたタスク に対しては,待ち状態に入ったサービスコールの返値として E_RLWAIエラー を返す.
対象タスクが待ち状態(二重待ち状態を含む)でない場合には,E_OBJエラー を返す(ただし,対象タスクが未登録状態の時は E_NOEXSエラーとなる).
非タスクコンテキストから呼び出された場合で,サービスコールを遅延実行す る場合には, E_OBJエラーを返すことを,実装定義で省略することができる.
【補足説明】
対象タスクに自タスクを指定することはできない.自タスクが指定された場合 には,待ち状態でないために E_OBJエラーを返す.
このサービスコールでは,強制待ちからの再開は行わない.強制待ちからの再 開を行う必要がある場合には, frsm_tsk(または rsm_tsk)を用いる.
対象タスクが何らかの待ち行列につながれていた場合には,対象タスクを待ち 行列から外す.その際に,その待ち行列で待っている他のタスクの待ち解除が 必要になる場合がある( snd_mbfの機能説明と get_mplの機能説明を参照). rel_waiと wup_tskには次のような違いがある.
• wup_tskは起床待ち状態からのみ待ち解除するが, rel_waiは任意の要因に よる待ち状態から待ち解除する.
• 起床待ち状態になっていたタスクから見ると, wup_tsk による待ち解除は