この章では、μT-Kernel/DS(Debugger Support)で提供している機能の詳細について説明を行う。
μT-Kernel/DSは、デバッガがμT-Kernelの内部状態の参照や実行のトレースを行うための機能を提供するものである。μT-Kernel/DSの提供する機能は、デバッガ専用であり、一般のアプリケーション等からは使用しない。
全般的な注意・補足事項 | |
---|---|
|
カーネル内部状態取得機能は、デバッガがカーネルの内部状態を取得するための機能である。オブジェクトの一覧を取得する機能、タスクの優先順位を取得する機能、待ち行列に並んだタスクの並び順を取得する機能、オブジェクトやシステムやタスクレジスタの状態を取得する機能、および時刻を取得する機能が含まれる。
なし
現在使用されているタスクIDのリストを取得し、list
へ最大 nent
個分のタスクIDを格納する。戻値に、使用されているタスクの個数を返す。戻値 > nent
であれば、すべてのタスクIDは取得できていないことを示す。
なし
現在使用されているセマフォIDのリストを取得し、list
へ最大 nent
個分のセマフォIDを格納する。戻値に、使用されているセマフォの個数を返す。戻値 > nent
であれば、すべてのセマフォIDは取得できていないことを示す。
なし
現在使用されているイベントフラグIDのリストを取得し、list
へ最大 nent
個分のイベントフラグIDを格納する。戻値に、使用されているイベントフラグの個数を返す。戻値 > nent
であれば、すべてのイベントフラグIDは取得できていないことを示す。
なし
現在使用されているメールボックスIDのリストを取得し、list
へ最大 nent
個分のメールボックスIDを格納する。戻値に、使用されているメールボックスの個数を返す。戻値 > nent
であれば、すべてのメールボックスIDは取得できていないことを示す。
なし
現在使用されているミューテックスIDのリストを取得し、list
へ最大 nent
個分のミューテックスIDを格納する。戻値に、使用されているミューテックスの個数を返す。戻値 > nent
であれば、すべてのミューテックスIDは取得できていないことを示す。
なし
現在使用されているメッセージバッファIDのリストを取得し、list
へ最大 nent
個分のメッセージバッファIDを格納する。戻値に、使用されているメッセージバッファの個数を返す。戻値 > nent
であれば、すべてのメッセージバッファIDは取得できていないことを示す。
なし
現在使用されている固定長メモリプールIDのリストを取得し、list
へ最大 nent
個分の固定長メモリプールIDを格納する。戻値に、使用されている固定長メモリプールの個数を返す。戻値 > nent
であれば、すべての固定長メモリプールIDは取得できていないことを示す。
なし
現在使用されている可変長メモリプールIDのリストを取得し、list
へ最大 nent
個分の可変長メモリプールIDを格納する。戻値に、使用されている可変長メモリプールの個数を返す。戻値 > nent
であれば、すべての可変長メモリプールIDは取得できていないことを示す。
なし
現在使用されている周期ハンドラIDのリストを取得し、list
へ最大 nent
個分の周期ハンドラIDを格納する。戻値に、使用されている周期ハンドラの個数を返す。戻値 > nent
であれば、すべての周期ハンドラIDは取得できていないことを示す。
なし
現在使用されているアラームハンドラIDのリストを取得し、list
へ最大 nent
個分のアラームハンドラIDを格納する。戻値に、使用されているアラームハンドラの個数を返す。戻値 > nent
であれば、すべてのアラームハンドラIDは取得できていないことを示す。
なし
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
現在使用されているサブシステムIDのリストを取得し、list
へ最大 nent
個分のサブシステムIDを格納する。戻値に、使用されているサブシステムの個数を返す。戻値 > nent
であれば、すべてのサブシステムIDは取得できていないことを示す。
実行できる状態(実行可能状態および実行状態)のタスクのうち、優先度が pri
であるものを、優先順位の高い順に一列に並べ、その並び順にタスクIDのリストを取得する。
list
には、優先順位が最高のものを先頭としてその並び順に、タスクIDが最大 nent
個まで格納される。
戻値には、pri
の優先度を持つ実行できる状態のタスクの個数を返す。戻値 > nent
であれば、すべてのタスクIDは取得できていないことを示す。
semid
で指定したセマフォの待ち行列に並んでいるタスクのIDのリストを取得する。list
には、セマフォの待ち行列の先頭からその並び順にタスクIDが最大 nent
個まで格納される。戻値には、セマフォの待ち行列に並んでいるタスクの個数を返す。戻値 > nent
であれば、すべてのタスクIDは取得できないことを示す。
flgid
で指定したイベントフラグの待ち行列に並んでいるタスクのIDのリストを取得する。list
には、イベントフラグの待ち行列の先頭からその並び順にタスクIDが最大 nent
個まで格納される。戻値には、イベントフラグの待ち行列に並んでいるタスクの個数を返す。戻値 > nent
であれば、すべてのタスクIDは取得できないことを示す。
mbxid
で指定したメールボックスの待ち行列に並んでいるタスクのIDのリストを取得する。list
には、メールボックスの待ち行列の先頭からその並び順にタスクIDが最大 nent
個まで格納される。戻値には、メールボックスの待ち行列に並んでいるタスクの個数を返す。戻値 > nent
であれば、すべてのタスクIDは取得できないことを示す。
mtxid
で指定したミューテックスの待ち行列に並んでいるタスクのIDのリストを取得する。list
には、ミューテックスの待ち行列の先頭からその並び順にタスクIDが最大 nent
個まで格納される。戻値には、ミューテックスの待ち行列に並んでいるタスクの個数を返す。戻値 > nent
であれば、すべてのタスクIDは取得できないことを示す。
mbfid
で指定したメッセージバッファの送信待ち行列に並んでいるタスクのIDのリストを取得する。list
には、メッセージバッファの送信待ち行列の先頭からその並び順にタスクIDが最大 nent
個まで格納される。戻値には、メッセージバッファの送信待ち行列に並んでいるタスクの個数を返す。戻値 > nent
であれば、すべてのタスクIDは取得できないことを示す。
mbfid
で指定したメッセージバッファの受信待ち行列に並んでいるタスクのIDのリストを取得する。list
には、メッセージバッファの受信待ち行列の先頭からその並び順にタスクIDが最大 nent
個まで格納される。戻値には、メッセージバッファの受信待ち行列に並んでいるタスクの個数を返す。戻値 > nent
であれば、すべてのタスクIDは取得できないことを示す。
mpfid
で指定した固定長メモリプールの待ち行列に並んでいるタスクのIDのリストを取得する。list
には、固定長メモリプールの待ち行列の先頭からその並び順にタスクIDが最大 nent
個まで格納される。戻値には、固定長メモリプールの待ち行列に並んでいるタスクの個数を返す。戻値 > nent
であれば、すべてのタスクIDは取得できないことを示す。
mplid
で指定した可変長メモリプールの待ち行列に並んでいるタスクのIDのリストを取得する。list
には、可変長メモリプールの待ち行列の先頭からその並び順にタスクIDが最大 nent
個まで格納される。戻値には、可変長メモリプールの待ち行列に並んでいるタスクの個数を返す。戻値 > nent
であれば、すべてのタスクIDは取得できないことを示す。
rtsk
の内容
void* |
exinf
| Extended Information | 拡張情報 |
PRI |
tskpri
| Task Priority | 現在の優先度 |
PRI |
tskbpri
| Task Base Priority | ベース優先度 |
UINT |
tskstat
| Task State | タスク状態 |
UW |
tskwait
| Task Wait Factor | 待ち要因 |
ID |
wid
| Waiting Object ID | 待ちオブジェクトID |
INT |
wupcnt
| Wakeup Count | 起床要求キューイング数 |
INT |
suscnt
| Suspend Count | 強制待ち要求ネスト数 |
UW |
waitmask
| Wait Mask | 待ちを禁止されている待ち要因 |
UINT |
texmask
| Task Exception Mask | 許可されているタスク例外 |
UINT |
tskevent
| Task Event | 発生しているタスクイベント |
FP |
task
| Task Start Address | タスク起動アドレス |
SZ |
stksz
| User Stack Size | ユーザスタックサイズ(バイト数) |
SZ |
sstksz
| System Stack Size | システムスタックサイズ(バイト数) |
void* |
istack
| Initial User Stack Pointer | ユーザスタックポインタ初期値 |
void* |
isstack
| Initial System Stack Pointer | システムスタックポインタ初期値 |
タスクの状態を参照する。tk_ref_tsk と同等だが、タスク起動アドレスおよびスタックに関する情報が追加されている。
スタック領域は、スタックポインタ初期値の位置から低位アドレス(値の小さい方)へ向かって、スタックサイズ分となる。
istack
-stksz
≦ ユーザスタック領域 < istack
isstack
-sstksz
≦ システムスタック領域 < isstack
なお、スタックポインタ初期値(istack
, isstack
)は、スタックポインタの現在位置ではない。タスク起動前の状態であっても、スタック領域は使用されている場合がある。スタックポインタの現在位置を得るには、td_get_reg を用いる。
pk_rtex
の内容
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
タスク例外の状態を参照する。tk_ref_tex と同等。
rsem
の内容
セマフォの状態を参照する。tk_ref_sem と同等。
rflg
の内容
イベントフラグの状態を参照する。tk_ref_flg と同等。
rmbx
の内容
メールボックスの状態を参照する。tk_ref_mbx と同等。
rmtx
の内容
ミューテックスの状態を参照する。tk_ref_mtx と同等。
rmbf
の内容
メッセージバッファの状態を参照する。tk_ref_mbf と同等。
rmpf
の内容
固定長メモリプールの状態を参照する。tk_ref_mpf と同等。
rmpl
の内容
可変長メモリプールの状態を参照する。tk_ref_mpl と同等。
rcyc
の内容
周期ハンドラの状態を参照する。tk_ref_cyc と同等。
td_ref_cyc で取得する周期ハンドラ状態情報(TD_RCYC)における残り時間 lfttim
は、ミリ秒単位に切り上げた値(単位ミリ秒)を返す。マイクロ秒単位の情報を知りたい場合には、td_ref_cyc_u を使う。
rcyc_u
の内容
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
td_ref_cyc のリターンパラメータである lfttim
を64ビットマイクロ秒単位の lfttim_u
としたシステムコールである。
リターンパラメータが lfttim_u
となった点を除き、本システムコールの仕様は td_ref_cyc と同じである。詳細は td_ref_cyc の説明を参照のこと。
ralm
の内容
アラームハンドラの状態を参照する。tk_ref_alm と同等。
td_ref_alm で取得するアラームハンドラ状態情報(TD_RALM)における残り時間 lfttim
は、ミリ秒単位に切り上げた値(単位ミリ秒)を返す。マイクロ秒単位の情報を知りたい場合には、td_ref_alm_u を使う。
ralm_u
の内容
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
td_ref_alm のリターンパラメータである lfttim
を64ビットマイクロ秒単位の lfttim_u
としたシステムコールである。
リターンパラメータが lfttim_u
となった点を除き、本システムコールの仕様は td_ref_alm と同じである。詳細は td_ref_alm の説明を参照のこと。
pk_rsys
の内容
システムの状態を参照する。tk_ref_sys と同等。
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
サブシステムの状態を参照する。tk_ref_ssy と同等。
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
タスクのレジスタを参照する。tk_get_reg と同等。
現在実行状態にあるタスクは参照することはできない。タスク独立部の実行中を除けば、現在実行状態のタスクは自タスクである。
pk_regs
, pk_eit
, pk_cregs
は、それぞれ NULL を指定すると、対応するレジスタは参照されない。
T_REGS, T_EIT, T_CREGSの内容は実装定義である。
ID |
tskid
| Task ID | 対象タスクのID(TSK_SELF 不可) |
CONST T_REGS* |
pk_regs
| Packet of Registers | 汎用レジスタ |
CONST T_EIT* |
pk_eit
| Packet of EIT Registers | 例外時に保存されるレジスタ |
CONST T_CREGS* |
pk_cregs
| Packet of Control Registers | 制御レジスタ |
T_REGS, T_EIT, T_CREGSの内容は、CPUおよび実装ごとに定義する。
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
タスクのレジスタを設定する。tk_set_reg と同等。
現在実行状態にあるタスクに設定することはできない。タスク独立部の実行中を除けば、現在実行状態のタスクは自タスクである。
pk_regs
, pk_eit
, pk_cregs
は、それぞれ NULL を指定すると、対応するレジスタは設定されない。
T_REGS, T_EIT, T_CREGS の内容は実装定義である。
tim
の内容
以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
現在時刻(1970年1月1日0時0分0秒(UTC)からの通算のミリ秒数)を取得する。tim
に返される値は tk_get_utc と同じである。tim
は、タイマ割込み間隔(周期)の分解能となるが、さらに細かい精度の時刻情報として tim
からの経過時間を ofs
にナノ秒単位で取得する。ofs
の分解能は実装依存であるが、一般にはハードウェアタイマの分解能となる。
tim
は、タイマ割込みによってカウントされる時刻であるため、割込み禁止期間中にタイマ割込み周期が来た場合、タイマ割込みハンドラが起動されず(起動が遅らされ)時刻が更新されないことがある。このような場合、tim
には前回のタイマ割込みによって更新された時刻が返され、ofs
には前回のタイマ割込みからの経過時間を返す。したがって、ofs
はタイマ割込み間隔より長い時間となる場合がある。ofs
がどの程度まで長い経過時間を計測できるかはハードウェアなどに依存するが、少なくともタイマ割込み間隔の2倍未満(0≦ofs
<タイマ割込み間隔の2倍)の範囲まで計測できることが望ましい。
なお、tim
および ofs
に返される時刻は、td_get_utc を呼び出してから戻るまでにかかった時間範囲の中のどこかの時点の時刻となる。td_get_utc を呼び出した時点の時刻でも、td_get_utc から戻った時点の時刻でもない。したがって、より正確な情報を得たい場合は、割込み禁止状態で呼び出すべきである。
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
td_get_utc のリターンパラメータである tim
を64ビットマイクロ秒単位の tim_u
としたシステムコールである。
リターンパラメータが tim_u
となった点を除き、本システムコールの仕様は td_get_utc と同じである。詳細は td_get_utc の説明を参照のこと。
tim
の内容
以下のサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
現在時刻(1985年1月1日0時(GMT)からの通算のミリ秒数)を取得する。tim
に返される値は tk_get_tim と同じである。tim
は、タイマ割込み間隔(周期)の分解能となるが、さらに細かい精度の時刻情報として tim
からの経過時間を ofs
にナノ秒単位で取得する。ofs
の分解能は実装依存であるが、一般にはハードウェアタイマの分解能となる。
tim
は、タイマ割込みによってカウントされる時刻であるため、割込み禁止期間中にタイマ割込み周期が来た場合、タイマ割込みハンドラが起動されず(起動が遅らされ)時刻が更新されないことがある。このような場合、tim
には前回のタイマ割込みによって更新された時刻が返され、ofs
には前回のタイマ割込みからの経過時間を返す。したがって、ofs
はタイマ割込み間隔より長い時間となる場合がある。ofs
がどの程度まで長い経過時間を計測できるかはハードウェアなどに依存するが、少なくともタイマ割込み間隔の2倍未満(0≦ofs
<タイマ割込み間隔の2倍)の範囲まで計測できることが望ましい。
なお、tim
および ofs
に返される時刻は、td_get_tim を呼び出してから戻るまでにかかった時間範囲の中のどこかの時点の時刻となる。td_get_tim を呼び出した時点の時刻でも、td_get_tim から戻った時点の時刻でもない。したがって、より正確な情報を得たい場合は、割込み禁止状態で呼び出すべきである。
td_get_tim は td_get_utc と同等の機能を持つAPIであるが、システム時刻の起点とする日時のみが異なっている。td_get_tim は、旧バージョンのμT-KernelやT-Kernelとの互換性を維持するためのAPIである。
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
td_get_tim のリターンパラメータである tim
を64ビットマイクロ秒単位の tim_u
としたシステムコールである。
リターンパラメータが tim_u
となった点を除き、本システムコールの仕様は td_get_tim と同じである。詳細は td_get_tim の説明を参照のこと。
tim
の内容
システム稼働時間(システム起動時からの積算ミリ秒数)を取得する。tim
に返される値は tk_get_otm と同じである。tim
は、タイマ割込み間隔(周期)の分解能となるが、さらに細かい精度の時刻情報として tim
からの経過時間を ofs
にナノ秒単位で取得する。ofs
の分解能は実装依存であるが、一般にはハードウェアタイマの分解能となる。
tim
は、タイマ割込みによってカウントされる時刻であるため、割込み禁止期間中にタイマ割込み周期が来た場合、タイマ割込みハンドラが起動されず(起動が遅らされ)時刻が更新されないことがある。このような場合、tim
には前回のタイマ割込みによって更新された時刻が返され、ofs
には前回のタイマ割込みからの経過時間を返す。したがって、ofs
はタイマ割込み間隔より長い時間となる場合がある。ofs
がどの程度まで長い経過時間を計測できるかはハードウェアなどに依存するが、少なくともタイマ割込み間隔の2倍未満(0≦ofs
<タイマ割込み間隔の2倍)の範囲まで計測できることが望ましい。
なお、tim
および ofs
に返される時刻は、td_get_otm を呼び出してから戻るまでにかかった時間範囲の中のどこかの時点の時刻となる。td_get_otm を呼び出した時点の時刻でも、td_get_otm から戻った時点の時刻でもない。したがって、より正確な情報を得たい場合は、割込み禁止状態で呼び出すべきである。
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本システムコールはサポートされる。
td_get_otm のリターンパラメータである tim
を64ビットマイクロ秒単位の tim_u
としたシステムコールである。
リターンパラメータが tim_u
となった点を除き、本システムコールの仕様は td_get_otm と同じである。詳細は td_get_otm の説明を参照のこと。
オブジェクト生成時に設定したDSオブジェクト名称(dsname
)を参照する。対象となるオブジェクトは、オブジェクトタイプ(type
)とオブジェクトID(id
)で指定する。
指定可能なオブジェクトタイプ(type
)は、以下の通りである。
TN_TSK | 0x01 | タスク |
TN_SEM | 0x02 | セマフォ |
TN_FLG | 0x03 | イベントフラグ |
TN_MBX | 0x04 | メールボックス |
TN_MBF | 0x05 | メッセージバッファ |
TN_POR | 0x06 | (予約) |
TN_MTX | 0x07 | ミューテックス |
TN_MPL | 0x08 | 可変長メモリプール |
TN_MPF | 0x09 | 固定長メモリプール |
TN_CYC | 0x0a | 周期ハンドラ |
TN_ALM | 0x0b | アラームハンドラ |
DSオブジェクト名称は、オブジェクトの属性に、TA_DSNAME が指定された場合に有効となる。オブジェクト生成後に、td_set_dsname でDSオブジェクト名称を再設定した場合は、この名称が参照される。
DSオブジェクト名称の仕様は以下の通りとするが、μT-Kernelでは文字コードのチェックを行わない。
a~z, A~Z, 0~9, _
最大8バイト('\0'は含まない)
読み出したDSオブジェクト名称は '\0' で終端される。このため、dsname
には9バイト以上の領域を用意する必要がある。
オブジェクト生成時に設定したDSオブジェクト名称(dsname
)を再設定する。対象となるオブジェクトは、オブジェクトタイプ(type
)とオブジェクトID(id
)で指定する。
指定可能なオブジェクトタイプ(type
)は、td_ref_dsname と同様である。
設定可能なDSオブジェクト名称の仕様は以下の通りとするが、μT-Kernelでは文字コードのチェックを行わない。
a~z, A~Z, 0~9, _
最大8バイト(満たない場合は'\0'で埋める)
DSオブジェクト名称は、オブジェクトの属性に、TA_DSNAME が指定されている場合に有効である。TA_DSNAME 属性が指定されていないオブジェクトを対象とした場合は、エラー E_OBJ となる。