この章の目次にもどる
前頁:第2章 I-right/V の概要にもどる
次頁:第5章 ITRON拡張機能にすすむ
負のオブジェクト ID はシステムオブジェクト、
正のオブジェクト ID はユーザオブジェクトを表す。
(-4)〜0 のオブジェクト ID は予約されており、
システムが利用するオブジェクトが割り当てられている場合を除いては、
利用できない。
システムオブジェクトをアクセスする権利を持つのは、
タスク独立部実行中、準タスク部実行中、システムタスク
( タスク ID が負のオブジェクト )
実行中およびリングレベル 0 で動作しているユーザタスク実行中においてである
( タスクのリングレベルについては、「cre_tsk
」の項を参照 )。
μITRON3.0 仕様の規定との違いは、正の ID のユーザタスクであっても、
リングレベル 0 で動いている場合には、
システムタスクと同じアクセス権を持っていることである。
システムオブジェクトをアクセスする権利を持たない環境から、
システムオブジェクトをアクセスするシステムコールを発行した場合、
E_OACV
エラーとなる。
(-4)〜0 の優先度は予約されており、利用できない。
I-right/V では、時間を表すパラメータ
(SYSTIME
, CYCTIME
, ALMTIME
,
DLYTIME
, TMO
型のもの)
の時間の単位は1ミリ秒です。
ただし、時間の分解能は10ミリ秒です。
I-right/V では、カーネルが以下のエラーを報告することはない。
E_SYS | システムエラー |
E_INOSPT | ITRON/FILE での未サポート機能 |
E_MACV | メモリアクセス不能、メモリアクセス権違反 |
EN_???? | 接続機能に関するエラー |
また、パラメータとしてポインタを渡すシステムコールに対して、
存在しないメモリ番地をアクセスするようなポインタを渡した場合は、
エラーとしては検出されない。
この場合、システムダウンとなる。
同様に、非常駐メモリの番地をパラメータとすることはできない。
ページアウトされていた場合、メモリが存在しない場合と同じことになり、
システムダウンとなる。
- 参考 :
- BTRON システムコールにおいては、この限りではない。
存在しないメモリを指定した場合は、エラーとして検出される。
また、非常駐メモリも正しく処理される。
システムダウンとなることはない。
準タスク部とは、
タスクのコンテキストを持ちながら
ハンドラを実行している状態のことをいう。
準タスク部実行中は、タスクディスパッチが可能であり、
遅延割込みの原則は準タスク部には適用されない。
また、準タスク部の中から、
自タスクを待ち状態にするシステムコールを発行することができる。
I-right/V では、
準タスク部になるのは、
拡張 SVC ハンドラ実行中のみである
(ただし、タスク独立部から呼び出された拡張SVCハンドラ実行中は、
準タスク部ではなく、タスク独立部であると扱われる)。
将来的に接続機能がサポートされる場合、
接続機能をサポートするシステムコールは
準タスク部で実現されることになる。
そのため、準タスク部で実現されている拡張 SVC
や接続機能をサポートするシステムコールに対しては、
システムコールの不可分性は適用されない。
タスク起動のコンベンションは、
C 言語の関数呼び出しのコンベンションと同じになっている。
μITRON3.0 仕様ではタスクの起動パラメータはスタートコード
(stacd
)
のみであるが、
I-right/V ではタスク拡張情報(exinf
)
もパラメータとして渡される。
タスクを C 言語で記述する時は、
void task_entry(INT stacd, VP exinf)
の形で書く。
拡張情報が必要ない場合は、VP exinf
は省略できる。
タスクを終了する場合は、ext_tsk
ないしは
exd_tsk
を用いる。
単に return
した場合の動作は保証されない。
タイマハンドラの起動は、
C 言語の関数呼び出しのコンベンションと同じになっている。
μITRON3.0 仕様では、タイマハンドラに渡されるパラメータはないが、
I-right/V ではタイマハンドラの拡張情報が渡される。
タイマハンドラを C言語で記述する時は、
void timer_handler(VP exinf)
の形で書く。
拡張情報が必要ない場合は、
VP exinf
は省略できる。
タイマハンドラから戻る際は、単に return
する。
拡張 SVC ハンドラについては、
6.8 def_svc()
を参照のこと。
割込みハンドラについては、
6.9 def_int()
を参照のこと。
μITRON3.0 仕様では、
タスク独立部から発行できるシステムコールはインプリメント依存としているが、
I-right/V では、
仕様書で明示的に発行できないとされているシステムコールに加えて、
以下に挙げるシステムコールをタスク独立部から呼び出すことはできない。
これ以外のシステムコールは、
すべてタスク独立部から呼び出すことができる。
- 他タスク強制終了(
ter_tsk
)
- ランデブ用ポート生成・削除機能
(
cre_por
, del_por
, vcre_por
)
- タスクのレジスタ内容の設定・参照
(
vset_reg
, vget_reg
)
ter_tsk
をタスク独立部から呼び出せるように改造することも可能であるが、
有用性とオーバーヘッドを比べた場合に、
それほどメリットはない。
また将来的には、cre_???
、del_???
、
一部のdef_???
、一部のref_???
などのシステムコールを
タスク独立部から呼ぶことを禁止するかもしれない。
μITRON3.0 仕様で認められている
タスク独立部からシステムコールを呼ぶ場合に
i???_???
の名称を用いるという方法は採用していない。
以下では、各システムコールの仕様について、
μITRON3.0 仕様でインプリメント依存となっている部分、
および I-right/V での拡張機能を中心に述べる。
システムスタックのサイズは、
システム全体で固定したデフォルト値を用いる方法と、
cre_tsk
でタスク毎に指定する方法がある。
前者の方法では、システムスタックサイズとして
2032(=2048-16)
バイトを使用する。
タスク毎に指定する場合は、タスク属性に TA_SSTKSZ
を設定し、
T_CTSK
構造体の sstksz
フィールドに指定するサイズを入れる。
この場合、
指定したシステムスタックのサイズが1024バイトよりも小さい場合には、
E_PAR
エラーになる。
#define TA_SSTKSZ 0x00010000 /* システムスタックサイズを指定 */
タスクをどのリングレベルで実行するかは、
次の方法で決める。
タスク ID が負の場合には、
そのタスクはシステムタスクであると考えてリングレベル 0
で実行する。
正の場合には、以下のタスク属性により、
どのリングレベルで実行するかを指定することができる。
#define TA_RNG0 0x00000000 /* リングレベル0 で動作させる */
#define TA_RNG1 0x01000000 /* リングレベル1 で動作させる */
#define TA_RNG2 0x02000000 /* リングレベル2 で動作させる */
#define TA_RNG3 0x03000000 /* リングレベル3 で動作させる */
タスク属性に TA_HLNG
を指定しても、
実際には何もしない。
タスクをリングレベル 0 で動かす場合には、
ユーザスタックとシステムスタックは区別されない。
この場合、両者のサイズを加えたサイズのスタック領域が確保される。
ユーザスタックおよびシステムスタックの領域は、
cre_tsk
実行時に、
システムメモリプールから取られる。
取れない場合には、E_NOMEM
エラーとなる。
ユーザスタックのサイズに 0 を指定した場合、
カーネルはユーザスタックエリアを確保しない。
ユーザが自分でスタック領域を決めたい場合には、この方法を使う。
なし
I-right/V では、ter_tsk
をタスク独立部から呼び出すことはできない。
呼び出した場合、E_CTX
エラーになる。
優先度継承セマフォ機能を用いている場合には、
タスクの終了によって、
獲得している優先度継承セマフォが自動的に解放される場合がある。
また、タスクの強制終了によって待ち状態が解除されるのに伴って、
他のタスクの優先度が変更される場合がある。
詳しくは、「優先度継承セマフォ機能の仕様」を参照のこと。
なし
なし
tskpri
として TSK_INI
を指定して、
タスク起動時優先度に戻す機能をサポートしている。
I-right/V では、
DORMANT 状態のタスクに対してこのシステムコールを発行し、
タスク起動直後の優先度を設定することができる。
タスクの優先度は、タスク生成時およびタスク終了時に、
タスク起動時優先度に設定される。
そのため、このシステムコールが E_OBJ
エラーを返すことはない。
優先度継承セマフォ機能を用いている場合には、
指定した以外のタスクの優先度も変更される場合がある。
詳しくは、「優先度継承セマフォ機能の仕様」を参照のこと。
タスク独立部から tskpri = TPRI_RUN
を指定して rot_rdq
を発行することが可能である。
この場合、
レディキュー中の最高優先度のタスクを含むレディキューを回転させる。
自タスクが属するレディキューを回転させた場合でも、
ディスパッチ禁止の設定や、
割込みがかかるタイミング等の要因により、
自タスクが同じ優先度のタスク中の最後に移動するとは限らない。
自タスクを同じ優先度のタスク中の最後に移動させたい場合は、
chg_pri
を使って
自タスクの優先度を現在値に設定しなおす方法が確実である。
なし
以下のインプリメント依存の情報が参照できる。
tskwait | 待ち要因 |
wid | 待ちオブジェクトID |
wupcnt | 起床要求キューイング数 |
suscnt | SUSPEND 要求ネスト数 |
CPU がコンテキストを持っているタスクを RUN 状態であるとする。
つまり、RUN 状態のタスクは、
タスクディスパッチにより切り替わることになる。
そのため、
遅延ディスパッチの原則やディスパッチの禁止によりディスパッチが
遅延されている間は、ディスパッチ前のタスクが RUN 状態となる。
例えば、割込みハンドラから
RUN 状態のタスクに対して sus_tsk
を発行した後に、
同じハンドラ内でそのタスクの状態を
ref_tsk
で参照した場合、
発行した sus_tsk
によりタスクが強制待ち状態に移行する場合にも、
遅延ディスパッチの原則により ref_tsk
は
tskstat
に TTS_RUN
を返す。
tskwait
が (TTW_CAL|TTW_RDV
)
になることはない。
|
tslp_tsk |
自タスクを起床待ち状態へ移行(タイムアウト有) |
|
なし
なし
|
|
twai_sem |
セマフォ資源獲得(タイムアウト有) |
|
なし
なし
なし
|
|
twai_flg |
イベントフラグ待ち(タイムアウト有) |
|
なし
なし
|
prcv_msg |
メイルボックスから受信(ポーリング) |
|
trcv_msg |
メイルボックスから受信(タイムアウト有) |
|
メッセージバッファ属性として、
待ちタスクの優先度順のキューイング (TA_TPRI
)
をサポートしている。
メッセージバッファのサイズ (bufsz
) は、
大きい方に丸められる。
丸める単位は、INT
型のデータ1つ分のサイズ
(4バイト) である。
メッセージの最大長 (maxmsg
)
が負または 0 の場合、E_PAR
エラーになる。
メッセージバッファの領域は、cre_mbf
実行時に、
システムメモリプールから取られる。
取れない場合には、E_NOMEM
エラーとなる。
システムログ用の mbfid = (-4)
のメッセージバッファをサポートしている。
システムログ用のメッセージバッファは、
ユーザタスク ( リングレベル 0 で動いている場合を除く )
からアクセスすることはできない。
システムログ用メッセージバッファに送られた
メッセージを処理するために、
ログタスクを用意する。
なし
|
psnd_mbf |
メッセージバッファへ送信(ポーリング) |
|
tsnd_mbf |
メッセージバッファへ送信(タイムアウト有) |
|
psnd_mbf
および tsnd_mbf
(tmout = TMO_POL
) を、
タスク独立部ないしはディスパッチ禁止状態から実行することができる。
メッセージは、
バッファ中では INT
型のデータ 1 つ分のサイズ
(4バイト) を単位に大きい方に丸めたサイズの領域を占有する。
さらに、メッセージを 1 つ送信する度に、管理用のエリアとして、
INT
型のデータ 1 つ分のエリアがメッセージバッファから取られる。
ref_mbf
で参照できる空きバッファのサイズ
(frbufsz
) は、これらの分も減少することになる。
タスクがメッセージ送信待ちの行列を作った場合に、
待ち行列の中では後方にあっても、
送信しようとするメッセージサイズが小さく、
メッセージバッファの残り領域に入るならば、
後方のタスクが優先される。
そのため、送信待ち行列は、厳密には FIFO にはならない。
|
prcv_mbf |
メッセージバッファから受信(ポーリング) |
|
trcv_mbf |
メッセージバッファから受信(タイムアウト有) |
|
|
pcal_por |
ポートに対するランデブの呼出(ポーリング) |
|
tcal_por |
ポートに対するランデブの呼出(タイムアウト有) |
|
なし
|
pacp_por |
ポートに対するランデブ受付(ポーリング) |
|
tacp_por |
ポートに対するランデブ受付(タイムアウト有) |
|
なし
なし
割込みハンドラからは、
C 言語の return
や関数の最後で自動的に復帰できるため、
ret_int
はサポートしない。
他のシステムとの互換性のためにret_int
が必要になる場合は、
以下の定義により代用できる(C言語の場合)。
#define ret_int() { return; }
6.9 def_int()
もあわせて参照のこと。
なし
なし
I-right/Vではサポートしていない。
I-right/Vではサポートしていない。
メモリは周辺核 ( BTRON メモリー管理 ) で管理されているため、
I-right/V にはメモリプール管理機能はない。
可変長メモリプール属性 (mplatr
)
として、待ちタスクの優先度順のキューイング
(TA_TPRI
) をサポートしている。
可変長メモリプールの管理アルゴリズムとして、
first-fit をサポートしている。
タスクがメモリ獲得待ちの行列を作った場合に、
待ち行列の中では後方にあっても、
要求ブロックサイズが小さく、
メモリプールからすぐにブロックが獲得できるならば、
後方のタスクが優先される
( つまり、ITRON2 の TA_CNT
に相当)。
そのため、メモリ獲得待ち行列は、
厳密には FIFO ないしは優先度順にはならない。
メモリプール全体のサイズ (mplsz
) は、
大きい方に丸められる。
丸める単位は、ポインタ 4 つ分のサイズ ( 16 バイト ) である。
可変長メモリプールの領域は、cre_mpl
実行時に、
システムメモリプールから取られる。取れない場合には、
E_NOMEM
エラーとなる。
システム用の mplid = (-4)
のメモリプールをサポートしている。
システム用メモリプールを生成、削除することはできないが、
メモリブロックの獲得、返却、
メモリプールの状態参照をすることはできる。
( μITRON3.0仕様では、
メモリプールの状態参照のみできることになっている )。
なし
|
pget_blk |
可変長メモリブロック獲得 (ポーリング) |
|
tget_blk |
可変長メモリブロック獲得 (タイムアウト有) |
|
pget_blk
および
tget_blk(tmout =TMO_POL)
を、
タスク独立部ないしはディスパッチ禁止状態から実行することができる。
メモリブロックサイズ (blksz)
は、
大きい方に丸められる。
丸める単位は、ポインタ 2 つ分のサイズ (8バイト) である。
可変長メモリブロックを 1 つ獲得する度に、
管理用のエリアとして、
ポインタ 2 つ分のエリア
( TRON仕様チップの場合は、8 バイト ) がメモリプールから取られる。
さらに、残りエリアの管理の都合で、
さらにポインタ 2 つ分のエリアが取られる場合もある。
ref_mpl
で参照できる空き領域の合計サイズ ( frsz
) からは、
これらの管理エリアの分も減少することになる。
待ちタスクがある場合、wtsk
には待ち行列の先頭のタスクの ID を返す。
ref_mpl
は、
最大空き領域のサイズを求めるためにメモリプール全体をスキャンする。
そのため、実行効率がかなり悪くなるので、
デバッグ目的以外には使わない方がよい。
システム用メモリプールの状態をユーザタスク
( リングレベル 0 で動いている場合を除く )
から参照することはできない
( μITRON3.0 仕様では、
ユーザタスクからも状態参照できることになっている )。
固定長メモリプール属性として、
待ちタスクの優先度順のキューイング
(TA_TPRI)
をサポートしている。
固定長メモリブロックサイズ (blksz)
は、
大きい方に丸められる。
丸める単位は、ポインタ 1つ分のサイズ(4バイト) である。
固定長メモリプールの領域は、cre_mpf
実行時に、
システムメモリプールから取られる。
取れない場合には、E_NOMEM
エラーとなる。
なし
|
pget_blf |
固定長メモリブロック獲得 (ポーリング) |
|
tget_blf |
固定長メモリブロック獲得 (タイムアウト有) |
|
なし
なし
なし
なし
cycno
としては、
1 からシステム構成設定ファイル中で設定した値までが使える。
それ以外の値を指定した時は、E_PAR
エラーとなる。
周期起動ハンドラ属性 (cycatr)
に TA_HLNG
を指定しても、実際には何もしない。
ハンドラ内では最小限の処理のみ行って、
残りの処理はタスクに任せるように作るべきである。
almno
としては、
1 からシステム構成設定ファイル中で設定した値までが使える。
それ以外の値を指定した時は、E_PAR
エラーとなる。
アラームハンドラ属性 (almatr
)
に TA_HLNG
を指定しても、実際には何もしない。
アラームハンドラは、ハンドラ起動の時点
(厳密には起動する直前) で、自動的に定義解除される。
ハンドラ内では最小限の処理のみ行って、
残りの処理はタスクに任せるように作るべきである。
現バージョンで参照される情報は以下の通りである。
maker | OS製造メーカ |
0x0012 | パーソナルメディア株式会社 |
id | OS形式番号 |
0x0000 | |
spver | 仕様書バージョン番号 |
0x5302 | μITRON, Ver.3.02 |
prver | OS製品バージョン番号 |
0xXYYZ | Release X.YY.Z |
prno | 製品管理情報 |
0....0 | |
cpu | CPU情報 |
0x0063 | i386 以後の互換プロセッサ |
var | バリエーション |
0xc000 | レベルE |
準タスク部実行中の場合は、sysstat
に
TTS_QTSK
が返る。
また、準タスク部でディスパッチ禁止中の場合は
(TTS_QTSK|TTS_DDSP
)、
準タスク部で割込みおよびディスパッチ禁止中の場合は
(TS_QTSK|TTS_LOC
)
が返る(I-right/V での拡張機能)。
整理すると、sysstat
は次のような値をとる。
TTS_TSK | 0 |
TTS_TSK|TTS_DDSP | 1 |
TTS_TSK|TTS_LOC | 3 |
TTS_QTSK | 8 |
TTS_QTSK|TTS_DDSP | 9 |
TTS_QTSK|TTS_LOC | 11 |
TTS_INDP | 4 |
runtskid
には、
現在 RUN 状態にあるタスクの ID
が返る。
( RUN 状態の定義については、「ref_tsk
」の項を参照)。
RUN 状態のタスクがない場合には、FALSE
が返る。
schedtskid
には、
実行すべきタスクの ID が返る。
実行すべきタスクとは、スケジューリングの結果
RUN状態にすべきとされたタスクで、
遅延ディスパッチの原則や
ディスパッチが禁止されている状態があるために、
現在 RUN 状態になっているタスクと一致するとは限らない。
実行可能なタスクがない場合には、FALSE
が返る。
なし
s_fncd
としては、
1 からシステム構成設定ファイル中で設定した値までが使える。
それ以外の値を指定した時は、E_PAR
エラーとなる。
pk_dsvc = NADR
とした場合には、
前に定義した拡張 SVC ハンドラの定義解除を行う。
既に定義済みの拡張機能コードに対して、
拡張 SVC ハンドラを再定義することができる。
その際に、あらかじめ定義解除しておく必要はない。
拡張SVCハンドラ属性 (svcatr
) に
TA_HLNG
を指定しても、実際には何もしない。
| 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
と同じである。
| 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 |
コンテキストエラー(タスク独立部からの発行) |
| vget_tim |
性能評価用システム時刻参照 | (機能コード: -82) |
|
vget_tim: Get Time for Performance Evaluation
I-right/Vではサポートしない。
優先度継承とは、
優先度逆転が上限なく続くこと ( 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.
I-right/V では、以下に述べる仕様1 の仕様を用いている。
仕様1 における優先度継承セマフォ機能では、
chg_pri
を使わない場合のタスクの優先度は、
そのタスクの初期優先度と、
そのタスクが獲得している優先度継承セマフォを待っている中で
最高優先度のタスクの優先度との、
高い ( 値が小さい ) 方に設定される。
そのために OS は、
タスクが獲得している優先度継承セマフォのリストを管理している。
優先度継承セマフォを獲得 / 解放するタスクの優先度を
chg_pri
によって変更しても、
優先度継承セマフォの機能によって優先度が変更されると、
chg_pri
で設定した優先度は無効になる。
つまり、chg_pri
はタスクの現在優先度を
一時的に変更するものということになる。
優先度継承セマフォ機能の実装に chg_pri
が使われていると考えるわかりやすいかもしれない。
優先度継承セマフォを待っているタスクの優先度を chg_pri
によって変更した場合、
その優先度継承セマフォを獲得しているタスクの
優先度が再計算・変更される場合がある
具体的には、次の 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 = FALSE
とpistsk != FALSE
の少なくとも一方は成り立つ。
- 【エラーコード(ercd)】
E_OK |
正常終了 |
E_ID |
不正ID番号(pisid が不正あるいは利用できない) |
E_NOEXS |
オブジェクトが存在していない
(pisid の優先度継承セマフォが存在していない) |
E_OACV |
オブジェクトアクセス権違反
(システムオブジェクトをアクセスする権利を
持たない環境からの発行で pisid < (-4)) |
仕様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 = FALSE
とpistsk != FALSE
の少なくとも一方は成り立つ。
- 【エラーコード(ercd)】
E_OK |
正常終了 |
E_ID |
不正ID番号(pisid が不正あるいは利用できない) |
E_NOEXS |
オブジェクトが存在していない
(pisid の優先度継承セマフォが存在していない) |
E_OACV |
オブジェクトアクセス権違反
(システムオブジェクトをアクセスする権利を
持たない環境からの発行で pisid < (-4)) |
この章の目次にもどる
前頁:第2章 I-right/V の概要にもどる
次頁:第5章 ITRON拡張機能にすすむ