時間管理機能は、時間に依存した処理を行うための機能である。システム時刻管理、周期ハンドラ、アラームハンドラの各機能が含まれる。
周期ハンドラとアラームハンドラを総称して、タイムイベントハンドラと呼ぶ。
システム時刻とは、μT-Kernelを搭載したシステムが動作の基準として使用する時刻である。システム時刻管理機能には、システム時刻を設定/参照する機能、システム稼働時間を参照する機能が含まれる。
μT-Kernel 3.0のシステム時刻は1970年1月1日0時0分0秒(UTC)からの通算のミリ秒数またはマイクロ秒数として表現され、tk_set_utc および tk_set_utc_u でシステム時刻の設定を、tk_get_utc および tk_get_utc_u でシステム時刻の参照を行う。
補足事項 | |
---|---|
μT-Kernel 3.0のシステム時刻の起点は1970年1月1日0時0分0秒(UTC)であるが、これはPOSIXに準拠したUNIX系のOSと共通である。 |
pk_tim
の内容
システムの動作中に tk_set_utc を使ってシステム時刻を変更した場合にも、RELTIMやTMOで指定された相対時間は変化しない。たとえば、60秒後にタイムアウトするように指定し、タイムアウト待ちの間に tk_set_utc を実行してシステム時刻を60秒進めたとしても、その時点で即座にタイムアウトすることはない。tk_set_utc を実行しなかった場合と同じく、タイムアウト待ちを始めてから60秒後にタイムアウトする。一方、タイムアウトした時点でのシステム時刻を参照すると、tk_set_utc を実行した場合と実行しなかった場合では異なっている。
tk_set_utc の pk_tim
により設定される時刻が、タイマ割込み周期の時間によって制約を受けることはないが、その後の tk_get_utc で読み出される時刻は、タイマ割込み周期の時間分解能で変化する。たとえば、タイマ割込み周期が10ミリ秒のシステムにおいて、tk_set_utc で10005(ミリ秒)の時刻を設定した場合に、その後の tk_get_utc で得られる時刻は、10005(ミリ秒)→10015(ミリ秒)→10025(ミリ秒)のように変化する。
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
tk_set_utc のパラメータである pk_tim
を64ビットマイクロ秒単位の tim_u
としたシステムコールである。システム時刻は、1970年1月1日0時0分0秒(UTC)からの通算のマイクロ秒数として表現される。
tk_set_utc のパラメータ pk_tim
は構造体SYSTIMを使ったパケット渡しであるが、tk_set_utc_u のパラメータ tim_u
はパケット渡しではなく、64ビット符号付き整数のSYSTIM_Uを使った値渡しである。
上記の点を除き、本システムコールの仕様は tk_set_utc と同じである。詳細は tk_set_utc の説明を参照のこと。
pk_tim
の内容
以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
システム時刻の値を pk_tim
で示される値に設定する。ただし、このAPIのパラメータにおいては、システム時刻を1985年1月1日0時0分0秒(GMT)からの通算のミリ秒数として表現する。
tk_set_tim は tk_set_utc と同等の機能を持つAPIであるが、システム時刻の起点とする日時のみが異なっている。tk_set_tim は、旧バージョンのμT-KernelやT-Kernelとの互換性を維持するためのAPIである。
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
tk_set_tim のパラメータである pk_tim
を64ビットマイクロ秒単位の tim_u
としたシステムコールである。このAPIのパラメータにおいては、システム時刻を1985年1月1日0時0分0秒(GMT)からの通算のマイクロ秒数として表現する。
tk_set_tim のパラメータ pk_tim
は構造体SYSTIMを使ったパケット渡しであるが、tk_set_tim_u のパラメータ tim_u
はパケット渡しではなく、64ビット符号付き整数のSYSTIM_Uを使った値渡しである。
上記の点を除き、本システムコールの仕様は tk_set_tim と同じである。詳細は tk_set_tim の説明を参照のこと。
tk_set_tim_u は tk_set_utc_u と同等の機能を持つAPIであるが、システム時刻の起点とする日時のみが異なっている。tk_set_tim_u は、旧バージョンのμT-KernelやT-Kernelとの互換性を維持するためのAPIである。
pk_tim
の内容
一般に、本APIで読み出されるシステム時刻は、タイマ割込み間隔(周期)ごとに変化する。そのため、タイマ割込み間隔(周期)より短い時間経過を知ることはできない。詳細は tk_set_utc の補足事項を参照。タイマ割込み間隔(周期)よりも短い時間経過を知る必要がある場合は、tk_get_utc_u または td_get_utc の ofs
を利用する。
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
tk_get_utc のリターンパラメータである pk_tim
を64ビットマイクロ秒単位の tim_u
としたシステムコールである。システム時刻は、1970年1月1日0時0分0秒(UTC)からの通算のマイクロ秒数として表現される。また、ナノ秒単位の相対時間を返す ofs
のリターンパラメータを追加している。
tim_u
はタイマ割込み間隔(周期)の分解能となるが、さらに細かい精度の時刻情報として、tim_u
からの経過時間を ofs
にナノ秒単位で取得する。ofs
の分解能は実装依存であるが、一般にはハードウェアタイマの分解能となる。
ofs
=NULL とした場合には、ofs
の情報は格納されない。
上記の点を除き、本システムコールの仕様は tk_get_utc と同じである。また、tim_u
のデータタイプがSYSTIM_Uとなっている点を除き、本システムコールの仕様は td_get_utc と同じである。詳細は tk_get_utc および td_get_utc の説明を参照のこと。
pk_tim
の内容
以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
システム時刻の現在の値を読み出し、リターンパラメータ pk_tim
に返す。ただし、このAPIのリターンパラメータにおいては、システム時刻を1985年1月1日0時0分0秒(GMT)からの通算のミリ秒数として表現する。
一般に、本APIで読み出されるシステム時刻は、タイマ割込み間隔(周期)ごとに変化する。そのため、タイマ割込み間隔(周期)より短い時間経過を知ることはできない。詳細は tk_set_utc の補足事項を参照。タイマ割込み間隔(周期)よりも短い時間経過を知る必要がある場合は、tk_get_tim_u または td_get_tim の ofs
を利用する。
tk_get_tim は tk_get_utc と同等の機能を持つAPIであるが、システム時刻の起点とする日時のみが異なっている。tk_get_tim は、旧バージョンのμT-KernelやT-Kernelとの互換性を維持するためのAPIである。
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
tk_get_tim のリターンパラメータである pk_tim
を64ビットマイクロ秒単位の tim_u
としたシステムコールである。このAPIのリターンパラメータにおいては、システム時刻を1985年1月1日0時0分0秒(GMT)からの通算のマイクロ秒数として表現する。また、ナノ秒単位の相対時間を返す ofs
のリターンパラメータを追加している。
tim_u
はタイマ割込み間隔(周期)の分解能となるが、さらに細かい精度の時刻情報として、tim_u
からの経過時間を ofs
にナノ秒単位で取得する。ofs
の分解能は実装依存であるが、一般にはハードウェアタイマの分解能となる。
ofs
=NULL とした場合には、ofs
の情報は格納されない。
上記の点を除き、本システムコールの仕様は tk_get_tim と同じである。また、tim_u
のデータタイプがSYSTIM_Uとなっている点を除き、本システムコールの仕様は td_get_tim と同じである。詳細は tk_get_tim および td_get_tim の説明を参照のこと。
tk_get_tim_u は tk_get_utc_u と同等の機能を持つAPIであるが、システム時刻の起点とする日時のみが異なっている。tk_get_tim_u は、旧バージョンのμT-KernelやT-Kernelとの互換性を維持するためのAPIである。
pk_tim
の内容
システム稼働時間を取得する。
システム稼働時間はシステム時刻(時刻)と異なり、システム起動時からの単純増加する稼働時間を表す。tk_set_utc や tk_set_tim による時刻設定に影響されない。
システム稼働時間はシステム時刻と同じ精度でなければならない。
tk_get_otm のリターンパラメータである pk_tim
を64ビットマイクロ秒単位の tim_u
としたシステムコールである。また、ナノ秒単位の相対時間を返す ofs
のリターンパラメータを追加している。
tim_u
はタイマ割込み間隔(周期)の分解能となるが、さらに細かい精度の時刻情報として、tim_u
からの経過時間を ofs
にナノ秒単位で取得する。ofs
の分解能は実装依存であるが、一般にはハードウェアタイマの分解能となる。
ofs
=NULL とした場合には、ofs
の情報は格納されない。
上記の点を除き、本システムコールの仕様は tk_get_otm と同じである。また、tim_u
のデータタイプがSYSTIM_Uとなっている点を除き、本システムコールの仕様は td_get_otm と同じである。詳細は tk_get_otm および td_get_otm の説明を参照のこと。
周期ハンドラは、一定周期で起動されるタイムイベントハンドラである。周期ハンドラ機能には、周期ハンドラを生成/削除する機能、周期ハンドラの動作を開始/停止する機能、周期ハンドラの状態を参照する機能が含まれる。周期ハンドラはID番号で識別されるオブジェクトである。周期ハンドラのID番号を周期ハンドラIDと呼ぶ。
周期ハンドラの起動周期と起動位相は、周期ハンドラの生成時に、周期ハンドラ毎に設定することができる。カーネルは、周期ハンドラの操作時に、設定された起動周期と起動位相から、周期ハンドラを次に起動すべき時刻を決定する。周期ハンドラの生成時には、周期ハンドラを生成した時刻に起動位相を加えた時刻を、次に起動すべき時刻とする。周期ハンドラを起動すべき時刻になると、その周期ハンドラの拡張情報(exinf
)をパラメータとして、周期ハンドラを起動する。またこの時、周期ハンドラの起動すべき時刻に起動周期を加えた時刻を、次に起動すべき時刻とする。また、周期ハンドラの動作を開始する時に、次に起動すべき時刻を決定しなおす場合がある。
周期ハンドラの起動位相は、起動周期以下であることを原則とする。起動位相に、起動周期よりも長い時間が指定された場合の振舞いは、実装依存とする。
周期ハンドラは、動作している状態か動作していない状態かのいずれかの状態をとる。周期ハンドラが動作していない状態の時には、周期ハンドラを起動すべき時刻となっても周期ハンドラを起動せず、次に起動すべき時刻の決定のみを行う。周期ハンドラの動作を開始するシステムコール(tk_sta_cyc)が呼び出されると、周期ハンドラを動作している状態に移行させ、必要なら周期ハンドラを次に起動すべき時刻を決定しなおす。周期ハンドラの動作を停止するシステムコール(tk_stp_cyc)が呼び出されると、周期ハンドラを動作していない状態に移行させる。周期ハンドラを生成した後にどちらの状態になるかは、周期ハンドラ属性によって決めることができる。
周期ハンドラの起動位相は、周期ハンドラを生成するシステムコールが呼び出された時刻を基準に、周期ハンドラを最初に起動する時刻を指定する相対時間と解釈する。周期ハンドラの起動周期は、周期ハンドラを(起動した時刻ではなく)起動すべきであった時刻を基準に、周期ハンドラを次に起動する時刻を指定する相対時間と解釈する。そのため、周期ハンドラが起動される時刻の間隔は、個々には起動周期よりも短くなる場合があるが、長い期間で平均すると起動周期に一致する。
補足事項 | |
---|---|
μT-Kernelの時間管理機能の処理における実際の時間分解能は、標準システム構成情報項μT-Kernel/SMの機能章の「タイマ割込み間隔」(TTimPeriod)によって指定されたものとなる。すなわち、周期ハンドラやアラームハンドラが実際に起動される時刻も、タイマ割込み間隔(TTimPeriod)の分解能にしたがったものとなる。このため、周期ハンドラが実際に起動されるのは、周期ハンドラを起動すべき時刻の直後のタイマ割込みの時点である。μT-Kernelの一般的な実装においては、タイマ割込みの処理の中で起動すべき周期ハンドラやアラームハンドラの有無を検出し、必要に応じてそれらのハンドラを起動する。 |
pk_ccyc
の内容
周期ハンドラを生成し周期ハンドラIDを割り当てる。具体的には、生成された周期ハンドラに対して管理ブロックを割り付ける。
周期ハンドラは、指定した時間間隔で動くタスク独立部のハンドラである。
exinf
は、対象となる周期ハンドラに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した情報は、周期ハンドラにパラメータとして渡される他、tk_ref_cyc で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい場合や、途中で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf
に入れる。カーネルでは exinf
の内容について関知しない。
cycatr
は、下位側がシステム属性を表し、上位側が実装独自属性を表す。cycatr
のシステム属性の部分では、次のような指定を行う。
cycatr := (TA_ASM || TA_HLNG) | [TA_STA] | [TA_PHS] | [TA_DSNAME]
TA_ASM | 対象ハンドラがアセンブリ言語で書かれている |
TA_HLNG | 対象ハンドラが高級言語で書かれている |
TA_STA | 周期ハンドラ生成後直ちに起動する |
TA_PHS | 起動位相を保存する |
TA_DSNAME | DSオブジェクト名称を指定する |
#define TA_ASM 0x00000000 /* アセンブリ言語によるプログラム */ #define TA_HLNG 0x00000001 /* 高級言語によるプログラム */ #define TA_STA 0x00000002 /* 周期ハンドラ起動 */ #define TA_PHS 0x00000004 /* 周期ハンドラ起動位相を保存 */ #define TA_DSNAME 0x00000040 /* DSオブジェクト名称を指定 */
cychdr
は周期ハンドラの先頭アドレス、cyctim
は周期起動の時間間隔、cycphs
は起動位相を表す。
TA_HLNG 属性の場合は、高級言語対応ルーチンを経由して周期ハンドラを起動する。高級言語対応ルーチンによって、レジスタの退避と復帰が行われる。周期ハンドラからは、単純な関数からのリターンによって終了する。TA_HLNG 属性の場合の周期ハンドラは次の形式となる。
void cychdr( void *exinf ) { /* 処理 */ return; /* 周期ハンドラの終了 */ }
TA_ASM 属性の場合の周期ハンドラの形式は実装定義とする。ただし、起動パラメータとして exinf
を渡さなければならない。
cycphs
は tk_cre_cyc によって周期ハンドラを生成してから最初の周期ハンドラの起動までの時間を表す。その後は、cyctim
間隔で周期起動を繰り返す。cycphs
に0を指定した場合は、周期ハンドラの生成直後に周期ハンドラが起動される。cyctim
に0を指定することはできない。
周期ハンドラのn回目の起動は、周期ハンドラを生成してから cycphs
+ cyctim
* (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 以上の時間が経過した後となる。
周期ハンドラの中でシステムコールを発行することにより、それまで実行状態(RUNNING)であったタスクがその他の状態に移行し、代わりに別のタスクが実行状態(RUNNING)となった場合でも、周期ハンドラ実行中はディスパッチ(実行タスクの切り替え)が起こらない。ディスパッチングが必要になっても、まず周期ハンドラを最後まで実行することが優先され、周期ハンドラを終了する時にはじめてディスパッチが行われる。すなわち、周期ハンドラ実行中に生じたディスパッチ要求はすぐに処理されず、周期ハンドラ終了までディスパッチが遅らされる。これを遅延ディスパッチの原則と呼ぶ。
周期ハンドラはタスク独立部として実行される。したがって、周期ハンドラの中では、待ち状態に入るシステムコールや、自タスクの指定を意味するシステムコールを実行することはできない。
TA_DSNAME を指定した場合に dsname
が有効となり、DSオブジェクト名称として設定される。DSオブジェクト名称はデバッガがオブジェクトを識別するために使用され、T-Kernel/DSのシステムコール td_ref_dsname と td_set_dsname からのみ操作可能である。詳細は td_ref_dsname 、td_set_dsname を参照のこと。TA_DSNAME を指定しなかった場合は、dsname
が無視され、td_ref_dsname や td_set_dsname が、E_OBJ エラーとなる。
tk_cre_cyc では回数の指定が無いので、一旦定義された周期ハンドラは、tk_stp_cyc によって停止するか、周期起動ハンドラを削除するまで周期起動が繰り返される。
複数のタイムイベントハンドラや割込みハンドラが同時に動く場合に、それらのハンドラがシリアルに起動される(1つのハンドラの実行を終了してから別のハンドラの実行を始める)か、ネストして起動される(1つのハンドラの実行を中断して別のハンドラを実行し、そのハンドラが終了した後で前のハンドラの続きを実行する)かということは実装依存である。いずれにしても、タイムイベントハンドラや割込みハンドラはタスク独立部なので、遅延ディスパッチの原則が適用される。
cycphs
に0を指定した場合、1回目の周期ハンドラの起動は、本システムコールの実行直後になる。ただし、実装上の都合により、本システムコールの実行終了の直後に周期ハンドラを起動(実行)するのではなく、本システムコールの処理中に1回目の周期ハンドラを起動(実行)する場合がある。この場合、周期ハンドラ内での割込み禁止などの状態が、2回目以降の通常の周期ハンドラ起動時とは異なっていることがある。また、cycphs
に0を指定した場合の1回目の周期ハンドラの起動は、タイマ割込みを待つことなく、すなわちタイマ割込み間隔とは無関係に起動される。この点についても、2回目以降の通常の周期ハンドラの起動や、cycphs
が0でない場合の周期ハンドラの起動とは異なっている。
pk_ccyc_u
の内容
tk_cre_cyc のパラメータである cyctim
と cycphs
を64ビットマイクロ秒単位の cyctim_u
, cycphs_u
としたシステムコールである。
パラメータが cyctim_u
, cycphs_u
となった点を除き、本システムコールの仕様は tk_cre_cyc と同じである。詳細は tk_cre_cyc の説明を参照のこと。
周期ハンドラを動作状態にする。
TA_PHS 属性を指定している場合は、周期ハンドラの起動周期はリセットされず、周期ハンドラを動作状態にする。すでに動作状態であれば何もせずに動作状態を維持する。
TA_PHS 属性を指定していない場合は、起動周期をリセットして、周期ハンドラを動作状態にする。すでに、動作状態であれば起動周期のリセットをした上で、動作状態を維持する。したがって、次に周期ハンドラが起動されるのは、cyctim
後となる。
周期ハンドラを動作していない状態にする。すでに動作していない状態であれば何もしない。
pk_rcyc
の内容
cycid
で示された周期ハンドラの状態を参照し、周期ハンドラの状態(cycstat
)、次のハンドラ起動までの残り時間(lfttim
)、拡張情報(exinf
)をリターンパラメータとして返す。
cycstat
には次の情報が返される。
cycstat := (TCYC_STP | TCYC_STA)
#define TCYC_STP 0x00 /* 周期ハンドラが動作していない */ #define TCYC_STA 0x01 /* 周期ハンドラが動作している */
lfttim
には、次に周期ハンドラが起動される予定の時刻までの残り時間(ミリ秒)が返される。周期ハンドラが現在起動中か停止中かは関係しない。
exinf
には、周期ハンドラを生成する際のパラメータとして指定された拡張情報が返される。exinf
は周期ハンドラに引数として渡される。
tk_ref_cyc で、cycid
の周期ハンドラが存在していない場合には、エラー E_NOEXS となる。
周期ハンドラ状態情報(T_RCYC)における残り時間 lfttim
は、ミリ秒単位に切り上げた値(単位ミリ秒)を返す。マイクロ秒単位の情報を知りたい場合には、tk_ref_cyc_u を使う。
pk_rcyc_u
の内容
tk_ref_cyc のリターンパラメータである lfttim
を64ビットマイクロ秒単位の lfttim_u
としたシステムコールである。
リターンパラメータが lfttim_u
となった点を除き、本システムコールの仕様は tk_ref_cyc と同じである。詳細は tk_ref_cyc の説明を参照のこと。
アラームハンドラは、指定した時刻に起動されるタイムイベントハンドラである。アラームハンドラ機能には、アラームハンドラを生成/削除する機能、アラームハンドラの動作を開始/停止する機能、アラームハンドラの状態を参照する機能が含まれる。アラームハンドラはID番号で識別されるオブジェクトである。アラームハンドラのID番号をアラームハンドラIDと呼ぶ。
アラームハンドラを起動する時刻(これをアラームハンドラの起動時刻と呼ぶ)は、アラームハンドラ毎に設定することができる。アラームハンドラの起動時刻になると、そのアラームハンドラの拡張情報(exinf
)をパラメータとして、アラームハンドラを起動する。
アラームハンドラの生成直後には、アラームハンドラの起動時刻は設定されておらず、アラームハンドラの動作は停止している。アラームハンドラの動作を開始するシステムコール(tk_sta_alm)が呼び出されると、アラームハンドラの起動時刻を、システムコールが呼び出された時刻から指定された相対時間後に設定する。アラームハンドラの動作を停止するシステムコール(tk_stp_alm)が呼び出されると、アラームハンドラの起動時刻の設定を解除する。また、アラームハンドラを起動する時にも、アラームハンドラの起動時刻の設定を解除し、アラームハンドラの動作を停止する。
補足事項 | |
---|---|
アラームハンドラが実際に起動される時刻は、タイマ割込み間隔(TTimPeriod)の分解能にしたがったものとなる。詳細は周期ハンドラ項の補足事項を参照。 |
pk_calm
の内容
アラームハンドラを生成しアラームハンドラIDを割り当てる。具体的には、生成されたアラームハンドラに対して管理ブロックを割り付ける。
アラームハンドラ(指定時刻起動ハンドラ)は、指定した時刻に起動されるタスク独立部のハンドラである。
exinf
は、対象となるアラームハンドラに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した情報は、アラームハンドラにパラメータとして渡される他、tk_ref_alm で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい場合や、途中で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf
に入れる。カーネルでは exinf
の内容について関知しない。
almatr
は、下位側がシステム属性を表し、上位側が実装独自属性を表す。almatr
のシステム属性の部分では、次のような指定を行う。
almatr := (TA_ASM || TA_HLNG) | [TA_DSNAME]
#define TA_ASM 0x00000000 /* アセンブリ言語によるプログラム */ #define TA_HLNG 0x00000001 /* 高級言語によるプログラム */ #define TA_DSNAME 0x00000040 /* DSオブジェクト名称を指定 */
almhdr
は起動されるアラームハンドラの先頭アドレスを表す。
TA_HLNG 属性の場合は、高級言語対応ルーチンを経由してアラームハンドラを起動する。高級言語対応ルーチンによって、レジスタの退避と復帰が行われる。アラームハンドラからは、単純な関数からのリターンによって終了する。TA_HLNG 属性の場合のアラームハンドラは次の形式となる。
void almhdr( void *exinf ) { /* 処理 */ return; /* アラームハンドラの終了 */ }
TA_ASM 属性の場合のアラームハンドラの形式は実装定義とする。ただし、起動パラメータとして exinf
を渡さなければならない。
アラームハンドラの中でシステムコールを発行することにより、それまで実行状態(RUNNING)であったタスクがその他の状態に移行し、代わりに別のタスクが実行状態(RUNNING)となった場合でも、アラームハンドラ実行中はディスパッチ(実行タスクの切り替え)が起こらない。ディスパッチングが必要になっても、まずアラームハンドラを最後まで実行することが優先され、アラームハンドラを終了する時にはじめてディスパッチが行われる。すなわち、アラームハンドラ実行中に生じたディスパッチ要求はすぐに処理されず、アラームハンドラ終了までディスパッチが遅らされる。これを遅延ディスパッチの原則と呼ぶ。
アラームハンドラはタスク独立部として実行される。したがって、アラームハンドラの中では、待ち状態に入るシステムコールや、自タスクの指定を意味するシステムコールを実行することはできない。
TA_DSNAME を指定した場合に dsname
が有効となり、DSオブジェクト名称として設定される。DSオブジェクト名称はデバッガがオブジェクトを識別するために使用され、T-Kernel/DSのシステムコール td_ref_dsname と td_set_dsname からのみ操作可能である。詳細は td_ref_dsname 、td_set_dsname を参照のこと。TA_DSNAME を指定しなかった場合は、dsname
が無視され、td_ref_dsname や td_set_dsname が、E_OBJ エラーとなる。
複数のタイムイベントハンドラや割込みハンドラが同時に動く場合に、それらのハンドラがシリアルに起動される(1つのハンドラの実行を終了してから別のハンドラの実行を始める)か、ネストして起動される(1つのハンドラの実行を中断して別のハンドラを実行し、そのハンドラが終了した後で前のハンドラの続きを実行する)かということは実装依存である。いずれにしても、タイムイベントハンドラや割込みハンドラはタスク独立部なので、遅延ディスパッチの原則が適用される。
アラームハンドラの起動時刻を設定して、動作状態にする。almtim
は相対時刻で、tk_sta_alm が呼び出された時刻から almtim
で指定した時間が経過した後にアラームハンドラが起動される。すでにアラームハンドラの起動時刻が設定されて動作状態であった場合には、その設定を解除した後、新たに起動時刻を設定し動作状態とする。
almtim
=0の場合には、起動時刻設定直後にアラームハンドラが起動される。
tk_sta_alm のパラメータである almtim
を64ビットマイクロ秒単位の almtim_u
としたシステムコールである。
パラメータが almtim_u
となった点を除き、本システムコールの仕様は tk_sta_alm と同じである。詳細は tk_sta_alm の説明を参照のこと。
アラームハンドラの起動時刻を解除し、動作していない状態にする。すでに動作していない状態であれば何もしない。
pk_ralm
の内容
almid
で示されたアラームハンドラの状態を参照し、ハンドラ起動までの残り時間(lfttim
)、拡張情報(exinf
)をリターンパラメータとして返す。
almstat
には次の情報が返される。
almstat := (TALM_STP | TALM_STA)
#define TALM_STP 0x00 /* アラームハンドラが動作していない */ #define TALM_STA 0x01 /* アラームハンドラが動作している */
アラームハンドラが動作している(TALM_STA)場合、lfttim
には次にアラームハンドラが起動されるまでの相対時間が返される。tk_sta_alm で指定した almtim
≧ lfttim
≧ 0 の範囲の値となる。lfttim
はタイマ割込みごとに減算されるため、次のタイマ割込みでアラームハンドラが起動される場合に lfttim
=0 となる。
exinf
には、アラームハンドラを生成する際のパラメータとして指定された拡張情報が返される。exinf
はアラームハンドラに引数として渡される。
アラームハンドラが動作していない(TALM_STP)場合は、lfttim
は不定である。
tk_ref_alm で、almid
のアラームハンドラが存在していない場合には、エラー E_NOEXS となる。
アラームハンドラ状態情報(T_RALM)における残り時間 lfttim
は、ミリ秒単位に切り上げた値(単位ミリ秒)を返す。マイクロ秒単位の情報を知りたい場合には、tk_ref_alm_u を使う。
pk_ralm_u
の内容
tk_ref_alm のリターンパラメータである lfttim
を64ビットマイクロ秒単位の lfttim_u
としたシステムコールである。
リターンパラメータが lfttim_u
となった点を除き、本システムコールの仕様は tk_ref_alm と同じである。詳細は tk_ref_alm の説明を参照のこと。