• 検索結果がありません。

タスク付属同期機能

ドキュメント内 μITRON4.0仕様書(Ver ) (ページ 119-131)

第 4 章 µITRON4.0 仕様の機能 79

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】【B】

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】【B】

iwup_tsk 【S】【B】

【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】【B】

【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】【B】

irel_wai 【S】【B】

【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による待ち解除は正

ドキュメント内 μITRON4.0仕様書(Ver ) (ページ 119-131)