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

非タスクコンテキストからのサービスコール呼出し

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

第 3 章 µITRON4.0仕様の概念と共通定義 49

3.6 非タスクコンテキストからのサービスコール呼出し

出し

3.6.1 非タスクコンテキストから呼び出せるサービスコール

どのコンテキストからでも呼び出せる一部のサービスコールを除いては,非タ スクコンテキストから呼び出せるサービスコールはサービスコール名に“i”の 文字を付加することとし,タスクコンテキストから呼び出せるサービスコール と区別する.言い換えると,サービスコールは次の3つに分類することができ る.

(a)非タスクコンテキスト専用のサービスコール

図3-4. ディスパッチ保留状態とタスク状態

ディスパ ッチャ タスクA

(優先度低)

タスクB

(優先度高)

割込み ハンドラ

iact_tsk(タスクB)

実行状態実行可能状態 実行可能状態実行状態

サービスコール名が“i”で始まるサービスコールを,非タスクコンテキスト専 用のサービスコールと呼び,名前の通り,非タスクコンテキストから呼び出す ことができる.

非タスクコンテキスト専用のサービスコールがタスクコンテキストから呼び 出された場合には,E_CTXエラーを返す.

【補足説明】

具体的には,次のサービスコールがこれに該当する.

iact_tsk タスクの起動

iwup_tsk タスクの起床

irel_wai 待ち状態の強制解除

iras_tex タスク例外処理の要求

isig_sem セマフォ資源の返却

iset_flg イベントフラグのセット

ipsnd_dtq データキューへの送信(ポーリング)

ifsnd_dtq データキューへの強制送信

isig_tim タイムティックの供給

irot_rdq タスクの実行順位の回転

iget_tid 実行状態のタスクIDの参照

iloc_cpu CPUロック状態への移行

iunl_cpu CPUロック状態の解除

(b)どのコンテキストからでも呼び出せるサービスコール

サービスコール名がsns_yyyの形のサービスコールは,どのコンテキストから でも呼び出すことができる.すなわち,タスクコンテキスト,非タスクコンテ キストのいずれからも呼び出すことができる.

【補足説明】

具体的には,次のサービスコールがこれに該当する.

sns_ctx コンテキストの参照

sns_loc CPUロック状態の参照

sns_dsp ディスパッチ禁止状態の参照

sns_dpn ディスパッチ保留状態の参照

sns_tex タスク例外処理禁止状態の参照

(c) タスクコンテキスト専用のサービスコール

その他のサービスコールを,タスクコンテキスト専用のサービスコールと呼 び,名前の通り,タスクコンテキストから呼び出すことができる.

タスクコンテキスト専用のサービスコールが非タスクコンテキストから呼び 出された場合には,E_CTXエラーを返す.

【補足説明】

実装独自の拡張として,(同等の機能を持つ非タスクコンテキスト専用のサー

ビスコールが用意されていないサービスコールに対して)非タスクコンテキス ト専用のサービスコールを追加すること,非タスクコンテキスト専用のサービ スコールをタスクコンテキストからも呼び出せるようにすること,タスクコン テキスト専用のサービスコールを非タスクコンテキストからも呼び出せるよ うにすることは,いずれも許される.詳しくは,3.6.3節を参照すること.

【µITRON3.0仕様との相違】

非タスクコンテキスト専用のサービスコールを,“i”で始まる名称にすること を規定した.また,どのサービスコールに対してそれと同等の機能を持つ非タ スクコンテキスト専用のサービスコールを用意するかを明確に規定し,機能 コ ー ド は 規 定 し た サ ー ビ ス コ ー ル に 対 し て の み 割 り 付 け た.そ の た め,

µITRON3.0仕様で機能コードを割り付けた非タスクコンテキスト専用のサー

ビスコールのいくつかに対して,µITRON4.0仕様では機能コードを割り付けて いない.

3.6.2 サービスコールの遅延実行

長い割込み禁止区間を設けずにサービスコールの不可分性を保証することを 可能にするために,非タスクコンテキストから呼び出されたサービスコールの 実行を,最大限,ディスパッチャよりも高い優先順位を持つ処理の実行が終わ るまで遅延することができる.これを,サービスコールの遅延実行と呼ぶ.

ただし,次のサービスコールを遅延実行することは許されない.

iget_tid 実行状態のタスクIDの参照

iloc_cpu CPUロック状態への移行

iunl_cpu CPUロック状態の解除

sns_ctx コンテキストの参照

sns_loc CPUロック状態の参照

sns_dsp ディスパッチ禁止状態の参照

sns_dpn ディスパッチ保留状態の参照

sns_tex タスク例外処理禁止状態の参照

サービスコールを遅延実行する場合にも,遅延実行することを許されないもの を除いて,サービスコールの実行順序がサービスコールの呼び出された順序に 一致しなければならない.

遅延実行を認めた結果,非タスクコンテキストから呼び出したサービスコール に対して,操作対象のオブジェクトの状態に依存して発生するエラーをサービ スコール呼出し時に検出できなくなり,遅延実行しない場合と同じエラーコー ドを返せなくなる場合がある.このような場合には,遅延実行しない場合に返 るエラーコードに代えて,E_OKを返すことができる.実際にどのようなエラー 時にエラーコードを返すことを省略できるかは,サービスコール毎に定める.

サービスコールを遅延実行するために,遅延実行すべきサービスコールを記憶 しておく必要がある.そのためのメモリ領域が不足した場合には,サービス

コールはE_NOMEMエラーを返さなければならない.

【補足説明】

サービスコールの実行を実際にどの時点まで遅延させるかは,仕様において規 定された振舞いと同じ振舞いをする限りは自由である.具体的には,ディス パッチ保留状態で呼び出されたサービスコールの実行を,ディスパッチが起こ る状態となるまで遅延できる場合がある.ただしiras_texについては,ディス パッチ禁止状態でも実行しなければならない場合があるので,注意が必要であ る(詳しくは,iras_texの補足説明を参照).

遅延実行されるサービスコールがE_OKを返した場合,後でそのサービスコー ルの処理を呼び出すことを保証しなければならない.

【µITRON3.0仕様との相違】

サービスコールの遅延実行に関して明確に規定することとした.

3.6.3 呼び出せるサービスコールの追加

µITRON4.0仕様にxxx_yyy(またはzxxx_yyy)という名称のタスクコンテキスト

専用のサービスコールが用意されている場合で,非タスクコンテキストから呼 び出せるそれと同等の機能のサービスコールを実装独自に追加する場合には,

実装独自に追加するサービスコール名称の原則(サービスコール名称の前に

“v”を付加する)にかかわらず,ixxx_yyy(またはizxxx_yyy)の名称とする.非 タスクコンテキストから呼び出したサービスコールの遅延実行により,一部の エラーコードを返すことを省略する場合にも,同等の機能であるとみなす.

また,実装独自の拡張として,タスクコンテキスト専用のサービスコールをそ のままの名称で非タスクコンテキストからも呼び出せるようにした場合,呼び 出せるようにしたサービスコール名の前に“i”の文字を付加した名称のサービ スコールを,非タスクコンテキストから呼び出せるようにしなければならな い.逆に,非タスクコンテキスト専用のサービスコールをそのままの名称でタ スクコンテキストからも呼び出せるようにした場合,呼び出せるようにした サービスコール名の先頭の“i”を外した名称のサービスコールを,タスクコン テキストから呼び出せるようにしなければならない.

これらの規則は,実装独自のサービスコールにも同様に適用される.vxxx_yyy という名称のサービスコールを実装独自に用意した場合で,非タスクコンテキ ストからもそれと同等の機能を持つサービスコールを呼び出せるようにする 場合には,少なくともivxxx_yyyという名称で呼び出せるようにしなければなら ない.

【補足説明】

3.6.1節で,タスクコンテキスト専用のサービスコールが非タスクコンテキスト

から呼び出された場合には,E_CTXエラーを返すと規定している.それにもか かわらず,実装独自の拡張として,タスクコンテキスト専用のサービスコール を非タスクコンテキストからも呼び出せるようにすることが許されるのは,次

の理由による.

E_CTXエラーの検出は,実装定義で省略することができる(2.3.2節).一方,

エラーの検出を省略したことにより,本来検出すべきエラーを検出できなかっ た場合の振舞いは,仕様上は未定義である(2.1.6節).仕様上は未定義の事項 を実装独自に規定することは許されるため,タスクコンテキスト専用のサービ スコールが非タスクコンテキストから呼び出された場合の振舞いを,実装独自 に定めることは許される.そのため,実装独自の拡張として,タスクコンテキ スト専用のサービスコールを非タスクコンテキストから呼び出せるようにす ることは許される.

非タスクコンテキスト専用のサービスコールをタスクコンテキストから呼び 出せるようにすることが許されるのも,同じ理由による.

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