• 検索結果がありません。

周期ハンドラ

ドキュメント内 TEF021-S _ja (ページ 189-197)

第 4 章 SMP T-Kernel/OS の機能

4.7 時間管理機能

4.7.2 周期ハンドラ

Copyright © 2006-2017 T-Engine Forum. All Rights Reserved.

周期ハンドラの生成 tk_cre_cyc

tk_cre_cyc:Create Cyclic Handler

【C 言語インタフェース】

ID cycid = tk_cre_cyc ( T_CCYC *pk_ccyc ) ;

【パラメータ】

T_CCYC* pk_ccyc Packet to Define CyclicHandler 周期ハンドラ定義情報

pk_ccyc の内容

VP exinf ExtendedInformation 拡張情報

ATR cycatr CyclicHandlerAttribute 周期ハンドラ属性 FP cychdr CyclicHandlerAddress 周期ハンドラアドレス RELTIM cyctim CycleTime 周期起動時間間隔 RELTIM cycphs 周期起動位相 ID domid DomainID ドメイン ID

UW assprc AssignProcessor 実行プロセッサ指定 UB oname[8] Object name オブジェクト名称 ──(以下に実装独自に他の情報を追加してもよい)──

【リターンパラメータ】

ID cycid CyclicHandlerID 周期ハンドラ ID または ErrorCode エラーコード

【エラーコード】

E_NOMEM メモリ不足(管理ブロック用の領域が確保できない) E_LIMIT 周期ハンドラの数がシステムの制限を超えた E_RSATR 予約属性(cycatr が不正あるいは利用できない)

E_PAR パラメータエラー(pk_ccyc,cychdr,cyctim,cycphs,assprc が不正あるいは利用できない) E_ID 不正 ID 番号(domid が不正あるいは利用できない)

E_NOEXS オブジェクトが存在していない(domid のドメインが存在しない) E_ONAME 指定されたオブジェクト名が既に使用されている

【解説】

周期ハンドラを生成し周期ハンドラ ID を割当てる。具体的には、生成された周期ハンドラに対して管理ブロック などを割り付ける。

周期ハンドラは、指定した時間間隔で動くタスク独立部のハンドラである。

exinf は、対象となる周期ハンドラに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した 情報は、周期ハンドラにパラメータとして渡される他、tk_ref_cyc で取り出すことができる。なお、ユーザの情報 を入れるためにもっと大きな領域がほしい場合や、途中で内容を変更したい場合には、自分でそのためのメモリを 確保し、そのメモリパケットのアドレスを exinf に入れる。OS では exinf の内容について関知しない。

cycatr は、下位側がシステム属性を表わし、上位側が実装独自属性を表す。cycatr のシステム属性の部分では、

次のような指定を行う。

cycatr := (TA_ASM ∥ TA_HLNG) | [TA_STA] | [TA_PHS] | [TA_ONAME]

| [TA_ASSPRC] | [TA_DOMID] | [(TA_PROTECTED || TA_PRIVATE || TA_PUBLIC)]

TA_ASM 対象ハンドラがアセンブラで書かれている TA_HLNG 対象ハンドラが高級言語で書かれている TA_STA 周期ハンドラ生成後直ちに起動する TA_PHS 起動位相を保存する

TA_ONAME オブジェクト名称を指定する TA_DOMID 所属するドメインを指定する TA_ASSPRC 実行プロセッサを指定する

TA_PROTECTED アクセス保護属性をプロテクトに設定する TA_PRIVATE アクセス保護属性をプライベートに設定する TA_PUBLIC アクセス保護属性をパブリックに設定する

cychdr は周期ハンドラの先頭アドレス、cyctim は周期起動の時間間隔、cycphs は起動位相を表す。

TA_HLNG 属性の場合は、高級言語対応ルーチンを経由して周期ハンドラを起動する。高級言語対応ルーチンによっ て、レジスタの退避と復帰が行われる。周期ハンドラからは、単純な関数からのリターンによって終了する。TA_HLNG 属性の場合の周期ハンドラは次の形式となる。

void cychdr( VP exinf ) {

/*

処理 */

return; /* 周期ハンドラの終了 */

}

TA_ASM 属性の場合の周期ハンドラの形式は実装定義とする。ただし、起動パラメータとして exinf を渡さなけれ ばならない。

cycphs は tk_cre_cyc によって周期ハンドラを生成してから最初の周期ハンドラの起動までの時間を表す。その後 は、cyctim 間隔で周期起動を繰り返す。cycphs に 0 を指定した場合は、周期ハンドラの生成直後に周期ハンドラが 起動されることになる。cyctim に 0 を指定することはできない。

周期ハンドラの n 回目の起動は、周期ハンドラを生成してから chyphs + chctim * (n - 1)以上の時間が経過し た後に行う。

TA_STA を指定した場合は、周期ハンドラの生成時から周期ハンドラは動作状態となり、前述の時間隔で周期ハン ドラが起動される。TA_STA を指定しなかった場合は、起動周期の計測は行われるが、周期ハンドラは起動されない。

TA_PHS が指定されている場合は、tk_sta_cyc によって周期ハンドラが活性化されても、起動周期はリセットさ れず前述のように周期ハンドラの生成時から計測している周期を維持する。TA_PHS が指定されていない場合は、

tk_sta_cyc によって起動周期がリセットされ、tk_sta_cyc 呼出時から cyctim 間隔で周期ハンドラが起動される。

tk_sta_cyc によるリセットでは、cycphs は適用されない。この場合、tk_sta_cyc から n 回目の周期ハンドラの起動 は、tk_sta_cyc 呼出時から cyctim * n 以上の時間が経過した後となる。

TA_ONAME を指定した場合に oname が有効となり、オブジェクト名称として設定される。TA_ONAME を指定しなか った場合、オブジェクト名称は設定無しとなる。オブジェクト名称は、周期ハンドラが所属するドメイン内で固有 でなくてはならない。既に他の周期ハンドラで使用されているオブジェクト名称を指定した場合はエラーE_ONAME が返される。oname に指定された文字列の長さが 0(最初の文字が終端の 0)の場合は、TA_ONAME の指定に関わらずオ ブジェクト名称は設定無しとみなされる。

TA_ASSPRC を指定した場合に assprc が有効となり、周期ハンドラを実行するプロセッサが設定される。assprc の 値は以下のように定義される。

#define TP_PRC1 0x00000001 プロセッサ ID 番号 1 のプロセッサ #define TP_PRC2 0x00000002 プロセッサ ID 番号 2 のプロセッサ #define TP_PRC3 0x00000004 プロセッサ ID 番号 3 のプロセッサ #define TP_PRC4 0x00000008 プロセッサ ID 番号 4 のプロセッサ ~

#define TP_PRC32 0x80000000 プロセッサ ID 番号 32 のプロセッサ

Copyright © 2006-2017 T-Engine Forum. All Rights Reserved.

周期ハンドラを実行するプロセッサは、一つのみ指定可能である。複数の指定はできない。TA_ASSPRC が指定され なかった場合は、assprc は無視される。その際に、周期ハンドラを実行するプロセッサは実装定義とする。

TA_DOMID を指定した場合は、domid が有効となり、所属するドメインとして domid のドメインが設定される。

TA_DOMID を指定しなかった場合は、domid は無視され、カーネル・ドメインが所属するドメインとなる。

TA_PROTECTED, TA_PRIVATE, TA_PUBLIC は、周期ハンドラのアクセス保護属性を指定する。いずれのアクセス保護 属性も指定されなかった場合は、パブリック属性に設定される。所属するドメインとアクセス保護属性の組み合わ せにより、自タスクがアクセス保護によりアクセスできない周期ハンドラを生成する事はできない。該当する指定 をした場合は E_PAR が返される。

周期ハンドラの実行中は、ディスパッチが必要になっても、まず周期ハンドラを最後まで実行することが優先さ れ、周期ハンドラ終了までディスパッチが遅らされる(遅延ディスパッチの原則)。ただし、周期ハンドラを実行し ているプロセッサ以外ではディスパッチは可能である。よって、遅延されるのは、周期ハンドラを実行しているプ ロセッサでのディスパッチである。

周期ハンドラはタスク独立部として実行される。したがって、周期ハンドラの中では、待ち状態に入るシステム コールや、自タスクの指定を意味するシステムコールを実行することはできない。

#define TA_ASM 0x00000000 /* アセンブラによるプログラム */

#define TA_HLNG 0x00000001 /* 高級言語によるプログラム */

#define TA_STA 0x00000002 /* 周期ハンドラ起動 */

#define TA_PHS 0x00000004 /* 周期ハンドラ起動位相を保存 */

#define TA_ONAME 0x00000040 /* オブジェクト名称を指定 */

#define TA_DOMID 0x00010000 /* ドメインを指定する */

#define TA_ASSPRC 0x00020000 /* 実行プロセッサを指定する */

#define TA_PRIVATE 0x00040000 /* 保護属性をプライベートに設定 */

#define TA_PROTECTED 0x00080000 /* 保護属性をプロテクトに設定 */

#define TA_PUBLIC 0x00000000 /* 保護属性をパブリックに設定 */

【補足事項】

tk_cre_cyc では回数の指定が無いので、一旦定義された周期ハンドラは、tk_stp_cyc によって停止するか、周期 起動ハンドラを削除するまで周期起動が繰り返される。

複数のタイムイベントハンドラや割込みハンドラが同時に動く場合に、それらのハンドラがシリアルに起動され る(1 つのハンドラの実行を終了してから別のハンドラの実行を始める)か、ネストして起動される(1 つのハンドラ の実行を中断して別のハンドラを実行し、そのハンドラが終了した後で前のハンドラの続きを実行する)かというこ とは実装依存である。いずれにしても、タイムイベントハンドラや割込みハンドラはタスク独立部なので、遅延デ ィスパッチの原則が適用される。

【SMP T-Kernel に関する事項】

T-Kernel 1.00 仕様との相違点は以下の通りである。

 周期ハンドラ属性に TA_DOMID,TA_PROTECTED, TA_PRIVATE, TA_PUBLIC を追加し、所属するドメインとアクセ ス保護属性を指定可能とした。

 周期ハンドラ属性に TA_ASSPRC を追加し、周期ハンドラを実行するプロセッサを指定可能とした。

 DS オブジェクト名を廃し、代わりにオブジェクト名を設けた。前者はデバッグのための名称であったのに対 し、後者はドメインの ID 検索など一般に使用可能な名称である。オブジェクト名は、同一ドメイン内の同一 の種類のオブジェクトで同じ名称を使用することは出来ない。

周期ハンドラの削除 tk_del_cyc

tk_del_cyc:Delete Cyclic Handler

【C 言語インタフェース】

ER ercd = tk_del_cyc ( ID cycid ) ;

【パラメータ】

ID cycid CyclicHandlerID 周期ハンドラ ID

【リターンパラメータ】

ER ercd ErrorCode エラーコード

【エラーコード】

E_OK 正常終了

E_ID 不正 ID 番号(cycid が不正あるいは利用できない)

E_NOEXS オブジェクトが存在していない(cycid の周期ハンドラが存在しない) E_DACV アクセス保護違反

【解説】

周期ハンドラを削除する。

本システムコールはアクセス保護が適用される。

【SMP T-Kernel に関する事項】

T-Kernel 1.00 仕様との相違点は以下の通りである。

 指定した周期ハンドラがアクセス保護によりアクセスできない場合、E_DACV が返る。

ドキュメント内 TEF021-S _ja (ページ 189-197)