第 4 章 SMP T-Kernel/OS の機能
4.7 時間管理機能
4.7.3 アラームハンドラ
アラームハンドラは、指定した時刻に起動されるタイムイベントハンドラである。アラームハンドラ機能には、
アラームハンドラを生成/削除する機能、アラームハンドラの動作を開始/停止する機能、アラームハンドラの状 態を参照する機能が含まれる。アラームハンドラは ID 番号で識別されるオブジェクトである。アラームハンドラの ID 番号をアラームハンドラ ID と呼ぶ。
アラームハンドラを起動する時刻(これをアラームハンドラの起動時刻と呼ぶ)は、アラームハンドラ毎に設定す ることができる。アラームハンドラの起動時刻になると、そのアラームハンドラの拡張情報(exinf)をパラメータと して、アラームハンドラを起動する。
アラームハンドラの生成直後には、アラームハンドラの起動時刻は設定されておらず、アラームハンドラの動作 は停止している。アラームハンドラの動作を開始するシステムコール(tk_sta_alm)が呼び出されると、アラームハ ンドラの起動時刻を、システムコールが呼び出された時刻から指定された相対時間後に設定する。アラームハンド ラの動作を停止するシステムコール(tk_stp_alm)が呼び出されると、アラームハンドラの起動時刻の設定を解除す る。また、アラームハンドラを起動する時にも、アラームハンドラの起動時刻の設定を解除し、アラームハンドラ の動作を停止する。
SMP T-Kernel では、アラームハンドラ ID を指定するシステムコールにはアクセス保護が適用される。
T-Kernel 1.00 仕様と仕様の異なるシステムコールについて、以下の表にまとめる。詳細は各システムコールの説 明を参照のこと。
コール名 機 能
T-Kernel 1.00仕様 との相違
tk_cre_alm アラームハンドラの生成 ×
tk_del_alm アラームハンドラの削除 △
tk_sta_alm アラームハンドラの動作開始 △
tk_stp_alm アラームハンドラの動作停止 △
tk_ref_alm アラームハンドラ状態参照 △
T-Kernel 1.00 仕様との相違 ○:無し ×:有り △:アクセス保護で E_DACV エラーが返る点のみ異なる
Copyright © 2006-2017 T-Engine Forum. All Rights Reserved.
アラームハンドラの生成 tk_cre_alm
tk_cre_alm:Create Alarm Handler
【C 言語インタフェース】
ID almid = tk_cre_alm ( T_CALM *pk_calm ) ;
【パラメータ】
T_CALM* pk_calm Packet to Define AlarmHandler アラームハンドラ定義情報
pk_calm の内容
VP exinf ExtendedInformation 拡張情報
ATR almatr AlarmHandlerAttribute アラームハンドラ属性 FP almhdr AlarmHandlerAddress アラームハンドラアドレス ID domid DomainID ドメイン ID
UW assprc AssignProcessor 実行プロセッサ指定 UB oname[8] Object name オブジェクト名称
【リターンパラメータ】
ID almid AlarmHandlerID アラームハンドラ ID または ErrorCode エラーコード
【エラーコード】
E_NOMEM メモリ不足(管理ブロック用の領域が確保できない) E_LIMIT アラームハンドラの数がシステムの制限を超えた E_RSATR 予約属性(almatr が不正あるいは利用できない)
E_PAR パラメータエラー(pk_calm,almatr,almhdr,assprc が不正あるいは利用できない) E_ID 不正 ID 番号(domid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(domid のドメインが存在しない) E_ONAME 指定されたオブジェクト名が既に使用されている
【解説】
アラームハンドラを生成しアラームハンドラ ID を割当てる。アラームハンドラ(指定時刻起動ハンドラ)は、指定 した時刻に起動されるタスク独立部のハンドラである。
exinf は、対象となるアラームハンドラに関する情報を入れておくためにユーザが自由に利用できる。ここで設定 した情報は、アラームハンドラにパラメータとして渡される他、tk_ref_alm で取り出すことができる。なお、ユー ザの情報を入れるためにもっと大きな領域がほしい場合や、途中で内容を変更したい場合には、自分でそのための メモリを確保し、そのメモリパケットのアドレスを exinf に入れる。OS では exinf の内容について関知しない。
almatr は、下位側がシステム属性を表わし、上位側が実装独自属性を表す。almatr のシステム属性の部分では、
次のような指定を行う。
almatr := (TA_ASM ∥ TA_HLNG) | [TA_ONAME]
| [TA_ASSPRC] | [TA_DOMID] | [(TA_PROTECTED || TA_PRIVATE || TA_PUBLIC)]
TA_ASM 対象ハンドラがアセンブラで書かれている TA_HLNG 対象ハンドラが高級言語で書かれている TA_ONAME オブジェクト名称を指定する
TA_ASSPRC 実行プロセッサを指定する
TA_DOMID 所属するドメインを指定する
TA_PROTECTED アクセス保護属性をプロテクトに設定する TA_PRIVATE アクセス保護属性をプライベートに設定する TA_PUBLIC アクセス保護属性をパブリックに設定する
almhdr は起動されるアラームハンドラの先頭アドレスを表す。
TA_HLNG 属性の場合は、高級言語対応ルーチンを経由してアラームハンドラを起動する。高級言語対応ルーチンに よって、レジスタの退避と復帰が行われる。アラームハンドラからは、単純な関数からのリターンによって終了す る。TA_HLNG 属性の場合のアラームハンドラは次の形式となる。
void almhdr( VP exinf ) {
/*
処理 */
return; /* アラームハンドラの終了 */
}
TA_ASM 属性の場合のアラームハンドラの形式は実装定義とする。ただし、起動パラメータとして exinf を渡さな ければならない。
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 のプロセッサ
アラームハンドラを実行するプロセッサは、一つのみ指定可能である。複数の指定はできない。TA_ASSPRC が指定 されなかった場合は、assprc は無視される。その際に、アラームハンドラを実行するプロセッサは実装定義とする。
TA_DOMID を指定した場合は、domid が有効となり、所属するドメインとして domid のドメインが設定される。
TA_DOMID を指定しなかった場合は、domid は無視され、カーネル・ドメインが所属するドメインとなる。
TA_PROTECTED, TA_PRIVATE, TA_PUBLIC は、アラームハンドラのアクセス保護属性を指定する。いずれのアクセス 保護属性も指定されなかった場合は、パブリック属性に設定される。所属するドメインとアクセス保護属性の組み 合わせにより、自タスクがアクセス保護によりアクセスできないアラームハンドラを生成する事はできない。該当 する指定をした場合は E_PAR が返される。
アラームハンドラの実行中は、ディスパッチが必要になっても、まずアラームハンドラを最後まで実行すること が優先され、アラームハンドラ終了までディスパッチが遅らされる(遅延ディスパッチの原則)。ただし、アラーム ハンドラを実行しているプロセッサ以外ではディスパッチは可能である。よって、遅延されるのは、アラームハン ドラを実行しているプロセッサでのディスパッチである。
アラームハンドラはタスク独立部として実行される。したがって、アラームハンドラの中では、待ち状態に入る システムコールや、自タスクの指定を意味するシステムコールを実行することはできない。
#define TA_ASM 0x00000000 /* アセンブラによるプログラム */