時間管理機能

時間管理機能は、時間に依存した処理を行うための機能である。システム時刻管理、周期ハンドラ、アラームハンドラの各機能が含まれる。

周期ハンドラとアラームハンドラを総称して、タイムイベントハンドラと呼ぶ。

システム時刻管理

システム時刻管理機能は、システム時刻を操作するための機能である。システム時刻を設定/参照する機能、システム稼働時間を参照する機能が含まれる。

tk_set_tim - システム時刻設定

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_set_tim (CONST SYSTIM *pk_tim );

パラメータ

CONST SYSTIM* pk_tim Packet of Current Time現在時刻(ミリ秒)を示すパケット

pk_tim の内容

W hi High 32bitsシステム時刻設定用現在時刻の上位32ビット
UW lo Low 32bitsシステム時刻設定用現在時刻の下位32ビット

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_PAR パラメータエラー(pk_tim が不正, 設定時間が不正)

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

解説

システム時刻の値を pk_tim で示される値に設定する。

システム時刻は、1985年1月1日0時(GMT)からの通算のミリ秒数とする。

補足事項

システムの動作中に tk_set_tim を使ってシステム時刻を変更した場合にも、RELTIMやTMOで指定された相対時間は変化しない。例えば、60秒後にタイムアウトする様に指定した場合、タイムアウト待ちの間に tk_set_tim で時間を60秒進めてもそこでタイムアウトすることはなく、60秒後にタイムアウトする。したがって、tk_set_tim によってタイムアウトするシステム時刻は変化することになる。

tk_set_tim()pk_tim により設定される時刻が、タイマ割込み周期の時間によって制約を受けることはないが、その後の tk_get_tim() で読み出される時刻は、タイマ割込み周期の時間分解能で変化する。たとえば、タイマ割込み周期が10ミリ秒のシステムにおいて、tk_set_tim() で0005(ミリ秒)の時刻を設定した場合に、その後の tk_get_tim() で得られる時刻は、0005(ミリ秒)→0015(ミリ秒)→0025(ミリ秒)のように変化する。

tk_set_tim_u - システム時刻設定(マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_set_tim_u (SYSTIM_U tim_u );

パラメータ

SYSTIM_U tim_u Current Time現在時刻(マイクロ秒)

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_PAR パラメータエラー(tim_u が不正, 設定時間が不正)

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_USEC マイクロ秒命令をサポート

解説

tk_set_tim のパラメータである pk_tim を64ビットマイクロ秒単位の tim_u としたシステムコールである。

tk_set_tim のパラメータ pk_tim は構造体SYSTIMを使ったパケット渡しであるが、tk_set_tim_u のパラメータ tim_u はパケット渡しではなく、64ビット符号付き整数のSYSTIM_Uを使った値渡しである。

上記の点を除き、本システムコールの仕様は tk_set_tim と同じである。詳細は tk_set_tim の説明を参照のこと。

μT-Kernel 1.0との差異

T-Kernel 2.0仕様に基づき新たに追加されたAPIである。

tk_get_tim - システム時刻参照

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_get_tim (SYSTIM *pk_tim );

パラメータ

SYSTIM* pk_tim Packet of Current Time現在時刻(ミリ秒)を返す領域へのポインタ

リターンパラメータ

ER ercd Error Codeエラーコード

pk_tim の内容

W hi High 32bitsシステムの現在時刻の上位32ビット
UW lo Low 32bitsシステムの現在時刻の下位32ビット

エラーコード

E_OK 正常終了
E_PAR パラメータエラー(pk_tim が不正)

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

解説

システム時刻の現在の値を読み出し、リターンパラメータ pk_tim に返す。

システム時刻は、1985年1月1日0時(GMT)からの通算のミリ秒数とする。

本システムコールで読み出されるシステムの現在時刻は、タイマ割込み間隔(周期)の分解能で変化する。

補足事項

tk_get_tim() では、タイマ割込み間隔(周期)より短い時間経過を知ることはできない。タイマ割込み間隔(周期)より短い時間経過を知る必要がある場合は、tk_get_tim_u() または td_get_tim()ofs を利用する。

tk_get_tim_u - システム時刻参照(マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_get_tim_u (SYSTIM_U *tim_u , UW *ofs );

パラメータ

SYSTIM_U* tim_u Time現在時刻(マイクロ秒)を返す領域へのポインタ
UW* ofs Offsetリターンパラメータ ofs を返す領域へのポインタ

リターンパラメータ

ER ercd Error Codeエラーコード
SYSTIM_U tim_u Time現在時刻(マイクロ秒)
UW ofs Offset tim_u からの相対的な経過時間(ナノ秒)

エラーコード

E_OK 正常終了
E_PAR パラメータエラー(tim_u, ofs が不正)

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_USEC マイクロ秒命令をサポート

解説

tk_get_tim のリターンパラメータである pk_tim を64ビットマイクロ秒単位の tim_u としたシステムコールである。また、ナノ秒単位の相対時間を返す ofs のリターンパラメータを追加している。

tim_u はタイマ割込み間隔(周期)の分解能となるが、さらに細かい精度の時刻情報として、tim_u からの経過時間を ofs にナノ秒単位で取得する。ofs の分解能は実装依存であるが、一般にはハードウェアタイマの分解能となる。

ofsNULL とした場合には、ofs の情報は格納されない。

上記の点を除き、本システムコールの仕様は tk_get_tim と同じである。また、tim_u のデータタイプがSYSTIM_Uとなっている点を除き、本システムコールの仕様は td_get_tim と同じである。詳細は tk_get_tim および td_get_tim の説明を参照のこと。

T-Kernel 2.0との差異

リターンパラメータofsの型がUINTからUWに変更されている。

μT-Kernel 1.0との差異

T-Kernel 2.0仕様に基づき新たに追加されたAPIである。

tk_get_otm - システム稼働時間参照

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_get_otm (SYSTIM *pk_tim );

パラメータ

SYSTIM* pk_tim Packet of Operating Time稼働時間(ミリ秒)を返す領域へのポインタ

リターンパラメータ

ER ercd Error Codeエラーコード

pk_tim の内容

W hi High 32bitsシステム稼働時間の上位32ビット
UW lo Low 32bitsシステム稼働時間の下位32ビット

エラーコード

E_OK 正常終了
E_PAR パラメータエラー(pk_tim が不正)

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

解説

システム稼働時間を取得する。

システム稼働時間はシステム時刻(時刻)と異なり、システム起動時からの単純増加する稼働時間を表す。tk_set_tim による時刻設定に影響されない。

システム稼働時間はシステム時刻と同じ精度でなければならない。

tk_get_otm_u - システム稼働時間参照(マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_get_otm_u (SYSTIM_U *tim_u , UW *ofs );

パラメータ

SYSTIM_U* tim_u Time稼働時間(マイクロ秒)を返す領域へのポインタ
UW* ofs Offsetリターンパラメータ ofs を返す領域へのポインタ

リターンパラメータ

ER ercd Error Codeエラーコード
SYSTIM_U tim_u Time稼働時間(マイクロ秒)
UW ofs Offset tim_u からの相対的な経過時間(ナノ秒)

エラーコード

E_OK 正常終了
E_PAR パラメータエラー(tim_u, ofs が不正)

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_USEC マイクロ秒命令をサポート

解説

tk_get_otm のリターンパラメータである pk_tim を64ビットマイクロ秒単位の tim_u としたシステムコールである。また、ナノ秒単位の相対時間を返す ofs のリターンパラメータを追加している。

tim_u はタイマ割込み間隔(周期)の分解能となるが、さらに細かい精度の時刻情報として、tim_u からの経過時間を ofs にナノ秒単位で取得する。ofs の分解能は実装依存であるが、一般にはハードウェアタイマの分解能となる。

ofsNULL とした場合には、ofs の情報は格納されない。

上記の点を除き、本システムコールの仕様は tk_get_otm と同じである。また、tim_u のデータタイプがSYSTIM_Uとなっている点を除き、本システムコールの仕様は td_get_otm と同じである。詳細は tk_get_otm および td_get_otm の説明を参照のこと。

T-Kernel 2.0との差異

リターンパラメータofsの型がUINTからUWに変更されている。

μT-Kernel 1.0との差異

T-Kernel 2.0仕様に基づき新たに追加されたAPIである。

周期ハンドラ

周期ハンドラは、一定周期で起動されるタイムイベントハンドラである。周期ハンドラ機能には、周期ハンドラを生成/削除する機能、周期ハンドラの動作を開始/停止する機能、周期ハンドラの状態を参照する機能が含まれる。周期ハンドラはID番号で識別されるオブジェクトである。周期ハンドラのID番号を周期ハンドラIDと呼ぶ。

周期ハンドラの起動周期と起動位相は、周期ハンドラの生成時に、周期ハンドラ毎に設定することができる。カーネルは、周期ハンドラの操作時に、設定された起動周期と起動位相から、周期ハンドラを次に起動すべき時刻を決定する。周期ハンドラの生成時には、周期ハンドラを生成した時刻に起動位相を加えた時刻を、次に起動すべき時刻とする。周期ハンドラを起動すべき時刻になると、その周期ハンドラの拡張情報(exinf)をパラメータとして、周期ハンドラを起動する。またこの時、周期ハンドラの起動すべき時刻に起動周期を加えた時刻を、次に起動すべき時刻とする。また、周期ハンドラの動作を開始する時に、次に起動すべき時刻を決定しなおす場合がある。

周期ハンドラの起動位相は、起動周期以下であることを原則とする。起動位相に、起動周期よりも長い時間が指定された場合の振舞いは、実装依存とする。

周期ハンドラは、動作している状態か動作していない状態かのいずれかの状態をとる。周期ハンドラが動作していない状態の時には、周期ハンドラを起動すべき時刻となっても周期ハンドラを起動せず、次に起動すべき時刻の決定のみを行う。周期ハンドラの動作を開始するシステムコール(tk_sta_cyc)が呼び出されると、周期ハンドラを動作している状態に移行させ、必要なら周期ハンドラを次に起動すべき時刻を決定しなおす。周期ハンドラの動作を停止するシステムコール(tk_stp_cyc)が呼び出されると、周期ハンドラを動作していない状態に移行させる。周期ハンドラを生成した後にどちらの状態になるかは、周期ハンドラ属性によって決めることができる。

周期ハンドラの起動位相は、周期ハンドラを生成するシステムコールが呼び出された時刻を基準に、周期ハンドラを最初に起動する時刻を指定する相対時間と解釈する。周期ハンドラの起動周期は、周期ハンドラを(起動した時刻ではなく)起動すべきであった時刻を基準に、周期ハンドラを次に起動する時刻を指定する相対時間と解釈する。そのため、周期ハンドラが起動される時刻の間隔は、個々には起動周期よりも短くなる場合があるが、長い期間で平均すると起動周期に一致する。

注意補足事項
 

T-Kernelの時間管理機能の処理における実際の時間分解能は、標準システム構成情報μT-Kernel/SMの機能の「タイマ割込み間隔」(TTimPeriod)によって指定されたものとなる。すなわち、周期ハンドラやアラームハンドラが実際に起動される時刻も、タイマ割込み間隔(TTimPeriod)の分解能にしたがったものとなる。このため、周期ハンドラが実際に起動されるのは、周期ハンドラを起動すべき時刻の直後のタイマ割込みの時点である。T-Kernelの一般的な実装においては、タイマ割込みの処理の中で起動すべき周期ハンドラやアラームハンドラの有無を検出し、必要に応じてそれらのハンドラを起動する。

tk_cre_cyc - 周期ハンドラの生成

C言語インタフェース

#include <tk/tkernel.h>

ID cycid = tk_cre_cyc (CONST T_CCYC *pk_ccyc );

パラメータ

CONST T_CCYC* pk_ccyc Packet to Create Cyclic Handler周期ハンドラ定義情報

pk_ccyc の内容

void* exinf Extended Information拡張情報
ATR cycatr Cyclic Handler Attribute周期ハンドラ属性
FP cychdr Cyclic Handler Address周期ハンドラアドレス
RELTIM cyctim Cycle Time周期起動時間間隔(ミリ秒)
RELTIM cycphs Cycle Phase周期起動位相(ミリ秒)
UB dsname[8] DS Object nameDSオブジェクト名称
──(以下に実装独自に他の情報を追加してもよい)──

リターンパラメータ

ID cycid Cyclic Handler ID周期ハンドラID
またはError Codeエラーコード

エラーコード

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

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

関連するサービスプロファイル

TK_SUPPORT_ASM TA_ASMの周期ハンドラ属性指定が可能
TK_SUPPORT_DSNAME TA_DSNAMEの周期ハンドラ属性指定が可能

解説

周期ハンドラを生成し周期ハンドラ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 を渡さなければならない。

cycphstk_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_dsnametd_set_dsname からのみ操作可能である。詳細は td_ref_dsnametd_set_dsname を参照のこと。TA_DSNAME を指定しなかった場合は、dsname が無視され、td_ref_dsnametd_set_dsname が、E_OBJ エラーとなる。

補足事項

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

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

cycphs に0を指定した場合、1回目の周期ハンドラの起動は、本システムコールの実行直後になる。ただし、実装上の都合により、本システムコールの実行終了の直後に周期ハンドラを起動(実行)するのではなく、本システムコールの処理中に1回目の周期ハンドラを起動(実行)する場合がある。この場合、周期ハンドラ内での割込み禁止などの状態が、2回目以降の通常の周期ハンドラ起動時とは異なっていることがある。また、cycphs に0を指定した場合の1回目の周期ハンドラの起動は、タイマ割込みを待つことなく、すなわちタイマ割込み間隔とは無関係に起動される。この点についても、2回目以降の通常の周期ハンドラの起動や、cycphs が0でない場合の周期ハンドラの起動とは異なっている。

tk_cre_cyc_u - 周期ハンドラの生成(マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

ID cycid = tk_cre_cyc_u (CONST T_CCYC_U *pk_ccyc_u );

パラメータ

CONST T_CCYC_U* pk_ccyc_u Packet to Create Cyclic Handler周期ハンドラ定義情報

pk_ccyc_u の内容

void* exinf Extended Information拡張情報
ATR cycatr Cyclic Handler Attribute周期ハンドラ属性
FP cychdr Cyclic Handler Address周期ハンドラアドレス
RELTIM_U cyctim_u Cycle Time周期起動時間間隔(マイクロ秒)
RELTIM_U cycphs_u Cycle Phase周期起動位相(マイクロ秒)
UB dsname[8] DS Object nameDSオブジェクト名称
──(以下に実装独自に他の情報を追加してもよい)──

リターンパラメータ

ID cycid Cyclic Handler ID周期ハンドラID
またはError Codeエラーコード

エラーコード

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

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_USEC マイクロ秒命令をサポート

その他、以下のサービスプロファイルが本システムコールに関係する。

TK_SUPPORT_ASM TA_ASMの周期ハンドラ属性指定が可能
TK_SUPPORT_DSNAME TA_DSNAMEの周期ハンドラ属性指定が可能

解説

tk_cre_cyc のパラメータである cyctimcycphs を64ビットマイクロ秒単位の cyctim_u, cycphs_u としたシステムコールである。

パラメータが cyctim_u, cycphs_u となった点を除き、本システムコールの仕様は tk_cre_cyc と同じである。詳細は tk_cre_cyc の説明を参照のこと。

μT-Kernel 1.0との差異

T-Kernel 2.0仕様に基づき新たに追加されたAPIである。

tk_del_cyc - 周期ハンドラの削除

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_del_cyc (ID cycid );

パラメータ

ID cycid Cyclic Handler ID周期ハンドラID

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(cycid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(cycid の周期ハンドラが存在しない)

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

解説

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

tk_sta_cyc - 周期ハンドラの動作開始

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_sta_cyc (ID cycid );

パラメータ

ID cycid Cyclic Handler ID周期ハンドラID

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(cycid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(cycid の周期ハンドラが存在しない)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

周期ハンドラを動作状態にする。

TA_PHS 属性を指定している場合は、周期ハンドラの起動周期はリセットされず、周期ハンドラを動作状態にする。すでに動作状態であれば何もせずに動作状態を維持する。

TA_PHS 属性を指定していない場合は、起動周期をリセットして、周期ハンドラを動作状態にする。すでに、動作状態であれば起動周期のリセットをした上で、動作状態を維持する。したがって、次に周期ハンドラが起動されるのは、cyctim 後となる。

tk_stp_cyc - 周期ハンドラの動作停止

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_stp_cyc (ID cycid );

パラメータ

ID cycid Cyclic Handler ID周期ハンドラID

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(cycid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(cycid の周期ハンドラが存在しない)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

周期ハンドラを動作していない状態にする。すでに動作していない状態であれば何もしない。

tk_ref_cyc - 周期ハンドラ状態参照

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_ref_cyc (ID cycid , T_RCYC *pk_rcyc );

パラメータ

ID cycid Cyclic Handler ID周期ハンドラID
T_RCYC* pk_rcyc Packet to Refer Cyclic Handler Status周期ハンドラの状態を返す領域へのポインタ

リターンパラメータ

ER ercd Error Codeエラーコード

pk_rcyc の内容

void* exinf Extended Information拡張情報
RELTIM lfttim Left Time次のハンドラ起動までの残り時間(ミリ秒)
UINT cycstat Cyclic Handler Status周期ハンドラの状態
──(以下に実装独自に他の情報を追加してもよい)──

エラーコード

E_OK 正常終了
E_ID 不正ID番号(cycid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(cycid の周期ハンドラが存在していない)
E_PAR パラメータエラー(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 を使う。

tk_ref_cyc_u - 周期ハンドラ状態参照(マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_ref_cyc_u (ID cycid , T_RCYC_U *pk_rcyc_u );

パラメータ

ID cycid Cyclic Handler ID周期ハンドラID
T_RCYC_U* pk_rcyc_u Packet to Refer Cyclic Handler Status周期ハンドラの状態を返す領域へのポインタ

リターンパラメータ

ER ercd Error Codeエラーコード

pk_rcyc_u の内容

void* exinf Extended Information拡張情報
RELTIM_U lfttim_u Left Time次のハンドラ起動までの残り時間(マイクロ秒)
UINT cycstat Cyclic Handler Status周期ハンドラの状態
──(以下に実装独自に他の情報を追加してもよい)──

エラーコード

E_OK 正常終了
E_ID 不正ID番号(cycid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(cycid の周期ハンドラが存在していない)
E_PAR パラメータエラー(pk_rcyc_u が不正)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_USEC マイクロ秒命令をサポート

解説

tk_ref_cyc のリターンパラメータである lfttim を64ビットマイクロ秒単位の lfttim_u としたシステムコールである。

リターンパラメータが lfttim_u となった点を除き、本システムコールの仕様は tk_ref_cyc と同じである。詳細は tk_ref_cyc の説明を参照のこと。

μT-Kernel 1.0との差異

T-Kernel 2.0仕様に基づき新たに追加されたAPIである。

アラームハンドラ

アラームハンドラは、指定した時刻に起動されるタイムイベントハンドラである。アラームハンドラ機能には、アラームハンドラを生成/削除する機能、アラームハンドラの動作を開始/停止する機能、アラームハンドラの状態を参照する機能が含まれる。アラームハンドラはID番号で識別されるオブジェクトである。アラームハンドラのID番号をアラームハンドラIDと呼ぶ。

アラームハンドラを起動する時刻(これをアラームハンドラの起動時刻と呼ぶ)は、アラームハンドラ毎に設定することができる。アラームハンドラの起動時刻になると、そのアラームハンドラの拡張情報(exinf)をパラメータとして、アラームハンドラを起動する。

アラームハンドラの生成直後には、アラームハンドラの起動時刻は設定されておらず、アラームハンドラの動作は停止している。アラームハンドラの動作を開始するシステムコール(tk_sta_alm)が呼び出されると、アラームハンドラの起動時刻を、システムコールが呼び出された時刻から指定された相対時間後に設定する。アラームハンドラの動作を停止するシステムコール(tk_stp_alm)が呼び出されると、アラームハンドラの起動時刻の設定を解除する。また、アラームハンドラを起動する時にも、アラームハンドラの起動時刻の設定を解除し、アラームハンドラの動作を停止する。

注意補足事項
 

アラームハンドラが実際に起動される時刻は、タイマ割込み間隔(TTimPeriod)の分解能にしたがったものとなる。詳細は周期ハンドラの補足事項を参照。

tk_cre_alm - アラームハンドラの生成

C言語インタフェース

#include <tk/tkernel.h>

ID almid = tk_cre_alm (CONST T_CALM *pk_calm );

パラメータ

CONST T_CALM* pk_calm Packet to Create Alarm Handlerアラームハンドラ定義情報

pk_calm の内容

void* exinf Extended Information拡張情報
ATR almatr Alarm Handler Attributeアラームハンドラ属性
FP almhdr Alarm Handler Addressアラームハンドラアドレス
UB dsname[8] DS Object nameDSオブジェクト名称
──(以下に実装独自に他の情報を追加してもよい)──

リターンパラメータ

ID almid Alarm Handler IDアラームハンドラID
またはError Codeエラーコード

エラーコード

E_NOMEM メモリ不足(管理ブロック用の領域が確保できない)
E_LIMIT アラームハンドラの数がシステムの制限を超えた
E_RSATR 予約属性(almatr が不正あるいは利用できない)
E_PAR パラメータエラー(pk_calm, almatr, almhdr が不正あるいは利用できない)

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

関連するサービスプロファイル

TK_SUPPORT_ASM TA_ASMのアラームハンドラ属性指定が可能
TK_SUPPORT_DSNAME TA_DSNAMEのアラームハンドラ属性指定が可能

解説

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

アラームハンドラ(指定時刻起動ハンドラ)は、指定した時刻に起動されるタスク独立部のハンドラである。

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

almatr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。almatr のシステム属性の部分では、次のような指定を行う。

almatr := (TA_ASM || TA_HLNG) | [TA_DSNAME]

TA_ASM 対象ハンドラがアセンブリ言語で書かれている
TA_HLNG 対象ハンドラが高級言語で書かれている
TA_DSNAME DSオブジェクト名称を指定する

#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_dsnametd_set_dsname からのみ操作可能である。詳細は td_ref_dsnametd_set_dsname を参照のこと。TA_DSNAME を指定しなかった場合は、dsname が無視され、td_ref_dsnametd_set_dsname が、E_OBJ エラーとなる。

補足事項

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

tk_del_alm - アラームハンドラの削除

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_del_alm (ID almid );

パラメータ

ID almid Alarm Handler IDアラームハンドラID

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(almid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(almid のアラームハンドラが存在しない)

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

解説

アラームハンドラを削除する。

tk_sta_alm - アラームハンドラの動作開始

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_sta_alm (ID almid , RELTIM almtim );

パラメータ

ID almid Alarm Handler IDアラームハンドラID
RELTIM almtim Alarm Timeアラームハンドラ起動時刻(ミリ秒)

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(almid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(almid のアラームハンドラが存在しない)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

アラームハンドラの起動時刻を設定して、動作状態にする。almtim は相対時刻で、tk_sta_alm が呼び出された時刻から almtim で指定した時間が経過した後にアラームハンドラが起動される。すでにアラームハンドラの起動時刻が設定されて動作状態であった場合には、その設定を解除した後、新たに起動時刻を設定し動作状態とする。

almtim=0の場合には、起動時刻設定直後にアラームハンドラが起動される。

tk_sta_alm_u - アラームハンドラの動作開始(マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_sta_alm_u (ID almid , RELTIM_U almtim_u );

パラメータ

ID almid Alarm Handler IDアラームハンドラID
RELTIM_U almtim_u Alarm Timeアラームハンドラ起動時刻(マイクロ秒)

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(almid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(almid のアラームハンドラが存在しない)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_USEC マイクロ秒命令をサポート

解説

tk_sta_alm のパラメータである almtim を64ビットマイクロ秒単位の almtim_u としたシステムコールである。

パラメータが almtim_u となった点を除き、本システムコールの仕様は tk_sta_alm と同じである。詳細は tk_sta_alm の説明を参照のこと。

μT-Kernel 1.0との差異

T-Kernel 2.0仕様に基づき新たに追加されたAPIである。

tk_stp_alm - アラームハンドラの動作停止

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_stp_alm (ID almid );

パラメータ

ID almid Alarm Handler IDアラームハンドラID

リターンパラメータ

ER ercd Error Codeエラーコード

エラーコード

E_OK 正常終了
E_ID 不正ID番号(almid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(almid のアラームハンドラが存在しない)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

アラームハンドラの起動時刻を解除し、動作していない状態にする。すでに動作していない状態であれば何もしない。

tk_ref_alm - アラームハンドラ状態参照

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_ref_alm (ID almid , T_RALM *pk_ralm );

パラメータ

ID almid Alarm Handler IDアラームハンドラID
T_RALM* pk_ralm Packet to Refer Alarm Handler Statusアラームハンドラの状態を返す領域へのポインタ

リターンパラメータ

ER ercd Error Codeエラーコード

pk_ralm の内容

void* exinf Extended Information拡張情報
RELTIM lfttim Left Timeハンドラ起動までの残り時間(ミリ秒)
UINT almstat Alarm Handler Statusアラームハンドラの状態
──(以下に実装独自に他の情報を追加してもよい)──

エラーコード

E_OK 正常終了
E_ID 不正ID番号(almid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(almid のアラームハンドラが存在しない)
E_PAR パラメータエラー(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 で指定した almtimlfttim ≧ 0 の範囲の値となる。lfttim はタイマ割込みごとに減算されるため、次のタイマ割込みでアラームハンドラが起動される場合に lfttim=0 となる。

exinf には、アラームハンドラを生成する際のパラメータとして指定された拡張情報が返される。exinf はアラームハンドラに引数として渡される。

アラームハンドラが動作していない(TALM_STP)場合は、lfttim は不定である。

tk_ref_alm で、almid のアラームハンドラが存在していない場合には、エラー E_NOEXS となる。

アラームハンドラ状態情報(T_RALM)における残り時間 lfttim は、ミリ秒単位に切り上げた値(単位ミリ秒)を返す。マイクロ秒単位の情報を知りたい場合には、tk_ref_alm_u を使う。

tk_ref_alm_u - アラームハンドラ状態参照(マイクロ秒単位)

C言語インタフェース

#include <tk/tkernel.h>

ER ercd = tk_ref_alm_u (ID almid , T_RALM_U *pk_ralm_u );

パラメータ

ID almid Alarm Handler IDアラームハンドラID
T_RALM_U* pk_ralm_u Packet to Refer Alarm Handler Statusアラームハンドラの状態を返す領域へのポインタ

リターンパラメータ

ER ercd Error Codeエラーコード

pk_ralm_u の内容

void* exinf Extended Information拡張情報
RELTIM_U lfttim_u Left Timeハンドラ起動までの残り時間(マイクロ秒)
UINT almstat Alarm Handler Statusアラームハンドラの状態
──(以下に実装独自に他の情報を追加してもよい)──

エラーコード

E_OK 正常終了
E_ID 不正ID番号(almid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(almid のアラームハンドラが存在しない)
E_PAR パラメータエラー(pk_ralm_u が不正)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。

TK_SUPPORT_USEC マイクロ秒命令をサポート

解説

tk_ref_alm のリターンパラメータである lfttim を64ビットマイクロ秒単位の lfttim_u としたシステムコールである。

リターンパラメータが lfttim_u となった点を除き、本システムコールの仕様は tk_ref_alm と同じである。詳細は tk_ref_alm の説明を参照のこと。

μT-Kernel 1.0との差異

T-Kernel 2.0仕様に基づき新たに追加されたAPIである。