TOPPERS Confidential TOPPERSプロジェクト ディスカッションメモ 制約タスクの仕様に関する検討 作成者: 高田広章(名古屋大学) 最終更新: 2010年8月25日 ○メモの位置付け このドキュメントは,TOPPERS/ASPカーネルに制約タスクを導入するための仕様 について検討するものである. ○スタック共有の方針 すべての制約タスクを1つのスタックで実行する方法もあるが,ASPカーネルに 対する修正が大きくなるため採用せず,同じ起動時優先度を持つ制約タスクを 同一のスタックで実行する方針とする. ○μITRON4.0仕様の制約タスクの仕様について μITRON4.0仕様における制約タスクの仕様は,次の通りである(μITRON4.0仕 様 5.2.1節より). ---------------------------------------------------------------------- 制約タスクは,タスクの持つ機能を制限することで,複数のタスクを同一のス タック空間を用いて動作させることを可能にし,それによりタスクのスタック のためのメモリ領域の削減を図るものである.具体的には,制約タスクは,通 常のタスクと比較して以下の制限を持つ. (a) 待ち状態に入ることができない. (b) 優先度を変更することができない. (c) タスク生成時の初期優先度の指定に,式を用いることができない. (d) タスクのメインルーチンからのリターン以外の方法で,タスクを終了する ことはできない. タスクが制約タスクであるかどうかは,タスクの生成時に,タスク属性によっ て指定する. ---------------------------------------------------------------------- (a)の制限は本質的である.上の記述は,自動車制御プロファイルの範囲で記述 してあるために「待ち状態」としてあるが,ASPカーネルに適用する場合には, 「広義の待ち状態」とすべきである. (b)の制限は,緩めることも可能である.具体的には,制約タスクの優先度を, 起動時優先度と同じか,それよりも高い値に設定することは許してもよい.た だし,優先度の変更後は,同じ優先度内で最高優先順位としなければならない ため,chg_priサービスコールとは振舞いが異なることになる. (c)は,μITRON4.0仕様のコンフィギュレーション手順から来る制限であり, TOPPERS新世代カーネルでは必要ない. (d)の制限は,同じ起動時優先度を持つ制約タスクを同一のスタックで実行する 方針としたため,取り払っても問題がない. ここには記載していないが,制約タスクを含むレディキューに対するrot_rdqは, 制限しなければならない. ○ASPカーネルにおける制約タスクの仕様 上述の検討をふまえて,ASPカーネルにおける制約タスクは,通常のタスクと比 較して次の制限を持つものとする. (a) 広義の待ち状態に入ることができない (b) chg_priによりベース優先度を変更することができない (c) 自タスクのベース優先度を(起動時優先度と同じかそれより高い値に)変 更するサービスコールras_priを新設する また,対象優先度の中の先頭のタスクが制約タスクである場合には,rot_rdqは 発行できないものとする. 以上から仕様を具体化すると,次のようになる. (1) CRE_TSKにおいて,タスク属性にTA_RSTRを指定すると,生成されるタスク は制約タスクとなる.制約タスクのスタック領域の先頭番地にNULLを指定した 場合,同じ起動時優先度を持つ制約タスクで,同一のスタック領域が共有され る. (2) 制約タスクが,自タスクを待ち状態にする可能性のあるサービスコールを 呼び出した場合,E_NOSPTエラーとなる. (3) 制約タスクを対象として,wup_tsk,iwup_tsk,can_wup,rel_wai, irel_wai,sus_tsk,rsm_tskを呼び出した場合,E_NOSPTエラーとなる. (4) 制約タスクを対象としてchg_priを呼び出した場合,E_NOSPTエラーとなる. (5) rot_rdq,irot_rdqは,対象優先度を持つ実行できる状態のタスクの中で最 も優先順位が高いタスクが制約タスクである場合,E_NOSPTエラーとなる. (6) 以下の仕様のサービスコールras_priを新設する. ---------------------------------------------------------------------- ras_pri 自タスクのベース優先度の引き上げ〔T〕 【C言語API】 ER ercd = ras_pri(PRI tskpri) 【パラメータ】 PRI tskpri ベース優先度 【リターンパラメータ】 ER ercd 正常終了(E_OK)またはエラーコード 【エラーコード】 E_CTX コンテキストエラー(非タスクコンテキストからの呼出 し,CPUロック状態からの呼出し) E_PAR パラメータエラー(tskpriが不正) E_ILUSE サービスコール不正使用(tskpriが,自タスクの起動時 優先度よりも低い場合.tskpriが,自タスクがロックし ているかロックを待っている優先度上限ミューテックス の上限優先度よりも高い場合) 【機能】 自タスクのベース優先度を,tskpriで指定した優先度に変更する.具体的な振 舞いは以下の通り. 自タスクのベース優先度が,tskpriで指定した優先度に変更される.それに伴っ て,自タスクの現在優先度も変更される. 自タスクが,優先度上限ミューテックスをロックしていない場合には,同じ優 先度のタスクの中で最高優先順位となる.自タスクが,優先度上限ミューテッ クスをロックしている場合には,自タスクの現在優先度が変更されることはな く,優先順位も変更されない. tskpriにTPRI_INI(=0)を指定すると,自タスクのベース優先度が,起動時優 先度に変更される. tskpriは,TPRI_INIであるか,TMIN_TPRI以上,TMAX_TPRI以下でなければなら ない.また,tskpriは,自タスクの起動時優先度と同じかそれよりも高くなけ ればならない.さらに,自タスクが優先度上限ミューテックスをロックしてい るかロックを待っている場合,tskpriは,それらのミューテックスの上限優先 度と同じかそれより低くなければならない. ---------------------------------------------------------------------- 以上