第 4 章 SMP T-Kernel/OS の機能
4.4 同期・通信機能
4.4.2 イベントフラグ
イベントフラグは、イベントの有無をビット毎のフラグで表現することにより、同期を行うためのオブジェクト である。イベントフラグ機能には、イベントフラグを生成/削除する機能、イベントフラグをセット/クリアする 機能、イベントフラグで待つ機能、イベントフラグの状態を参照する機能が含まれる。イベントフラグは ID 番号で 識別されるオブジェクトである。イベントフラグの ID 番号をイベントフラグ ID と呼ぶ。
イベントフラグは、対応するイベントの有無をビット毎に表現するビットパターンと、そのイベントフラグで待 つタスクの待ち行列を持つ。イベントフラグのビットパターンを、単にイベントフラグと呼ぶ場合もある。イベン トを知らせる側では、イベントフラグのビットパターンの指定したビットをセットないしはクリアすることが可能 である。一方、イベントを待つ側では、イベントフラグのビットパターンの指定したビットのすべてまたはいずれ かがセットされるまで、タスクをイベントフラグ待ち状態にすることができる。イベントフラグ待ち状態になった タスクは、そのイベントフラグの待ち行列につながれる。
SMP T-Kernel ではイベントフラグの ID を指定するシステムコールにはアクセス保護が適用される。
T-Kernel 1.00 仕様と仕様の異なるシステムコールについて、以下の表にまとめる。詳細は各システムコールの説 明を参照のこと。
コール名 機 能
T-Kernel 1.00仕様 との相違
tk_cre_flg イベントフラグ生成 ×
tk_del_flg イベントフラグ削除 △
tk_set_flg イベントフラグのセット △
tk_clr_flg イベントフラグのクリア △
tk_wai_flg イベントフラグ待ち △
tk_ref_flg イベントフラグ状態参照 △
T-Kernel 1.00 仕様との相違 ○:無し ×:有り △:アクセス保護で E_DACV エラーが返る点のみ異なる
イベントフラグ生成 tk_cre_flg
tk_cre_flg:Create EventFlag
【C 言語インタフェース】
ID flgid = tk_cre_flg ( T_CFLG *pk_cflg ) ;
【パラメータ】
T_CFLG* pk_cflg Packet to Create EventFlag イベントフラグ生成情報
pk_cflg の内容
VP exinf ExtendedInformation 拡張情報
ATR flgatr EventFlagAttribute イベントフラグ属性 UINT iflgptn InitialEventFlagPattern イベントフラグの初期値 ID domid DomainID ドメイン ID
UB oname[8] Object name オブジェクト名称 ──(以下に実装独自に他の情報を追加してもよい)──
【リターンパラメータ】
ID flgid EventFlagID イベントフラグ ID または ErrorCode エラーコード
【エラーコード】
E_NOMEM メモリ不足(管理ブロック用の領域が確保できない) E_LIMIT イベントフラグの数がシステムの上限を超えた E_RSATR 予約属性(flgatr が不正あるいは利用できない) E_PAR パラメータエラー(pk_cflg が不正)
E_ID 不正 ID 番号(domid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(domid のドメインが存在しない) E_ONAME 指定されたオブジェクト名が既に使用されている
【解説】
イベントフラグを生成しイベントフラグ ID 番号を割当てる。具体的には、生成するイベントフラグに対して管理 ブロックを割り付け、その初期値を iflgptn とする。
T-Kernel では、一つのイベントフラグで、プロセッサの 1 ワード分のビットをグループ化して扱う。操作はすべ て 1 ワード分を単位とする。
exinf は、対象イベントフラグに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した情報 は、tk_ref_flg で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい場合や、
途中で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf に 入れる。OS では exinf の内容について関知しない。
flgatr は、下位側がシステム属性を表わし、上位側が実装独自属性を表す。flgatr のシステム属性の部分では、
次のような指定を行う。
flgatr:= (TA_TFIFO ∥ TA_TPRI) | (TA_WMUL ∥ TA_WSGL) | [TA_ONAME] | [TA_NODISWAI]
| [TA_DOMID] | [(TA_PROTECTED || TA_PRIVATE || TA_PUBLIC)]
Copyright © 2006-2017 T-Engine Forum. All Rights Reserved.
TA_TFIFO 待ちタスクのキューイングは FIFO TA_TPRI 待ちタスクのキューイングは優先度順
TA_WSGL 複数タスクの待ちを許さない (Wait Single Task) TA_WMUL 複数タスクの待ちを許す (Wait Multiple Task) TA_ONAME オブジェクト名称を指定する
TA_NODISWAI tk_dis_wai による待ち禁止を拒否する TA_DOMID 所属するドメインを指定する
TA_PROTECTED アクセス保護属性をプロテクトに設定する TA_PRIVATE アクセス保護属性をプライベートに設定する TA_PUBLIC アクセス保護属性をパブリックに設定する
TA_WSGL を指定した場合は、複数のタスクが同時に待ち状態になることを禁止する。TA_WMUL を指定した場合は、
同時に複数のタスクが待ち状態となることが許される。
TA_TFIFO,TA_TPRI では、タスクがイベントフラグの待ち行列に並ぶ際の並び方を指定することができる。属性が TA_TFIFO であればタスクの待ち行列は FIFO となり、属性が TA_TPRI であればタスクの待ち行列はタスクの優先度順 となる。ただし、TA_WSGL を指定した場合は待ち行列を作らないため、TA_TFIFO,TA_TPRI のどちらを指定しても動 作に変わりはない。
複数のタスクが待っている場合、待ち行列の先頭から順に待ち条件が成立しているか検査し、待ち条件が成立し ているタスクの待ちを解除する。したがって、待ち行列の先頭のタスクが必ずしも最初に待ちが解除される訳では ない。また、待ち条件が成立したタスクが複数あれば、複数のタスクの待ちが解除される。
TA_ONAME を指定した場合に oname が有効となり、オブジェクト名称として設定される。TA_ONAME を指定しなか った場合、オブジェクト名称は設定無しとなる。オブジェクト名称は、イベントフラグが所属するドメイン内で固 有でなくてはならない。既に他のイベントフラグで使用されているオブジェクト名称を指定した場合はエラー E_ONAME が返される。oname に指定された文字列の長さが 0(最初の文字が終端の 0)の場合は、TA_ONAME の指定に関 わらずオブジェクト名称は設定無しとみなされる。
TA_DOMID を指定した場合は、domid が有効となり、所属するドメインとして domid のドメインが設定される。
TA_DOMID を指定しなかった場合は、domid は無視され、カーネル・ドメインが所属するドメインとなる。TA_PROTECTED, TA_PRIVATE, TA_PUBLIC は、イベントフラグのアクセス保護属性を指定する。いずれのアクセス保護属性も指定され なかった場合は、パブリック属性に設定される。所属するドメインとアクセス保護属性の組み合わせにより、自タ スクがアクセス保護によりアクセスできないイベントフラグを生成する事はできない。該当する指定をした場合は E_PAR が返される。
#define TA_TFIFO 0x00000000 /* 待ちタスクを FIFO で管理 */
#define TA_TPRI 0x00000001 /* 待ちタスクを優先度順で管理 */
#define TA_WSGL 0x00000000 /* 複数タスクの待ちを許さない */
#define TA_WMUL 0x00000008 /* 複数タスクの待ちを許す */
#define TA_ONAME 0x00000040 /* オブジェクト名称を指定 */
#define TA_NODISWAI 0x00000080 /* 待ち禁止拒否 */
#define TA_DOMID 0x00010000 /* ドメインを指定する */
#define TA_PRIVATE 0x00040000 /* 保護属性をプライベートに設定 */
#define TA_PROTECTED 0x00080000 /* 保護属性をプロテクトに設定 */
#define TA_PUBLIC 0x00000000 /* 保護属性をパブリックに設定 */
【SMP T-Kernel に関する事項】
T-Kernel 1.00 仕様との相違点は以下の通りである。
イベントフラグ属性に TA_DOMID,TA_PROTECTED, TA_PRIVATE, TA_PUBLIC を追加し、所属するドメインとアク セス保護属性を指定可能とした。
DS オブジェクト名を廃し、代わりにオブジェクト名を設けた。前者はデバッグのための名称であったのに対 し、後者はドメインの ID 検索など一般に使用可能な名称である。オブジェクト名は、同一ドメイン内の同一 の種類のオブジェクトで同じ名称を使用することは出来ない。
Copyright © 2006-2017 T-Engine Forum. All Rights Reserved.
イベントフラグ削除 tk_del_flg
tk_del_flg:Delete EventFlag
【C 言語インタフェース】
ER ercd = tk_del_flg ( ID flgid ) ;
【パラメータ】
ID flgid EventFlagID イベントフラグ ID
【リターンパラメータ】
ER ercd ErrorCode エラーコード
【エラーコード】
E_OK 正常終了
E_ID 不正 ID 番号(flgid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(flgid のイベントフラグが存在しない) E_DACV アクセス保護違反
【解説】
flgid で示されたイベントフラグを削除する。
本システムコールの発行により、対象イベントフラグの ID 番号および管理ブロック用の領域は解放される。
対象イベントフラグにおいて条件成立を待っているタスクがあった場合にも、本システムコールは正常終了する が、待ち状態にあったタスクにはエラーE_DLT が返される。
本システムコールはアクセス保護が適用される。
【SMP T-Kernel に関する事項】
T-Kernel 1.00 仕様との相違点は以下の通りである。
指定したイベントフラグがアクセス保護によりアクセスできない場合、E_DACV が返る。
イベントフラグのセット tk_set_flg
イベントフラグのクリア tk_clr_flg
tk_set_flg:Set EventFlag tk_clr_flg:Clear EventFlag
【C 言語インタフェース】
ER ercd = tk_set_flg ( ID flgid, UINT setptn ) ; ER ercd = tk_clr_flg ( ID flgid, UINT clrptn ) ;
【パラメータ(tk_set_flg の場合)】
ID flgid EventFlagID イベントフラグ ID
UINT setptn SetBitPattern セットするビットパターン
【パラメータ(tk_clr_flg の場合)】
ID flgid EventFlagID イベントフラグ ID
UINT clrptn ClearBitPattern クリアするビットパターン
【リターンパラメータ】
ER ercd ErrorCode エラーコード
【エラーコード】
E_OK 正常終了
E_ID 不正 ID 番号(flgid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(flgid のイベントフラグが存在しない) E_DACV アクセス保護違反
【解説】
tk_set_flg では、flgid で示される 1 ワードのイベントフラグのうち、setptn で示されているビットがセットさ れる。すなわち、flgid で示されるイベントフラグの値に対して、setptn の値で論理和がとられる。また、tk_clr_flg では、flgid で示される 1 ワードのイベントフラグのうち、対応する clrptn の 0 になっているビットがクリアされ る。すなわち、flgid で示されるイベントフラグの値に対して、clrptn の値で論理積がとられる。
tk_set_flg によりイベントフラグの値が変更された結果、tk_wai_flg でそのイベントフラグを待っていたタスク の待ち解除の条件を満たすようになれば、そのタスクの待ち状態が解除され、実行状態(RUNNING)または実行可能状 態(READY)(待っていたタスクが二重待ち状態(WAITING-SUSPENDED)であった場合には強制待ち状態(SUSPENDED))へ と移行する。
tk_clr_flg では、対象イベントフラグを待っているタスクが待ち解除となることはない。すなわち、ディスパッ チは起らない。
tk_set_flg で setptn の全ビットを 0 とした場合や、tk_clr_flg で clrptn の全ビットを 1 とした場合には、対象 イベントフラグに対して何の操作も行わないことになる。ただし、この場合でもエラーとはならない。
TA_WMUL の属性を持つイベントフラグに対しては、同一のイベントフラグに対して複数のタスクが同時に待つこと ができる。したがって、イベントフラグでもタスクが待ち行列を作ることになる。この場合、一回の tk_set_flg で 複数のタスクが待ち解除となることがある。
本システムコールはアクセス保護が適用される。
【SMP T-Kernel に関する事項】