この章の目次にもどる
前頁:第2章 I-right/V の概要にもどる
次頁:第5章 ITRON拡張機能にすすむ

第3章 全般

3.1 オブジェクトID

負のオブジェクト ID はシステムオブジェクト、 正のオブジェクト ID はユーザオブジェクトを表す。 (-4)〜0 のオブジェクト ID は予約されており、 システムが利用するオブジェクトが割り当てられている場合を除いては、 利用できない。

システムオブジェクトをアクセスする権利を持つのは、 タスク独立部実行中、準タスク部実行中、システムタスク ( タスク ID が負のオブジェクト ) 実行中およびリングレベル 0 で動作しているユーザタスク実行中においてである ( タスクのリングレベルについては、「cre_tsk」の項を参照 )。 μITRON3.0 仕様の規定との違いは、正の ID のユーザタスクであっても、 リングレベル 0 で動いている場合には、 システムタスクと同じアクセス権を持っていることである。 システムオブジェクトをアクセスする権利を持たない環境から、 システムオブジェクトをアクセスするシステムコールを発行した場合、 E_OACVエラーとなる。

3.2 優先度値

(-4)〜0 の優先度は予約されており、利用できない。

3.3 時間パラメータ

I-right/V では、時間を表すパラメータ (SYSTIME, CYCTIME, ALMTIME, DLYTIME, TMO 型のもの) の時間の単位は1ミリ秒です。
ただし、時間の分解能は10ミリ秒です。

3.4 エラーチェック

I-right/V では、カーネルが以下のエラーを報告することはない。

E_SYS システムエラー
E_INOSPTITRON/FILE での未サポート機能
E_MACV メモリアクセス不能、メモリアクセス権違反
EN_???? 接続機能に関するエラー

また、パラメータとしてポインタを渡すシステムコールに対して、 存在しないメモリ番地をアクセスするようなポインタを渡した場合は、 エラーとしては検出されない。 この場合、システムダウンとなる。

同様に、非常駐メモリの番地をパラメータとすることはできない。 ページアウトされていた場合、メモリが存在しない場合と同じことになり、 システムダウンとなる。

参考 :
BTRON システムコールにおいては、この限りではない。 存在しないメモリを指定した場合は、エラーとして検出される。 また、非常駐メモリも正しく処理される。 システムダウンとなることはない。

3.5 準タスク部

準タスク部とは、 タスクのコンテキストを持ちながら ハンドラを実行している状態のことをいう。
準タスク部実行中は、タスクディスパッチが可能であり、 遅延割込みの原則は準タスク部には適用されない。 また、準タスク部の中から、 自タスクを待ち状態にするシステムコールを発行することができる。

I-right/V では、 準タスク部になるのは、 拡張 SVC ハンドラ実行中のみである (ただし、タスク独立部から呼び出された拡張SVCハンドラ実行中は、 準タスク部ではなく、タスク独立部であると扱われる)。 将来的に接続機能がサポートされる場合、 接続機能をサポートするシステムコールは 準タスク部で実現されることになる。 そのため、準タスク部で実現されている拡張 SVC や接続機能をサポートするシステムコールに対しては、 システムコールの不可分性は適用されない。

3.6 タスク、ハンドラの起動インタフェース

3.6.1 タスク起動インタフェース

タスク起動のコンベンションは、 C 言語の関数呼び出しのコンベンションと同じになっている。 μITRON3.0 仕様ではタスクの起動パラメータはスタートコード (stacd) のみであるが、 I-right/V ではタスク拡張情報(exinf) もパラメータとして渡される。

タスクを C 言語で記述する時は、

    void    task_entry(INT stacd, VP exinf)

の形で書く。 拡張情報が必要ない場合は、VP exinf は省略できる。
タスクを終了する場合は、ext_tsk ないしは exd_tsk を用いる。 単に return した場合の動作は保証されない。

3.6.2 タイマハンドラ (周期起動ハンドラ、アラームハンドラ)

タイマハンドラの起動は、 C 言語の関数呼び出しのコンベンションと同じになっている。 μITRON3.0 仕様では、タイマハンドラに渡されるパラメータはないが、 I-right/V ではタイマハンドラの拡張情報が渡される。

タイマハンドラを C言語で記述する時は、

    void    timer_handler(VP exinf)

の形で書く。 拡張情報が必要ない場合は、 VP exinfは省略できる。 タイマハンドラから戻る際は、単に return する。

3.6.3 拡張SVCハンドラ

拡張 SVC ハンドラについては、 6.8 def_svc() を参照のこと。

3.6.4 割込みハンドラ

割込みハンドラについては、 6.9 def_int() を参照のこと。

3.7 タスク独立部から発行できるシステムコール

μITRON3.0 仕様では、 タスク独立部から発行できるシステムコールはインプリメント依存としているが、 I-right/V では、 仕様書で明示的に発行できないとされているシステムコールに加えて、 以下に挙げるシステムコールをタスク独立部から呼び出すことはできない。 これ以外のシステムコールは、 すべてタスク独立部から呼び出すことができる。

ter_tsk をタスク独立部から呼び出せるように改造することも可能であるが、 有用性とオーバーヘッドを比べた場合に、 それほどメリットはない。
また将来的には、cre_???del_???、 一部のdef_???、一部のref_??? などのシステムコールを タスク独立部から呼ぶことを禁止するかもしれない。

μITRON3.0 仕様で認められている タスク独立部からシステムコールを呼ぶ場合に i???_??? の名称を用いるという方法は採用していない。

第4章 システムコール

以下では、各システムコールの仕様について、 μITRON3.0 仕様でインプリメント依存となっている部分、 および I-right/V での拡張機能を中心に述べる。

4.1 タスク管理機能

cre_tsk
タスク生成
del_tsk
タスク削除

なし

sta_tsk
タスク起動
ext_tsk
自タスク終了
exd_tsk
自タスクの終了と削除
ter_tsk
他タスク強制終了
dis_dsp
ディスパッチ禁止

なし

ena_dsp
ディスパッチ許可

なし

chg_pri
タスク優先度変更
rot_rdq
タスクのレディキュー回転
rel_wai
他タスクの待ち状態解除
get_tid
自タスクのタスクID参照

なし

ref_tsk
タスク状態参照

4.2 タスク付属同期機能

sus_tsk
他タスクを強制待ち状態へ移行
rsm_tsk
強制待ち状態のタスクを再開
frsm_tsk
強制待ち状態のタスクを強制再開
slp_tsk
自タスクを起床待ち状態へ移行
tslp_tsk
自タスクを起床待ち状態へ移行(タイムアウト有)
wup_tsk
他タスクの起床
can_wup
他タスクの起床要求を無効化

なし

4.3 同期・通信機能

cre_sem
セマフォ生成
del_sem
セマフォ削除

なし

sig_sem
セマフォ資源返却
wai_sem
セマフォ資源獲得
pwai_sem
セマフォ資源獲得(ポーリング)
twai_sem
セマフォ資源獲得(タイムアウト有)

なし

ref_sem
セマフォ状態参照
cre_flg
イベントフラグ生成
del_flg
イベントフラグ削除

なし

set_flg
イベントフラグのセット
clr_flg
イベントフラグのクリア

なし

wai_flg
イベントフラグ待ち
pol_flg
イベントフラグ待ち(ポーリング)
twai_flg
イベントフラグ待ち(タイムアウト有)

なし

ref_flg
イベントフラグ状態参照
cre_mbx
メイルボックス生成
del_mbx
メイルボックス削除

なし

snd_mbx
メイルボックスへの送信
rcv_msg
メイルボックスから受信
prcv_msg
メイルボックスから受信(ポーリング)
trcv_msg
メイルボックスから受信(タイムアウト有)
ref_mbx
メイルボックス状態参照

4.4 拡張同期・通信機能

cre_mbf
メッセージバッファ生成
del_mbf
メッセージバッファ削除

なし

snd_mbf
メッセージバッファへ送信
psnd_mbf
メッセージバッファへ送信(ポーリング)
tsnd_mbf
メッセージバッファへ送信(タイムアウト有)
rcv_mbf
メッセージバッファから受信
prcv_mbf
メッセージバッファから受信(ポーリング)
trcv_mbf
メッセージバッファから受信(タイムアウト有)
ref_mbf
メッセージバッファ状態参照
cre_por
ランデブ用のポート生成
del_por
ランデブ用のポート削除
cal_por
ポートに対するランデブの呼出
pcal_por
ポートに対するランデブの呼出(ポーリング)
tcal_por
ポートに対するランデブの呼出(タイムアウト有)

なし

acp_por
ポートに対するランデブ受付
pacp_por
ポートに対するランデブ受付(ポーリング)
tacp_por
ポートに対するランデブ受付(タイムアウト有)

なし

fwd_por
ポートに対するランデブ回送

なし

rpl_rdv
ランデブ返答
ref_por
ポート状態参照

4.5 割込み管理機能

def_int
割込みハンドラ定義
ret_int
割込みハンドラから復帰
ret_wup
割込みハンドラ復帰とタスク起床
loc_cpu
割込みとディスパッチの禁止

なし

unl_cpu
割込みとディスパッチの許可

なし

dis_int
割込み禁止
ena_int
割込み許可
chg_ims
割込みマスク変更

I-right/Vではサポートしていない。

ref_ims
割込みマスク参照

I-right/Vではサポートしていない。

4.6 メモリプール管理機能

メモリは周辺核 ( BTRON メモリー管理 ) で管理されているため、 I-right/V にはメモリプール管理機能はない。

cre_mpl
可変長メモリプール生成
del_mpl
可変長メモリプール削除

なし

get_blk
可変長メモリブロック獲得
pget_blk
可変長メモリブロック獲得 (ポーリング)
tget_blk
可変長メモリブロック獲得 (タイムアウト有)
rel_blk
可変長メモリブロック返却
ref_mpl
可変長メモリプール状態参照
cre_mpf
固定長メモリプール生成
del_mpf
固定長メモリプール削除

なし

get_blf
固定長メモリブロック獲得
pget_blf
固定長メモリブロック獲得 (ポーリング)
tget_blf
固定長メモリブロック獲得 (タイムアウト有)
rel_blf
固定長メモリブロック返却

なし

rel_mpf
固定長メモリプール状態参照

4.7 時間管理機能

set_tim
システムクロック設定

なし

get_tim
システムクロック参照

なし

dly_tsk
タスク遅延

なし

def_cyc
周期起動ハンドラ定義
act_cyc
周期起動ハンドラ活性制御
ref_cyc
周期起動ハンドラ状態参照
def_alm
アラームハンドラ定義
ref_alm
アラームハンドラ状態参照
ret_tmr
タイマハンドラから復帰

4.8 システム管理機能

get_ver
バージョン参照
ref_sys
システム状態参照
ref_chg
コンフィグレーション情報参照
なし
def_svc
拡張SVCハンドラ定義
def_exc
例外ハンドラ定義

4.9 ネットワークサポート機能

4.10 ID自動割当機能

vcre_tsk
タスク生成 (ID自動割当)(機能コード: -241)
【パラメータ】
T_CTSK* pk_ctsk     タスク生成情報
【リターンパラメータ】
ER      ercd        生成したタスクのID, エラーコード
【C言語インタフェース】
ER ercd =vcre_tsk(T_CTSK *pk_ctsk);
【解説】

ID 番号を指定せずにタスクを生成し、 生成したタスクの ID (必ず正の値) をercd に返す。 ercdが負の場合は、エラーコードを表す。 割り当て可能な ID がない場合、EV_FULL エラーとなる。 その他については、cre_tsk と同じである。

vcre_sem
セマフォ生成 (ID自動割当)(機能コード: -242)
【パラメータ】
T_CSEM* pk_csem     セマフォ生成情報
【リターンパラメータ】
ER      ercd        生成したセマフォのID, エラーコード
【C言語インタフェース】
ER ercd =vcre_sem(T_CSEM *pk_csem);
【解説】

ID番号を指定せずにセマフォを生成し、 生成したセマフォの ID (必ず正の値) を ercd に返す。 ercd が負の場合は、エラーコードを表す。 割り当て可能な ID がない場合、EV_FULL エラーとなる。 その他については、cre_sem と同じである。

vcre_flg
イベントフラグ生成 (ID自動割当)(機能コード: -243)
【パラメータ】
T_CFLG* pk_cflg     イベントフラグ生成情報
【リターンパラメータ】
ER      ercd        生成したイベントフラグのID, エラーコード
【C言語インタフェース】
ER ercd =vcre_flg(T_CFLG *pk_cflg);
【解説】

ID番号を指定せずにイベントフラグを生成し、 生成したイベントフラグの ID (必ず正の値) を ercd に返す。 ercd が負の場合は、エラーコードを表す。 割り当て可能な ID がない場合、EV_FULL エラーとなる。 その他については、cre_flg と同じである。

vcre_mbx
メイルボックス生成 (ID自動割当)(機能コード: -244)
【パラメータ】
T_CMBX* pk_cmbx     メイルボックス生成情報
【リターンパラメータ】
ER      ercd        生成したメイルボックスのID, エラーコード
【C言語インタフェース】
ER ercd =vcre_mbx(T_CMBX *pk_cmbx);
【解説】

ID番号を指定せずにメイルボックスを生成し、 生成したメイルボックスの ID (必ず正の値) を ercd に返す。 ercd が負の場合は、エラーコードを表す。 割り当て可能な ID がない場合、 EV_FULL エラーとなる。 その他については、cre_mbx と同じである。

vcre_mbf
メッセージバッファ生成 (ID自動割当)(機能コード: -245)
【パラメータ】
T_CMBF* pk_cmbf     メッセージバッファ生成情報
【リターンパラメータ】
ER      ercd        生成したメッセージバッファのID, エラーコード
【C言語インタフェース】
ER ercd =vcre_mbf(T_CMBF *pk_cmbf);
【解説】

ID番号を指定せずにメッセージバッファを生成し、 生成したメッセージバッファの ID (必ず正の値) を ercd に返す。 ercd が負の場合は、エラーコードを表す。 割り当て可能な ID がない場合、EV_FULL エラーとなる。 その他については、cre_mbf と同じである。

vcre_por
ランデブ用のポート生成 (ID自動割当)(機能コード: -246)
【パラメータ】
T_CPOR* pk_cpor     ランデブ用ポート生成情報
【リターンパラメータ】
ER      ercd        生成したランデブ用ポートのID, エラーコード
【C言語インタフェース】
ER ercd =vcre_por(T_CPOR *pk_cpor);
【解説】

ID番号を指定せずにランデブ用ポートを生成し、 生成したランデブ用ポートの ID (必ず正の値) を

ercd
に返す。 ercd が負の場合は、エラーコードを表す。 割り当て可能な ID がない場合、EV_FULL エラーとなる。 その他については、cre_por と同じである。

vcre_mpl
可変長メモリプール生成 (ID自動割当)(機能コード: -247)
【パラメータ】
T_CMPL* pk_cmpl     可変長メモリプール生成情報
【リターンパラメータ】
ER      ercd        生成した可変長メモリプールのID, エラーコード
【C言語インタフェース】
ER ercd =vcre_mpl(T_CMPL *pk_cmpl);
【解説】

ID番号を指定せずに可変長メモリプールを生成し、 生成した可変長メモリプールの ID (必ず正の値) を ercd に返す。 ercd が負の場合は、エラーコードを表す。 割り当て可能な ID がない場合、EV_FULLエラーとなる。 その他については、cre_mpl と同じである。

vcre_mpf
固定長メモリプール生成 (ID自動割当)(機能コード: -248)
【パラメータ】
T_CMPF* pk_cmpf     固定長メモリプール生成情報
【リターンパラメータ】
ER      ercd        生成した固定長メモリプールのID, エラーコード
【C言語インタフェース】
ER ercd =vcre_mpf(T_CMPF *pk_cmpf);
【解説】

ID番号を指定せずに固定長メモリプールを生成し、 生成した固定長メモリプールの ID (必ず正の値) を ercd に返す。 ercd が負の場合は、エラーコードを表す。 割り当て可能な ID がない場合、EV_FULLエラーとなる。 その他については、cre_mpf と同じである。

vdef_cyc
周期起動ハンドラ定義 (ID自動割当)(機能コード: -255)
【パラメータ】
T_DCYC* pk_dcyc     周期起動ハンドラ定義情報
【リターンパラメータ】
ER      ercd        定義した周期起動ハンドラの番号, エラーコード
【C言語インタフェース】
ER ercd =vdef_cyc(T_DCYC *pk_dcyc);
【解説】

番号を指定せずに周期起動ハンドラを定義し、 定義した周期起動ハンドラの番号 (必ず正の値) を ercd に返す。 ercd が負の場合は、エラーコードを表す。 割り当て可能な番号がない場合、EV_FULLエラーとなる。 また、pk_dcyc = NADR として、 周期起動ハンドラの定義解除を行う機能はない。 その他については、def_cyc と同じである。

vdef_alm
アラームハンドラ定義(機能コード: -256)
【パラメータ】
T_DALM* pk_dalm     アラームハンドラ定義情報
【リターンパラメータ】
ER      ercd        定義したアラームハンドラの番号, エラーコード
【C言語インタフェース】
ER ercd =vdef_alm(T_DALM *pk_dalm);
【解説】

番号を指定せずにアラームハンドラを定義し、 定義したアラームハンドラの番号 (必ず正の値) を ercd に返します ercd が負の場合は、エラーコードを表す。 割り当て可能な番号がない場合、EV_FULLエラーとなる。 また、pk_dalm = NADR として、 アラームハンドラの定義解除を行う機能はない。 その他については、def_alm と同じである。

4.11 デバッグサポート機能

vset_reg
タスクのレジスタ内容設定(機能コード: -225)
    vset_reg: Set Task Registers
【パラメータ】
    ID          tskid       タスクID
    T_REGS*     pk_regs     汎用レジスタの値を入れるパケット
    T_EIT*      pk_eit      PC と PSW の値を入れるパケット
    T_CREGS*    pk_cregs    制御レジスタの値を入れるパケット
【リターンパラメータ】
ER      ercd        エラーコード
【C言語インタフェース】
ER ercd = vset_reg(ID tskid, T_REGS *pk_regs, T_EIT *pk_eit,
                             T_CREGS *pk_cregs);
【解説】
6.13 vget_reg()/vset_reg()を参照のこと。
【エラーコード(ercd)】
E_OK 正常終了
E_ID 不正ID番号 (tskidが不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskid のタスクが存在しない)
E_OACV オブジェクトアクセス権違反
E_OBJ オブジェクトの状態が不正 (対象タスクが自タスク)
E_PAR パラメータエラー(psw が不正)
E_CTX コンテキストエラー(タスク独立部からの発行)
vget_reg
タスクのレジスタ内容参照(機能コード: -226)
    vget_reg: Get Task Registers
【パラメータ】
    ID          tskid       タスクID
    T_REGS*     pk_regs     汎用レジスタの値を入れるパケット
    T_EIT*      pk_eit      PC と PSW の値を入れるパケット
    T_CREGS*    pk_cregs    制御レジスタの値を入れるパケット
【リターンパラメータ】
ER      ercd        エラーコード
【C言語インタフェース】
ER ercd =vget_reg(T_REGS *pk_regs, T_EIT *pk_eit, T_CREGS *pk_cregs,
                            ID tskid);
【解説】
6.13 vget_reg()/vset_reg()を参照のこと。
【エラーコード(ercd)】
E_OK 正常終了
E_ID 不正ID番号(tskidが不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(tskidのタスクが存在しない)
E_OACV オブジェクトアクセス権違反
E_OBJ オブジェクトの状態が不正(対象タスクが自タスク)
E_CTX コンテキストエラー(タスク独立部からの発行)

4.12 性能評価用システム時刻参照機能

vget_tim
性能評価用システム時刻参照(機能コード: -82)
    vget_tim: Get Time for Performance Evaluation

I-right/Vではサポートしない。

4.13 優先度継承セマフォ機能

4.13.1 優先度継承セマフォについて

優先度継承とは、 優先度逆転が上限なく続くこと ( unbounded priority inversion ) を防ぐための仕組みである。 優先度逆転とは、 優先度の高いタスクを実行すべきであるにもかかわらず、 何らかの理由により優先度の低いタスクが実行されている状態をいう。 優先度逆転は、「本来実行すべきタスクが実行されない」 という意味で好ましくない状態であるが、 リソース制約の問題により、 一時的に起こることは避けられない。 そこで、 優先度逆転を短い時間に押える仕組みである優先度継承が重要になる。

優先度継承のコンセプトを一言でいうと、 「他のタスクを待たせているタスクは、 待たされているタスクの優先度を継承する」ということになる。 そのため、本来は、 待ちを伴うタスク間同期・通信機能すべてに関連することになる。

ITRON 仕様に優先度継承を取り込む方法はいくつか考えられるが、 I-right/V ではその検討の一貫として、 優先度継承機能を持ったセマフォをサポートしている。 これを優先度継承セマフォと呼ぶ。 優先度継承セマフォ機能の仕様を検討していくと、 理想的だが実装負荷が大きい ( 実行効率が悪い, カーネルサイズが大きい ) 仕様と、 実装負荷は軽いが使用にあたって制約がある仕様が考えられる。 どちらの仕様が良いかは、 アプリケーションにもより一概には決められない。

I-right/V では、前者の ( 理想的だが効率が悪い方の ) 仕様を仕様1、 後者の ( 効率は良いが制約がある方の ) 仕様を仕様2 と呼ぶ。 I-right/V では、仕様1 ( デフォルト ) を用いる。

優先度継承セマフォに関する詳しい議論については、 以下の参考文献を参照のこと。

[1] L. Sha, R. Rajkumar, and J. P. Lehoczky, "Priority Inheritance Protocols: An Approach to Real-Time Synchronization," IEEE Trans. Computers, vol. 39, pp. 1175-1185, Sep. 1990.

[2] H. Takada and K. Sakamura, "Experimental Implementations of Priority Inheritance Semaphore on ITRON-specification Kernel", Proc. 11th TRON Project International Symposium, pp. 106-113, IEEE CS Press, Dec. 1994.

4.13.2 仕様1 における優先度継承セマフォ機能の仕様

I-right/V では、以下に述べる仕様1 の仕様を用いている。

仕様1 における優先度継承セマフォ機能では、 chg_pri を使わない場合のタスクの優先度は、 そのタスクの初期優先度と、 そのタスクが獲得している優先度継承セマフォを待っている中で 最高優先度のタスクの優先度との、 高い ( 値が小さい ) 方に設定される。 そのために OS は、 タスクが獲得している優先度継承セマフォのリストを管理している。

優先度継承セマフォを獲得 / 解放するタスクの優先度を chg_pri によって変更しても、 優先度継承セマフォの機能によって優先度が変更されると、 chg_pri で設定した優先度は無効になる。 つまり、chg_pri はタスクの現在優先度を 一時的に変更するものということになる。 優先度継承セマフォ機能の実装に chg_pri が使われていると考えるわかりやすいかもしれない。

優先度継承セマフォを待っているタスクの優先度を chg_pri によって変更した場合、 その優先度継承セマフォを獲得しているタスクの 優先度が再計算・変更される場合がある 具体的には、次の 2 つのケースで、優先度の変更が行われる。

  1. 優先度を変更されたタスクの変更後の優先度が、優先度継承セマフォ を獲得しているタスクの現在優先度よりも高い (値が小さい) 場合。

  2. 優先度が変更されたタスクの変更前の優先度が、 優先度継承セマフォを獲得しているタスクの優先度に等しい場合に、 そのタスクの優先度が再計算され、 その結果得られた値が現在優先度と等しくない場合。

仕様1 では、ext_tsk, exd_tsk, ter_tsk によりタスクが終了する場合、 タスクが獲得していた優先度継承セマフォは、OS によって自動的に解放される。

vcre_pis
優先度継承セマフォ生成(機能コード: -257)
    vcre_pis: Create Priority Inheritance Semaphore
【パラメータ】
    ID      pisid       優先度継承セマフォID
    T_CPIS* pk_cpis     優先度継承セマフォ生成情報
【リターンパラメータ】
ER        ercd        エラーコード
【C言語インタフェース】
ER ercd =vcre_pis(ID pisid, T_CPIS *pk_cpis);
【解説】

vcre_pisでは、pisidで指定された ID 番号を持つ優先度継承セマフォを生成する。 具体的には、生成するセマフォに対して管理ブロックを割り付け、 セマフォの初期値を 1 に初期化する。

ID番号の正負の扱いや使用できない範囲、 それらの場合のエラーコード、拡張情報 (exinf) の扱いについては、他の同期・通信オブジェクトと同様である。

pisatr は、下位側がシステム属性を表し、 上位側がインプリメント依存属性を表す。 pisatr のシステム属性の部分では、 次のような指定を行う。

    sematr := TA_TPRI

        TA_TPRI 待ちタスクのキューイングは優先度順

優先度継承セマフォでは、 待ちタスクのキューイングは優先度順でないと意味がないため、 FIFO キューイングは用意していない。 そのため、TA_TPRI を指定しなくても 優先度順のキューイングになるが、 他の同期・通信オブジェクトとの統一性のために、 TA_TPRI を指定してもよいことにしている。

【エラーコード(ercd)】
E_OK 正常終了
E_ID 不正ID番号(pisidが不正あるいは利用できない)
E_RSATR 予約属性(pisatrが不正あるいは利用できない)
E_OBJ オブジェクトの状態が不正 (同一ID番号の優先度継承セマフォが既に存在)
E_OACV オブジェクトアクセス権違反 (システムオブジェクトをアクセスする権利を 持たない環境からの発行で pisid < (-4))
vvcre_pis
優先度継承セマフォ生成 (ID自動割当)(機能コード: -259)
    vvcre_pis: Create Priority Inheritance Semaphore (automatic ID assignment)
【パラメータ】
T_CPIS*   pk_cpis     優先度継承セマフォ生成情報
【リターンパラメータ】
ER      ercd        生成した優先度継承セマフォのID, エラーコード
【C言語インタフェース】
ER ercd =vvcre_pis(T_CPIS *pk_cpis);
【解説】

ID 番号を指定せずに優先度継承セマフォを生成し、 生成した優先度継承セマフォの ID (必ず正の値) を ercdに返す。ercdが負の場合は、 エラーコードを表す。 割り当て可能な ID がない場合、EV_FULL エラーとなる。 その他については、vcre_pisと同じである。

vdel_pis
優先度継承セマフォ削除(機能コード: -258)
    vdel_pis: Delete Priority Inheritance Semaphore
【パラメータ】
ID      pisid       優先度継承セマフォID
【リターンパラメータ】
ER      ercd        エラーコード
【C言語インタフェース】
ER ercd =vdel_pis(ID pisid);
【解説】

pisid で示された優先度継承セマフォを削除する。

本システムコールの発行により、 対象優先度継承セマフォの管理ブロック用の領域は解放される。 また、このシステムコールが終了した後は、 同じ ID 番号の優先度継承セマフォを再び生成することができる。

対象優先度継承セマフォを獲得しているタスクがあった場合、 そのタスクの優先度が再計算・変更される場合がある。 具体的には、そのタスクの現在優先度が、 優先度継承セマフォを待っている中で 最高優先度のタスクの優先度に等しい場合に、 優先度継承セマフォを獲得していたタスクの優先度が再計算され、 その結果得られた値がそのタスクの現在優先度よりも低い (値が大きい) 場合に、優先度の変更が行われる。

対象優先度継承セマフォにおいて条件成立を待っている タスクがあった場合にも、 本システムコールは正常終了するが、 待ち状態にあったタスクにはエラー E_DLT が返される。

【エラーコード(ercd)】
E_OK 正常終了
E_ID 不正ID番号(pisid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない (pisidの優先度継承セマフォが存在していない)
E_OACV オブジェクトアクセス権違反 (システムオブジェクトをアクセスする権利を 持たない環境からの発行で pisid < (-4))
vsig_pis
優先度継承セマフォ資源返却(機能コード: -264)
    vsig_pis: Signal Priority Inheritance Semaphore
【パラメータ】
ID      pisid       優先度継承セマフォID
【リターンパラメータ】
ER      ercd        エラーコード
【C言語インタフェース】
ER ercd =vsig_pis(ID pisid);
【解説】

pisid で示された優先度継承セマフォに対して、 資源を解放する操作を行う。

具体的には、 対象優先度継承セマフォに対して既に待っているタスクがあれば、 待ち行列の先頭のタスクを READY 状態に移す。 この場合、その優先度継承セマフォは獲得された状態のままである。 一方、対象優先度継承セマフォに対して待っているタスクが無ければ、 その優先度継承セマフォが解放される。

このシステムコールをタスク独立部から呼び出すことはできない。 呼び出した場合、E_CTX エラーとなる。 また、獲得されていない、ないしは、 他タスクに獲得されている優先度継承セマフォを解放しようとした場合、 E_OBJ エラーとなる。

優先度継承セマフォを解放することにより、 本システムコールの発行タスクの優先度が再計算・ 変更される場合がある。 具体的には、発行タスクの現在優先度が、 解放した優先度継承セマフォを待っていた中で 最高優先度のタスクの優先度に等しい場合に、 発行タスクの優先度が再計算され、 その結果得られた値がそのタスクの現在優先度よりも低い (値が大きい) 場合に、優先度の変更が行われる。

【エラーコード(ercd)】
E_OK 正常終了
E_ID 不正ID番号(pisid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない (pisidの優先度継承セマフォが存在していない)
E_OACV オブジェクトアクセス権違反 (システムオブジェクトをアクセスする権利を 持たない環境からの発行で pisid < (-4))
E_CTX コンテキストエラー (タスク独立部からの発行)
E_OBJ オブジェクトの状態が不正 (pisid の優先度継承セマフォが獲得されていない。 または、他のタスクが獲得している)
vwai_pis
優先度継承セマフォ資源獲得(機能コード: -261)
vpreq_pis
優先度継承セマフォ資源獲得 (ポーリング)(機能コード: -262)
vtwai_pis
優先度継承セマフォ資源獲得 (タイムアウト有)(機能コード: -263)
    vwai_pis: Wait on Priority Inheritance Semaphore
   vpreq_pis: Poll and Request Priority Inheritance Semaphore
   vtwai_pis: Wait on Priority Inheritance Semaphore with Timeout
【パラメータ (vwai_pis, vpreq_pis の場合) 】
ID      pisid       優先度継承セマフォID
【パラメータ (vtwai_pis の場合) 】
    ID      pisid       優先度継承セマフォID
    TMO     tmout       タイムアウト指定
【リターンパラメータ】
ER      ercd        エラーコード
【C言語インタフェース】
    ER ercd = vwai_pis(ID pisid);
    ER ercd =vpreq_pis(ID pisid);
    ER ercd =vtwai_pis(ID pisid, TMO tmout);
【解説】

vwai_pis では、pisid で示された優先度継承セマフォから、 資源を獲得する操作を行う。 具体的には、対象優先度継承セマフォが獲得されていない場合には、 優先度継承セマフォの獲得に成功する。 この場合、本システムコールの発行タスクは待ち状態に入らず、 実行を継続する。 一方、対象優先度継承セマフォが獲得されている場合には、 本システムコールを発行したタスクは待ち状態に入る。 すなわち、その優先度継承セマフォに対する待ち行列につながれる。

本システムコールを発行したタスクが待ち状態に入る場合、 対象優先度継承セマフォを獲得しているタスクが、 発行タスクの優先度を継承する場合がある。 具体的には、優先度継承セマフォを獲得しているタスクの現在優先度が、 発行タスクの現在優先度よりも低い (値が大きい) 場合に、 優先度の継承が行われる。

vpreq_pis は、wai_pis から待ち状態に入る機能を取り除いたシステムコールです。 一方、vtwai_pis は、wai_pis にタイムアウトの機能を付け加えたシステムコールであり、 tmout により待ち時間の最大値 ( タイムアウト値 ) を指定することができる。 ポーリングやタイムアウトの扱いについては、 他の同期・通信オブジェクトと同様です。

twai_pis または vtwai_pis によって優先度継承セマフォ待ち状態に入ったタスクが、 rel_wai の発行、 タイムアウト ( vtwai_pis のみ )、 ないしは対象優先度継承セマフォの削除によって待ち解除される場合に、 その優先度継承セマフォを獲得しているタスクの 優先度が再計算・変更される場合がある。 具体的には、そのタスクの現在優先度が、 待ち解除されたタスクの優先度に等しい場合に、 優先度継承セマフォを獲得しているタスクの優先度が再計算され、 その結果得られた値がそのタスクの現在優先度と等しくない場合に、 優先度の変更が行われる。

【エラーコード(ercd)】
E_OK 正常終了
E_ID 不正ID番号(pisid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない (pisidの優先度継承セマフォが存在していない)
E_OACV オブジェクトアクセス権違反 (システムオブジェクトをアクセスする権利を 持たない環境からの発行で pisid < (-4))
E_PAR パラメータエラー (tmout <= (-2))
E_DLT 待ちオブジェクトが削除された (待ちの間に対象優先度継承セマフォが削除)
E_RLWAI 待ち状態強制解除 (待ちの間に rel_wai を受け付け)
E_TMOUT ポーリング失敗またはタイムアウト
E_CTX コンテキストエラー (タスク独立部またはディスパッチ禁止状態で実行)
vref_pis
優先度継承セマフォ状態参照(機能コード: -260)
    vref_pis: Refer Priority Inheritance Semaphore Status
【パラメータ】
    ID      pisid       優先度継承セマフォID
    T_RPIS* pk_rpis     優先度継承セマフォ状態を返すパケットアドレス
【リターンパラメータ】
ER      ercd        エラーコード

  pk_rpis の内容
    VP      exinf       拡張情報
    BOOL_ID wtsk        待ちタスクの有無
    BOOL_ID pistsk      獲得タスクの有無
【C言語インタフェース】
ER ercd =vref_pis(T_RPIS *pk_rpis, ID pisid);
【解説】

pisid で示された優先度継承セマフォの各種の状態を参照し、 リターンパラメータとして待ちタスクの有無 (wtsk)、 獲得タスクの有無 (pistsk)、 拡張情報(exinf)を返す。

wtskは、 この優先度継承セマフォで待っているタスクの有無を示す。 待ちタスクが無い場合は wtsk = FALSE = 0 となる。 待ちタスクがある場合、wtskには待ち行列の先頭のタスクの ID を返す。

pistskは、 この優先度継承セマフォを獲得しているタスクの有無を示す。 獲得タスクが無い場合は pistsk = FALSE = 0となる。 獲得タスクがある場合、pistsk には獲得タスクの ID を返す。

vref_pis で対象優先度継承セマフォが存在しない場合には、 E_NOEXSエラーとなる。

どんな場合でも、wtsk = FALSEpistsk != FALSE の少なくとも一方は成り立つ。

【エラーコード(ercd)】
E_OK 正常終了
E_ID 不正ID番号(pisid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない (pisidの優先度継承セマフォが存在していない)
E_OACV オブジェクトアクセス権違反 (システムオブジェクトをアクセスする権利を 持たない環境からの発行で pisid < (-4))

4.13.3 仕様2 における優先度継承セマフォ機能の仕様

仕様2 における優先度継承セマフォ機能では、 優先度継承セマフォを解放した場合に、 タスクの優先度を初期優先度に戻す。 これは、他の優先度継承セマフォを獲得している場合にも一律に行われるので、 複数の優先度継承セマフォを獲得している場合に正しい動作を行わせるには、 獲得しているすべての優先度継承セマフォを ディスパッチ禁止状態で一度に解放する必要がある。

優先度継承セマフォを獲得/解放するタスクの優先度を chg_pri によって変更しても、優先度継承セマフォの機能によって優先度が変更されると、 chg_priで設定した優先度は無効になる。 つまり、chg_priはタスクの現在優先度を 一時的に変更するものということになる。 優先度継承セマフォ機能の実装にchg_pri が使われていると考えるわかりやすいかもしれない。

優先度継承セマフォを待っているタスクの優先度をchg_pri によって変更した場合、 その優先度継承セマフォを獲得しているタスクの優先度が再計算・ 変更される場合がある。 具体的には、優先度を変更されたタスクの変更後の優先度が、 優先度継承セマフォを獲得しているタスクの現在優先度よりも高い (値が小さい) 場合に、優先度の変更が行われる。

vcre_pis
優先度継承セマフォ生成(機能コード: -257)
    vcre_pis: Create Priority Inheritance Semaphore
【パラメータ】
    ID      pisid       優先度継承セマフォID
    T_CPIS* pk_cpis     優先度継承セマフォ生成情報
【リターンパラメータ】
ER        ercd        エラーコード
【C言語インタフェース】
ER ercd =vcre_pis(ID pisid, T_CPIS *pk_cpis);
【解説】

vcre_pisでは、pisidで指定された ID 番号を持つ優先度継承セマフォを生成する。 具体的には、生成するセマフォに対して管理ブロックを割り付け、 セマフォの初期値を 1 に初期化する。

ID 番号の正負の扱いや使用できない範囲、 それらの場合のエラーコード、拡張情報 (exinf) の扱いについては、他の同期・通信オブジェクトと同様である。

pisatr は、下位側がシステム属性を表し、 上位側がインプリメント依存属性を表す。 pisatr のシステム属性の部分では、 次のような指定を行う。

    sematr := TA_TPRI

        TA_TPRI 待ちタスクのキューイングは優先度順

優先度継承セマフォでは、 待ちタスクのキューイングは優先度順でないと意味がないため、 FIFO キューイングは用意していない。 そのため、TA_TPRI を指定しなくても 優先度順のキューイングになるが、 他の同期・通信オブジェクトとの統一性のために、 TA_TPRI を指定してもよいことにしている。

【エラーコード(ercd)】
E_OK 正常終了
E_ID 不正ID番号(pisidが不正あるいは利用できない)
E_RSATR 予約属性(pisatrが不正あるいは利用できない)
E_OBJ オブジェクトの状態が不正 (同一ID番号の優先度継承セマフォが既に存在)
E_OACV オブジェクトアクセス権違反 (システムオブジェクトをアクセスする権利を 持たない環境からの発行で pisid < (-4))
vvcre_pis
優先度継承セマフォ生成 (ID自動割当)(機能コード: -259)
    vvcre_pis: Create Priority Inheritance Semaphore (automatic ID assignment)
【パラメータ】
T_CPIS*   pk_cpis     優先度継承セマフォ生成情報
【リターンパラメータ】
ER      ercd        生成した優先度継承セマフォのID, エラーコード
【C言語インタフェース】
ER ercd =vvcre_pis(T_CPIS *pk_cpis);
【解説】

ID 番号を指定せずに優先度継承セマフォを生成し、 生成した優先度継承セマフォの ID ( 必ず正の値 ) を ercdに返す。ercdが負の場合は、 エラーコードを表す。 割り当て可能な ID がない場合、EV_FULLエラーとなる。 その他については、vcre_pis と同じである。

vdel_pis
優先度継承セマフォ削除(機能コード: -258)
    vdel_pis: Delete Priority Inheritance Semaphore
【パラメータ】
ID      pisid       優先度継承セマフォID
【リターンパラメータ】
ER      ercd        エラーコード
【C言語インタフェース】
ER ercd =vdel_pis(ID pisid);
【解説】

pisid で示された優先度継承セマフォを削除する。

本システムコールの発行により、 対象優先度継承セマフォの管理ブロック用の領域は解放される。 また、このシステムコールが終了した後は、 同じ ID 番号の優先度継承セマフォを再び生成することができる。

対象優先度継承セマフォにおいて条件成立を待っている タスクがあった場合にも、 本システムコールは正常終了するが、 待ち状態にあったタスクにはエラー E_DLT が返される。

【エラーコード(ercd)】
E_OK 正常終了
E_ID 不正ID番号(pisid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない (pisidの優先度継承セマフォが存在していない)
E_OACV オブジェクトアクセス権違反 (システムオブジェクトをアクセスする権利を 持たない環境からの発行で pisid < (-4))
vsig_pis
優先度継承セマフォ資源返却(機能コード: -264)
    vsig_pis: Signal Priority Inheritance Semaphore
【パラメータ】
ID      pisid       優先度継承セマフォID
【リターンパラメータ】
ER      ercd        エラーコード
【C言語インタフェース】
ER ercd =vsig_pis(ID pisid);
【解説】

pisid で示された優先度継承セマフォに対して、 資源を解放する操作を行う。

具体的には、 対象優先度継承セマフォに対して既に待っているタスクがあれば、 待ち行列の先頭のタスクを READY 状態に移す。 この場合、その優先度継承セマフォは獲得された状態のままである。 一方、対象優先度継承セマフォに対して待っているタスクが無ければ、 その優先度継承セマフォが解放される。

このシステムコールをタスク独立部から呼び出すことはできない。 呼び出した場合、E_CTX エラーとなる。 また、獲得されていない、ないしは、 他タスクに獲得されている優先度継承セマフォを解放しようとした場合、 E_OBJ エラーとなる。

優先度継承セマフォを解放することにより、 タスクの優先度は、必要な場合に初期優先度に戻される。 具体的には、タスクの優先度が初期優先度よりも高い場合にのみ、 初期優先度に戻す処理が行われる。

【エラーコード(ercd)】
E_OK 正常終了
E_ID 不正ID番号(pisid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない (pisidの優先度継承セマフォが存在していない)
E_OACV オブジェクトアクセス権違反 (システムオブジェクトをアクセスする権利を 持たない環境からの発行で pisid < (-4))
E_CTX コンテキストエラー (タスク独立部からの発行)
E_OBJ オブジェクトの状態が不正 (pisid の優先度継承セマフォが獲得されていない。 または、他のタスクが獲得している)
vwai_pis
優先度継承セマフォ資源獲得(機能コード: -261)
vpreq_pis
優先度継承セマフォ資源獲得 (ポーリング)(機能コード: -262)
vtwai_pis
優先度継承セマフォ資源獲得 (タイムアウト有)(機能コード: -263)
    vwai_pis: Wait on Priority Inheritance Semaphore
   vpreq_pis: Poll and Request Priority Inheritance Semaphore
   vtwai_pis: Wait on Priority Inheritance Semaphore with Timeout
【パラメータ (vwai_pis, vpreq_pis の場合) 】
ID      pisid       優先度継承セマフォID
【パラメータ (vtwai_pis の場合) 】
    ID      pisid       優先度継承セマフォID
    TMO     tmout       タイムアウト指定
【リターンパラメータ】
ER      ercd        エラーコード
【C言語インタフェース】
    ER ercd = vwai_pis(ID pisid);
    ER ercd =vpreq_pis(ID pisid);
    ER ercd =vtwai_pis(ID pisid, TMO tmout);
【解説】

vwai_pis では、pisid で示された優先度継承セマフォから、 資源を獲得する操作を行う。 具体的には、対象優先度継承セマフォが獲得されていない場合には、 優先度継承セマフォの獲得に成功する。 この場合、本システムコールの発行タスクは待ち状態に入らず、実行を継 続する。 一方、対象優先度継承セマフォが獲得されている場合には、 本システムコールを発行したタスクは待ち状態に入る すなわち、その優先度継承セマフォに対する待ち行列につながれる。

本システムコールを発行したタスクが待ち状態に入る場合、 対象優先度継承セマフォを獲得しているタスクが、 発行タスクの優先度を継承する場合がある。 具体的には、優先度継承セマフォを獲得しているタスクの現在優先度が、 発行タスクの現在優先度よりも低い (値が大きい) 場合に、 優先度の継承が行われる。

vpreq_pis は、wai_pis から待ち状態に入る機能を取り除いたシステムコールである。 一方、vtwai_pis は、wai_pis にタイムアウトの機能を付け加えたシステムコールであり、 tmout により待ち時間の最大値 ( タイムアウト値 ) を指定することができる。 ポーリングやタイムアウトの扱いについては、 他の同期・通信オブジェクトと同様である。

twai_pis または vtwai_pis によって優先度継承セマフォ待ち状態に入ったタスクが、 rel_wai の発行、タイムアウト ( vtwai_pis のみ)、 ないしは対象優先度継承セマフォの削除によって待ち解除された場合でも、 その優先度継承セマフォを獲得しているタスクの優先度は変更されない。 そのため、優先度継承セマフォを獲得しているタスクの 優先度が高すぎる値に設定され、その結果、 待ち解除されたタスクの実行が遅れる場合がある。

【エラーコード(ercd)】
E_OK 正常終了
E_ID 不正ID番号(pisid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない (pisidの優先度継承セマフォが存在していない)
E_OACV オブジェクトアクセス権違反 (システムオブジェクトをアクセスする権利を 持たない環境からの発行で pisid < (-4))
E_PAR パラメータエラー (tmout <= (-2))
E_DLT 待ちオブジェクトが削除された (待ちの間に対象優先度継承セマフォが削除)
E_RLWAI 待ち状態強制解除 (待ちの間に rel_wai を受け付け)
E_TMOUT ポーリング失敗またはタイムアウト
E_CTX コンテキストエラー (タスク独立部またはディスパッチ禁止状態で実行)
vref_pis
優先度継承セマフォ状態参照(機能コード: -260)
    vref_pis: Refer Priority Inheritance Semaphore Status
【パラメータ】
    ID      pisid       優先度継承セマフォID
    T_RPIS* pk_rpis     優先度継承セマフォ状態を返すパケットアドレス
【リターンパラメータ】
ER      ercd        エラーコード

  pk_rpis の内容
    VP      exinf       拡張情報
    BOOL_ID wtsk        待ちタスクの有無
    BOOL_ID pistsk      獲得タスクの有無
【C言語インタフェース】
ER ercd =vref_pis(T_RPIS *pk_rpis, ID pisid);
【解説】

pisid で示された優先度継承セマフォの各種の状態を参照し、 リターンパラメータとして待ちタスクの有無 (wtsk)、 獲得タスクの有無 (pistsk)、 拡張情報 (exinf) を返す。

wtskは、 この優先度継承セマフォで待っているタスクの有無を示す。 待ちタスクが無い場合は wtsk = FALSE = 0 となる。 待ちタスクがある場合、wtskには待ち行列の先頭のタスクの ID を返す。

pistskは、 この優先度継承セマフォを獲得しているタスクの有無を示す。 獲得タスクが無い場合は pistsk = FALSE = 0となる。 獲得タスクがある場合、pistsk には獲得タスクの ID を返す。

vref_pis で対象優先度継承セマフォが存在しない場合には、 E_NOEXSエラーとなる。

どんな場合でも、wtsk = FALSEpistsk != FALSE の少なくとも一方は成り立つ。

【エラーコード(ercd)】
E_OK 正常終了
E_ID 不正ID番号(pisid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない (pisidの優先度継承セマフォが存在していない)
E_OACV オブジェクトアクセス権違反 (システムオブジェクトをアクセスする権利を 持たない環境からの発行で pisid < (-4))

この章の目次にもどる
前頁:第2章 I-right/V の概要にもどる
次頁:第5章 ITRON拡張機能にすすむ