第4章 カーネル API 仕様
4.4 同期・ 通信 機能
4.4.4 優先度デ ータキュー
優先度データキューは,1ワードのデータをメッセージとして,データの優先度順で送受信するための同 期・通信カーネルオブジェクトである.より大きいサイズのメッセージを送受信したい場合には,メッ セージを置いたメモリ領域へのポインタを1ワードのデータとして送受信する方法がある.優先度データ キューは,優先度データキューIDと呼ぶID番号によって識別する【NGKI1791】.
各優先度データキューが持つ情報は次の通り【NGKI1792】.
• 優先度データキュー属性
• 優先度データキュー管理領域
• 送信待ち行列(優先度データキューへの送信待ち状態のタスクのキュー)
• 受信待ち行列(優先度データキューからの受信待ち状態のタスクのキュー)
• 送信できるデータ優先度の最大値
• アクセス許可ベクタ(保護機能対応カーネルの場合)
• 属する保護ドメイン(保護機能対応カーネルの場合)
• 属するクラス(マルチプロセッサ対応カーネルの場合)
優先度データキュー管理領域は,優先度データキューに送信されたデータを,データの優先度順に格納し ておくためのメモリ領域である.優先度データキュー生成時に,優先度データキュー管理領域に格納でき るデータ数を0とすることで,優先度データキュー管理領域のサイズを0とすることができる【
NGKI1793】.
保護機能対応カーネルにおいて,優先度データキュー管理領域は,カーネルの管理領域として扱われる
【NGKI1794】.
送信待ち行列は,優先度データキューに対してデータが送信できるまで待っている状態(優先度データキ ューへの送信待ち状態)のタスクが,データを送信できる順序でつながれているキューである.また,受 信待ち行列は,優先度データキューからデータが受信できるまで待っている状態(優先度データキューか らの受信待ち状態)のタスクが,データを受信できる順序でつながれているキューである.
優先度データキュー属性には,次の属性を指定することができる【NGKI1795】.
TA_TPRI 0x01U 送信待ち行列をタスクの優先度順にする
TA_TPRIを指定しない場合,送信待ち行列はFIFO順になる【NGKI1796】.受信待ち行列は,FIFO順に固 定されている【NGKI1797】.
優先度データキュー機能に関連するカーネル構成マクロは次の通り.
TMIN_DPRI データ優先度の最小値(=1) 【NGKI1798】 TMAX_DPRI データ優先度の最大値
TNUM_PDQID 登録できる優先度データキューの数(動的生成対応でないカーネルでは,静的A PIによって登録された優先度データキューの数に一致)【NGKI1799】
【TOPPERS/ASP3カーネルにおける規定】
ASP3カーネルでは,データ優先度の最大値(TMAX_DPRI)は16に固定されている【ASPS0138】.ただ し,タスク優先度拡張パッケージでは,TMAX_DPRIを256に拡張する【ASPS0139】.
【TOPPERS/FMP3カーネルにおける規定】
FMP3カーネルでは,データ優先度の最大値(TMAX_DPRI)は16に固定されている【FMPS0124】.
【TOPPERS/HRP3カーネルにおける規定】
HRP3カーネルでは,データ優先度の最大値(TMAX_DPRI)は16に固定されている【HRPS0124】.
【使用上の注意】
データの優先度が使われるのは,データが優先度データキュー管理領域に格納される場合のみであり,
データを送信するタスクが送信待ち行列につながれている間には使われない.そのため,送信待ち行列に つながれているタスクが,優先度データキュー管理領域に格納されているデータよりも高い優先度のデー タを送信しようとしている場合でも,最初に送信されるのは,優先度データキュー管理領域に格納されて いるデータである.また,TA_TPRI属性の優先度データキューにおいても,送信待ち行列はタスクの優先 度順となり,タスクが送信しようとしているデータの優先度順となるわけではない.
【μITRON4.0仕様との関係】
μITRON4.0仕様に規定されていない機能である.
CRE_PDQ 優先度デ ータキューの生成 〔S〕 【 NGKI1800 】 acre_pdq 優先度デ ータキューの生成 〔TD〕 【 NGKI1801 】
【静的API】
CRE_PDQ(ID pdqid, { ATR pdqatr, uint_t pdqcnt, PRI maxdpri, void *pdqmb })
§ pdqmbの記述は省略することができる【NGKI3902】.
【C言語API】
ER_ID pdqid = acre_pdq(const T_CPDQ *pk_cpdq)
【パラメータ】
ID pdqid 生成する優先度データキューのID番号(CRE_PDQの場合)
T_CPDQ * pk_cpdq 優先度データキューの生成情報を入れたパケットへのポインタ(静 的APIを除く)
*優先度データキューの生成情報(パケットの内容)
ATR pdqatr 優先度データキュー属性
uint_t pdqcnt 優先度データキュー管理領域に格納できるデータ数 PRI maxdpri 優先度データキューに送信できるデータ優先度の最大値
void * pdqmb 優先度データキュー管理領域の先頭番地
【リターンパラメータ】
ER_ID pdqid 生成された優先度データキューのID番号(正の値)またはエラーコ
ード
【エラーコード】
E_CTX コンテキストエラー
・非タスクコンテキストからの呼出し〔s〕【NGKI1802】
・CPUロック状態からの呼出し〔s〕【NGKI1803】
E_RSATR 予約属性
・pdqatrが無効【NGKI1804】
・属する保護ドメインの指定が有効範囲外〔sP〕【NGKI1805】
・属するクラスの指定が有効範囲外〔sM〕【NGKI1806】
・クラスの囲みの中に記述されていない〔SM〕【NGKI1807】 E_NOSPT 未サポート機能
・条件については各カーネルにおける規定の項を参照
E_PAR パラメータエラー
・maxdpriが有効範囲(TMIN_DPRI以上TMAX_DPRI以下)外【NGKI1819】
・その他の条件については機能の項を参照
E_OACV オブジェクトアクセス違反
・属する保護ドメイン(または無所属)に対する通常操作1が許可されていない
〔sP〕【NGKI3970】
E_MACV メモリアクセス違反
・pk_cpdqが指すメモリ領域への読出しアクセスが許可されていない〔sP〕【N GKI1809】
E_NOID ID番号不足
・割り付けられる優先度データキューIDがない〔sD〕【NGKI1810】 E_NOMEM メモリ不足
・優先度データキュー管理領域が確保できない【NGKI1811】
E_OBJ オブジェクト状態エラー
・pdqidで指定した優先度データキューが登録済み〔S〕【NGKI1812】
・その他の条件については機能の項を参照
【機能】
各パラメータで指定した優先度データキューの生成情報に従って,優先度データキューを生成す
る.pdqcntとpdqmbから優先度データキュー管理領域が設定され,格納されているデータがない状態に 初期化される【NGKI1813】.また,送信待ち行列と受信待ち行列は,空の状態に初期化される
【NGKI1814】.
静的APIにおいては,pdqidはオブジェクト識別名,pdqatr,pdqcnt,maxdpriは整数定数式パラメー タ,pdqmbは一般定数式パラメータである【NGKI1815】.コンフィギュレータは,静的APIのメモリ不 足(E_NOMEM)エラーを検出することができない【NGKI1816】.
pdqmbをNULLとするか,静的APIにおいてpdqmbの記述を省略した場合,pdqcntで指定した数のデー タを格納できる優先度データキュー管理領域が,コンフィギュレータまたはカーネルにより確保される
【NGKI1817】.
〔pdqmbにNULL以外を指定した場合〕
pdqmbにNULL以外を指定した場合,pdqmbを先頭番地とする優先度データキュー管理領域は,アプリ ケーションで確保しておく必要がある【NGKI1820】.優先度データキュー管理領域をアプリケーション で確保するために,次のマクロを用意している【NGKI1821】.
TSZ_PDQMB(pdqcnt) pdqcntで指定した数のデータを格納できる優先度データキュー管理 領域のサイズ(バイト数)
TCNT_PDQMB(pdqcnt) pdqcntで指定した数のデータを格納できる優先度データキュー管理 領域を確保するために必要なMB_T型の配列の要素数
これらを用いて,pdqcntで指定した数のデータを格納できる優先度データキュー管理領域を確保する方法 は次の通り【NGKI1822】.
MB_T <優先度データキュー管理領域の変数名>[TCNT_PDQMB(pdqcnt)];
この時,pdqmbには<優先度データキュー管理領域の変数名>を指定する【NGKI1823】.
この方法に従わず,pdqmbにターゲット定義の制約に合致しない先頭番地を指定した時には,E_PARエ ラーとなる【NGKI1824】.また,保護機能対応カーネルにいて,pdqmbで指定した優先度データキュー
管理領域がカーネル専用のメモリオブジェクトに含まれない場合,E_OBJエラーとなる【NGKI1825】.
【TOPPERS/ASP3カーネルにおける規定】
ASP3カーネルでは,pdqmbにはNULLのみを指定することができる.NULL以外を指定した場合に は,E_NOSPTエラーとなる【ASPS0142】.ASP3カーネルの動的生成機能拡張パッケージで
は,acre_pdqをサポートする【ASPS0143】.acre_pdqに対しては,pdqmbにNULL以外を指定できない という制限はない【ASPS0144】.
【TOPPERS/FMP3カーネルにおける規定】
FMP3カーネルでは,pdqmbにはNULLのみを指定することができる.NULL以外を指定した場合に は,E_NOSPTエラーとなる【FMPS0127】.
【TOPPERS/HRP3カーネルにおける規定】
HRP3カーネルでは,pdqmbにはNULLのみを指定することができる.NULL以外を指定した場合に は,E_NOSPTエラーとなる【HRPS0127】.HRP3カーネルの動的生成機能拡張パッケージで
は,acre_pdqをサポートする【HRPS0190】.acre_pdqに対しては,pdqmbにNULL以外を指定できな いという制限はない【HRPS0191】.
AID_PDQ 割 付 け 可 能な 優先度デ ータキュー ID の 数 の指定 〔SD〕 【 NGKI1826 】
【静的API】
AID_PDQ(uint_t nopdq)
【パラメータ】
uint_t nopdq 割付け可能な優先度データキューIDの数
【エラーコード】
E_RSATR 予約属性
・クラスの囲みの中に記述されていない〔M〕【NGKI1827】
【機能】
nopdqで指定した数の優先度データキューIDを,優先度データキューを生成するサービスコールによって 割付け可能な優先度データキューIDとして確保する【NGKI1828】.
nopdqは整数定数式パラメータである【NGKI1829】.
【TOPPERS/ASP3カーネルにおける規定】
ASP3カーネルの動的生成機能拡張パッケージでは,AID_PDQをサポートする【ASPS0214】.
【TOPPERS/HRP3カーネルにおける規定】
HRP3カーネルの動的生成機能拡張パッケージでは,AID_PDQをサポートする【HRPS0215】.