第 3 章 従来機能の変更 25
3.5 拡張同期・通信機能
3.5.1 ミューテックス
ミューテックス機能には,アクセス許可ベクタを指定してミューテックスを生 成する機能と,ミューテックスのアクセス許可ベクタを変更する機能を追加す る.また,参照できるミューテックス状態に追加がある.
ミューテックスをロック解除するサービスコール( unl_mtx)は,ミューテッ クスをロックしたタスクのみが呼び出すことができる.そのため,アクセス許 可ベクタによる保護を行わない.
ミューテックス状態のパケット形式に,アクセス許可ベクタを追加する.
typedef struct t_rmtx {
ID htskid ; /* ミューテックスをロックしているタ
スクの ID番号 */
ID wtskid ; /* ミューテックスの待ち行列の先頭の
タスクの ID番号 */
ACVCT acvct ; /* ミューテックスのアクセス許可ベク
タ */
/* 実装独自に他のフィールドを追加してもよい */
} T_RMTX ;
ミューテックス機能の新規サービスコールの機能コードは次の通りである.
TFN_CRA_MTX –0x116 cra_mtxの機能コード TFN_ACRA_MTX –0x126 acra_mtxの機能コード TFN_SAC_MTX –0x136 sac_mtxの機能コード
CRA_MTX
ミューテックスの生成(静的 API,アクセス許可指定)cra_mtx
ミューテックスの生成(アクセス許可指定)acra_mtx
ミューテックスの生成(ID番号自動割付け,アクセス許可指定)【静的 API】
CRA_MTX ( ID mtxid, { ATR mtxatr, PRI ceilpri }, ACVCT acvct ) ;
【 C言語 API】
ER ercd = cra_mtx ( ID mtxid, T_CMTX *pk_cmtx, ACVCT *p_acvct ) ;
ER_ID mtxid = acra_mtx ( T_CMTX *pk_cmtx, ACVCT *p_acvct ) ;
【パラメータ】
ID mtxid 生成対象のミューテックスの ID番号
T_CMTX * pk_cmtx ミューテックス生成情報を入れたパケットへ
のポインタ(静的 APIではパケットの内容を直 接記述する)
ACVCT acvct ミューテックスのアクセス許可ベクタ
pk_cmtxの内容( T_CMTX型)
ATR mtxatr ミューテックス属性
PRI ceilpri ミューテックスの上限優先度
(実装独自に他の情報を追加してもよい)
【リターンパラメータ】
cra_mtxの場合
ER ercd 正常終了( E_OK)またはエラーコード acra_mtxの場合
ER_ID mtxid 生成したミューテックスの ID番号(正の値)ま
たはエラーコード
【エラーコード】
E_ID 不正 ID番号( mtxidが不正あるいは使用できない)
E_NOID ID番号不足(割付け可能なミューテックス IDがない)
E_RSATR 予約属性( mtxatrが不正あるいは使用できない)
E_PAR パラメータエラー( pk_cmtx, ceilpri, p_acvct, acvct が不正)
E_OBJ オブジェクト状態エラー(対象ミューテックスが登録済
み)
【機能】
mtxidで指定される ID番号を持つミューテックスを, pk_cmtxで指定される ミューテッ クス生成情 報に基づい て生成する. CRE_MTX / cre_mtx/
acre_mtxとの違いは,生成するミューテックスに,acvctで指定されるアクセ ス許可ベクタを設定することのみである.
sac_mtx
ミューテックスのアクセス許可ベクタの変更【 C言語 API】
ER ercd = sac_mtx ( ID mtxid, ACVCT *p_acvct ) ;
【パラメータ】
ID mtxid 変更対象のミューテックスの ID番号
ACVCT acvct ミューテックスのアクセス許可ベクタ
【リターンパラメータ】
ER ercd 正常終了( E_OK)またはエラーコード
【エラーコード】
E_ID 不正 ID番号( mtxidが不正あるいは使用できない)
E_PAR パラメータエラー( p_acvct, acvctが不正)
E_NOEXS オブジェクト未生成(対象ミューテックスが未登録)
【機能】
mtxidで指定されるミューテックスに対するアクセス許可ベクタを, acvctで
指定されるアクセス許可ベクタに設定する.
【補足説明】
このサービスコールは,呼び出された時点ですでにミューテックスの待ち行列 につながれているタスクには影響しない.そのため,ミューテックスの待ち行 列につながれているタスクが,新たに設定したアクセス許可ベクタではミュー テックスをロックすることを許可されていない場合でも,そのタスクはミュー テックスのロック待ち状態のままとなり,ミューテックスがロック解除されれ ば,ミューテックスをロックすることができる.
ref_mtx
ミューテックスの状態参照【 C言語 API】
ER ercd = ref_mtx ( ID mtxid, T_RMTX *pk_rmtx ) ;
【パラメータ】
ID mtxid 状態参照対象のミューテックスの ID番号
T_RMTX * pk_rmtx ミューテックス状態を返すパケットへのポイ
ンタ
【リターンパラメータ】
ER ercd 正常終了( E_OK)またはエラーコード pk_rmtxの内容( T_RMTX型)
ID htskid ミューテックスをロックしているタスクの ID
番号
ID wtskid ミューテックスの待ち行列の先頭のタスクの
ID番号
ACVCT acvct ミューテックスのアクセス許可ベクタ
(実装独自に他の情報を追加してもよい)
【エラーコード】
E_ID 不正 ID番号( mtxidが不正あるいは使用できない)
E_PAR パラメータエラー( pk_rmtxが不正)
E_NOEXS オブジェクト未生成(対象ミューテックスが未登録)
【機能】
mtxidで指定されるミューテックスに関する状態を参照し, pk_rmtxで指定さ れるパケットに返す. µITRON4.0仕様との違いは, acvctに対象ミューテック スのアクセス許可ベクタを返すことのみである.