μT-Kernel 3.0 仕様書

2019 年 12 月

トロンフォーラム

www.tron.org

μT-Kernel 3.0仕様書

i

μT-Kernel 3.0仕様書

μT-Kernel 3.0仕様書

ii

製作著作 © 2019 TRON ForumμT-Kernel 3.0仕様書 (Ver.3.00.00)
本仕様書の著作権は、トロンフォーラムに属しています。
本仕様書の内容の転記、一部複製等には、トロンフォーラムの許諾が必要です。
本仕様書に記載されている内容は、今後改良等の理由でお断りなしに変更することがあります。
本仕様書に関しては、下記にお問い合わせください。
トロンフォーラム事務局〒141-0031
東京都品川区西五反田2-12-3 第一誠実ビル9F
YRPユビキタス・ネットワーキング研究所内
TEL: 03-5437-0572
FAX: 03-5437-2399
E-mail: office@tron.org

μT-Kernel 3.0仕様書

iii

REVISION HISTORYNUMBER

DATE

3.00.00

2019-12-11

DESCRIPTION
初版

NAME
TRON ForumμT-Kernel 3.0仕様書

iv

目次
APIの記述形式

1

μT-Kernel/OS API索引

3μT-Kernel/SM API索引

7μT-Kernel/DS API索引

10

1 μT-Kernel 3.0の概要

12

1.1 TRONプロジェクトとμT-Kernel 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2 μT-Kernel 3.0の設計方針 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3 μT-Kernel 3.0の構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4 リファレンスコード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.5 適応化とサービスプロファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.6 実装仕様書 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.7 既存のリアルタイムOS仕様との関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.7.1 μT-Kernel 2.0との関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.7.2 T-Kernel 2.0との関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.7.3 IEEE 2050-2018との関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2 μT-Kernelの概念

22

2.1 基本的な用語の意味 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2 タスク状態とスケジューリング規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.1 タスク状態 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.2 タスクのスケジューリング規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.3 割込み処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.4 タスク例外処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5 システム状態 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.5.1 非タスク部実行中のシステム状態 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.5.2 タスク独立部と準タスク部 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.6 オブジェクト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.7 保護レベル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.8 サービスプロファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

μT-Kernel 3.0仕様書

v

3 μT-Kernel共通規定

38

3.1 データ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.1.1 汎用的なデータ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.1.2 意味が定義されているデータ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.2 システムコール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2.1 システムコールの形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2.2 タスク独立部から発行できるAPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2.3 システムコールの呼出制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2.4 パラメータパケット形式の変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2.5 機能コード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.2.6 エラーコード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.2.7 タイムアウト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.2.8 相対時間とシステム時刻 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.3 高級言語対応ルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.4 サービスプロファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.4.1 有効・無効を示すプロファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.4.1.1 デバイスドライバ向け機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.4.1.2 省電力機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.4.1.3 動的/静的メモリ管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.4.1.4 タスク例外処理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.4.1.5 サブシステム関連機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.4.1.6 システム構成情報取得機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.4.1.7 64ビット対応、16ビット対応 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.4.1.8 CPU、ハードウェア、システム、コンパイラ依存機能 . . . . . . . . . . . . . . . . . . . . . . . . 50
3.4.1.8.1 割込み関連機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.4.1.8.2 キャッシュ制御機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.4.1.8.3 FPU(COP)サポート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.4.1.8.4 その他の機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.4.1.9 デバッグサポート関連機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.4.1.10 サービスプロファイルの判定方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.4.2 値を持つサービスプロファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.4.3 サービスプロファイルの具体例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.4.3.1 16ビットCPUでごく小規模なシステムでのプロファイル例 . . . . . . . . . . . . . . . . . . . 52
3.4.3.2 比較的大規模なシステムでのプロファイル例 . . . . . . . . . . . . . . . . . . . . . . . . . . 53

μT-Kernel 3.0仕様書

vi

4 μT-Kernel/OSの機能

55

4.1 タスク管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.1.1 tk_cre_tsk - タスク生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.1.2 tk_del_tsk - タスク削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.1.3 tk_sta_tsk - タスク起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.1.4 tk_ext_tsk - 自タスク終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.1.5 tk_exd_tsk - 自タスクの終了と削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.1.6 tk_ter_tsk - 他タスク強制終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.1.7 tk_chg_pri - タスク優先度変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.1.8 tk_get_reg - タスクレジスタの取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.1.9 tk_set_reg - タスクレジスタの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.1.10 tk_get_cpr - コプロセッサのレジスタの取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.1.11 tk_set_cpr - コプロセッサのレジスタの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.1.12 tk_ref_tsk - タスク状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.2 タスク付属同期機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.2.1 tk_slp_tsk - 自タスクを起床待ち状態へ移行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.2.2 tk_slp_tsk_u - 自タスクを起床待ち状態へ移行(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . . 83
4.2.3 tk_wup_tsk - 他タスクの起床 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.2.4 tk_can_wup - タスクの起床要求を無効化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.2.5 tk_rel_wai - 他タスクの待ち状態解除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.2.6 tk_sus_tsk - 他タスクを強制待ち状態へ移行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
4.2.7 tk_rsm_tsk - 強制待ち状態のタスクを再開 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4.2.8 tk_frsm_tsk - 強制待ち状態のタスクを強制再開 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
4.2.9 tk_dly_tsk - タスク遅延 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.2.10 tk_dly_tsk_u - タスク遅延(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.2.11 tk_sig_tev - タスクイベントの送信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
4.2.12 tk_wai_tev - タスクイベント待ち . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
4.2.13 tk_wai_tev_u - タスクイベント待ち(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.2.14 tk_dis_wai - タスク待ち状態の禁止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
4.2.15 tk_ena_wai - タスク待ち禁止の解除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
4.3 タスク例外処理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
4.3.1 tk_def_tex - タスク例外ハンドラの定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
4.3.2 tk_ena_tex - タスク例外の許可 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
4.3.3 tk_dis_tex - タスク例外の禁止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
4.3.4 tk_ras_tex - タスク例外を発生 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
4.3.5 tk_end_tex - タスク例外ハンドラの終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
4.3.6 tk_ref_tex - タスク例外の状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
4.4 同期・通信機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
4.4.1 セマフォ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

μT-Kernel 3.0仕様書

vii

4.4.1.1 tk_cre_sem - セマフォ生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
4.4.1.2 tk_del_sem - セマフォ削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
4.4.1.3 tk_sig_sem - セマフォ資源返却 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
4.4.1.4 tk_wai_sem - セマフォ資源獲得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
4.4.1.5 tk_wai_sem_u - セマフォ資源獲得(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . . . 125
4.4.1.6 tk_ref_sem - セマフォ状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
4.4.2 イベントフラグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
4.4.2.1 tk_cre_flg - イベントフラグ生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
4.4.2.2 tk_del_flg - イベントフラグ削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
4.4.2.3 tk_set_flg - イベントフラグのセット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
4.4.2.4 tk_clr_flg - イベントフラグのクリア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
4.4.2.5 tk_wai_flg - イベントフラグ待ち . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
4.4.2.6 tk_wai_flg_u - イベントフラグ待ち(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . . . 136
4.4.2.7 tk_ref_flg - イベントフラグ状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
4.4.3 メールボックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
4.4.3.1 tk_cre_mbx - メールボックス生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
4.4.3.2 tk_del_mbx - メールボックス削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
4.4.3.3 tk_snd_mbx - メールボックスへ送信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
4.4.3.4 tk_rcv_mbx - メールボックスから受信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
4.4.3.5 tk_rcv_mbx_u - メールボックスから受信(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . 148
4.4.3.6 tk_ref_mbx - メールボックス状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
4.5 拡張同期・通信機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
4.5.1 ミューテックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
4.5.1.1 tk_cre_mtx - ミューテックス生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
4.5.1.2 tk_del_mtx - ミューテックス削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
4.5.1.3 tk_loc_mtx - ミューテックスのロック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
4.5.1.4 tk_loc_mtx_u - ミューテックスのロック(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . 158
4.5.1.5 tk_unl_mtx - ミューテックスのアンロック . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
4.5.1.6 tk_ref_mtx - ミューテックス状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
4.5.2 メッセージバッファ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
4.5.2.1 tk_cre_mbf - メッセージバッファ生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
4.5.2.2 tk_del_mbf - メッセージバッファ削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
4.5.2.3 tk_snd_mbf - メッセージバッファへ送信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
4.5.2.4 tk_snd_mbf_u - メッセージバッファへ送信(マイクロ秒単位) . . . . . . . . . . . . . . . . . . 170
4.5.2.5 tk_rcv_mbf - メッセージバッファから受信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
4.5.2.6 tk_rcv_mbf_u - メッセージバッファから受信(マイクロ秒単位) . . . . . . . . . . . . . . . . . 174
4.5.2.7 tk_ref_mbf - メッセージバッファ状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
4.6 メモリプール管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
4.6.1 固定長メモリプール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

μT-Kernel 3.0仕様書

viii

4.6.1.1 tk_cre_mpf - 固定長メモリプール生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
4.6.1.2 tk_del_mpf - 固定長メモリプール削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
4.6.1.3 tk_get_mpf - 固定長メモリブロック獲得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
4.6.1.4 tk_get_mpf_u - 固定長メモリブロック獲得(マイクロ秒単位) . . . . . . . . . . . . . . . . . . 185
4.6.1.5 tk_rel_mpf - 固定長メモリブロック返却 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
4.6.1.6 tk_ref_mpf - 固定長メモリプール状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
4.6.2 可変長メモリプール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
4.6.2.1 tk_cre_mpl - 可変長メモリプール生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
4.6.2.2 tk_del_mpl - 可変長メモリプール削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
4.6.2.3 tk_get_mpl - 可変長メモリブロック獲得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
4.6.2.4 tk_get_mpl_u - 可変長メモリブロック獲得(マイクロ秒単位) . . . . . . . . . . . . . . . . . . 196
4.6.2.5 tk_rel_mpl - 可変長メモリブロック返却 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
4.6.2.6 tk_ref_mpl - 可変長メモリプール状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
4.7 時間管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
4.7.1 システム時刻管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
4.7.1.1 tk_set_utc - システム時刻設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
4.7.1.2 tk_set_utc_u - システム時刻設定(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . . . . 203
4.7.1.3 tk_set_tim - システム時刻設定(TRON表現) . . . . . . . . . . . . . . . . . . . . . . . . . . 204
4.7.1.4 tk_set_tim_u - システム時刻設定(TRON表現、マイクロ秒単位) . . . . . . . . . . . . . . . 205
4.7.1.5 tk_get_utc - システム時刻参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
4.7.1.6 tk_get_utc_u - システム時刻参照(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . . . 207
4.7.1.7 tk_get_tim - システム時刻参照(TRON表現) . . . . . . . . . . . . . . . . . . . . . . . . . . 208
4.7.1.8 tk_get_tim_u - システム時刻参照(TRON表現、マイクロ秒単位) . . . . . . . . . . . . . . . 209
4.7.1.9 tk_get_otm - システム稼働時間参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
4.7.1.10 tk_get_otm_u - システム稼働時間参照(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . 212
4.7.2 周期ハンドラ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
4.7.2.1 tk_cre_cyc - 周期ハンドラの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
4.7.2.2 tk_cre_cyc_u - 周期ハンドラの生成(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . . 217
4.7.2.3 tk_del_cyc - 周期ハンドラの削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
4.7.2.4 tk_sta_cyc - 周期ハンドラの動作開始 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
4.7.2.5 tk_stp_cyc - 周期ハンドラの動作停止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
4.7.2.6 tk_ref_cyc - 周期ハンドラ状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
4.7.2.7 tk_ref_cyc_u - 周期ハンドラ状態参照(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . 224
4.7.3 アラームハンドラ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
4.7.3.1 tk_cre_alm - アラームハンドラの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
4.7.3.2 tk_del_alm - アラームハンドラの削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
4.7.3.3 tk_sta_alm - アラームハンドラの動作開始 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
4.7.3.4 tk_sta_alm_u - アラームハンドラの動作開始(マイクロ秒単位) . . . . . . . . . . . . . . . . 230
4.7.3.5 tk_stp_alm - アラームハンドラの動作停止 . . . . . . . . . . . . . . . . . . . . . . . . . . . 231

μT-Kernel 3.0仕様書

ix

4.7.3.6 tk_ref_alm - アラームハンドラ状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
4.7.3.7 tk_ref_alm_u - アラームハンドラ状態参照(マイクロ秒単位) . . . . . . . . . . . . . . . . . . 234
4.8 割込み管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
4.8.1 tk_def_int - 割込みハンドラ定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
4.8.2 tk_ret_int - 割込みハンドラから復帰 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
4.9 システム状態管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
4.9.1 tk_rot_rdq - タスクの優先順位の回転 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
4.9.2 tk_get_tid - 実行状態タスクのタスクID参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
4.9.3 tk_dis_dsp - ディスパッチ禁止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
4.9.4 tk_ena_dsp - ディスパッチ許可 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
4.9.5 tk_ref_sys - システム状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
4.9.6 tk_set_pow - 省電力モード設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
4.9.7 tk_ref_ver - バージョン参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
4.10 サブシステム管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
4.10.1 tk_def_ssy - サブシステム定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
4.10.2 tk_evt_ssy - イベント処理関数呼出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
4.10.3 tk_ref_ssy - サブシステム定義情報の参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
5 μT-Kernel/SMの機能

264

5.1 システムメモリ管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
5.1.1 メモリ割当てライブラリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
5.1.1.1 Kmalloc - メモリの割当て . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
5.1.1.2 Kcalloc - メモリの割当てとクリア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
5.1.1.3 Krealloc - メモリの再割当て . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
5.1.1.4 Kfree - メモリの解放 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
5.2 デバイス管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
5.2.1 デバイスドライバに関する共通事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
5.2.1.1 デバイスの基本概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
5.2.1.1.1 デバイス名 (UB*型) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
5.2.1.1.2 デバイスID (ID型) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
5.2.1.1.3 デバイス属性 (ATR型) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
5.2.1.1.4 デバイスディスクリプタ (ID型) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
5.2.1.1.5 リクエストID (ID型) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
5.2.1.1.6 データ番号 (W型, D型) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
5.2.1.2 属性データ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
5.2.2 デバイスの入出力操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
5.2.2.1 tk_opn_dev - デバイスのオープン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
5.2.2.2 tk_cls_dev - デバイスのクローズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
5.2.2.3 tk_rea_dev - デバイスの読込み開始 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283

μT-Kernel 3.0仕様書

x5.2.2.4 tk_rea_dev_du - デバイスの読込み開始(64ビットマイクロ秒単位) . . . . . . . . . . . . . . 285
5.2.2.5 tk_srea_dev - デバイスの同期読込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
5.2.2.6 tk_srea_dev_d - デバイスの同期読込み(64ビット) . . . . . . . . . . . . . . . . . . . . . . 289
5.2.2.7 tk_wri_dev - デバイスの書込み開始 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
5.2.2.8 tk_wri_dev_du - デバイスの書込み開始(64ビットマイクロ秒単位) . . . . . . . . . . . . . . 293
5.2.2.9 tk_swri_dev - デバイスの同期書込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
5.2.2.10 tk_swri_dev_d - デバイスの同期書込み(64ビット) . . . . . . . . . . . . . . . . . . . . . . 297
5.2.2.11 tk_wai_dev - デバイスの要求完了待ち . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
5.2.2.12 tk_wai_dev_u - デバイスの要求完了待ち(マイクロ秒単位) . . . . . . . . . . . . . . . . . . 301
5.2.2.13 tk_sus_dev - デバイスのサスペンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
5.2.2.14 tk_get_dev - デバイスのデバイス名取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
5.2.2.15 tk_ref_dev - デバイスのデバイス情報取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
5.2.2.16 tk_oref_dev - デバイスのデバイス情報取得 . . . . . . . . . . . . . . . . . . . . . . . . . . 307
5.2.2.17 tk_lst_dev - 登録済みデバイス一覧の取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
5.2.2.18 tk_evt_dev - デバイスにドライバ要求イベントを送信 . . . . . . . . . . . . . . . . . . . . . . 310
5.2.3 デバイスドライバの登録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
5.2.3.1 デバイスドライバの登録方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
5.2.3.1.1 tk_def_dev - デバイスの登録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
5.2.3.1.2 tk_ref_idv - デバイス初期情報の取得 . . . . . . . . . . . . . . . . . . . . . . . . 315
5.2.3.2 デバイスドライバインタフェース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
5.2.3.2.1 openfn - オープン関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
5.2.3.2.2 closefn - クローズ関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
5.2.3.2.3 execfn - 処理開始関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
5.2.3.2.4 waitfn - 完了待ち関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
5.2.3.2.5 abortfn - 中止処理関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
5.2.3.2.6 eventfn - イベント関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
5.2.3.3 デバイス事象通知 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
5.2.3.4 各デバイスのサスペンド／リジューム処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
5.2.3.4.1 デバイスのサスペンド処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
5.2.3.4.2 デバイスのリジューム処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
5.3 割込み管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
5.3.1 CPU割込み制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
5.3.1.1 DI - 外部割込み禁止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
5.3.1.2 EI - 外部割込み許可 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
5.3.1.3 isDI - 外部割込み禁止状態の取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
5.3.1.4 SetCpuIntLevel - CPU内割込みマスクレベルの設定 . . . . . . . . . . . . . . . . . . . . . 337
5.3.1.5 GetCpuIntLevel - CPU内割込みマスクレベルの取得 . . . . . . . . . . . . . . . . . . . . . 339
5.3.2 割込みコントローラ制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
5.3.2.1 EnableInt - 割込み許可 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341

μT-Kernel 3.0仕様書

xi

5.3.2.2 DisableInt - 割込み禁止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
5.3.2.3 ClearInt - 割込み発生のクリア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
5.3.2.4 EndOfInt - 割込みコントローラにEOI発行 . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
5.3.2.5 CheckInt - 割込み発生の検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
5.3.2.6 SetIntMode - 割込みモード設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
5.3.2.7 SetCtrlIntLevel - 割込みコントローラ内割込みマスクレベルの設定 . . . . . . . . . . . . . 347
5.3.2.8 GetCtrlIntLevel - 割込みコントローラ内割込みマスクレベルの取得 . . . . . . . . . . . . . 349
5.4 I/Oポートアクセスサポート機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
5.4.1 I/Oポートアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
5.4.1.1 out_b - I/Oポート書込み(バイト) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
5.4.1.2 out_h - I/Oポート書込み(ハーフワード) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
5.4.1.3 out_w - I/Oポート書込み(ワード) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
5.4.1.4 out_d - I/Oポート書込み(ダブルワード) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
5.4.1.5 in_b - I/Oポート読込み(バイト) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
5.4.1.6 in_h - I/Oポート読込み(ハーフワード) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
5.4.1.7 in_w - I/Oポート読込み(ワード) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
5.4.1.8 in_d - I/Oポート読込み(ダブルワード) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
5.4.2 微小待ち . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
5.4.2.1 WaitUsec - 微小待ち(マイクロ秒) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
5.4.2.2 WaitNsec - 微小待ち(ナノ秒) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
5.5 省電力機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
5.5.1 low_pow - システムを低消費電力モードに移行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
5.5.2 off_pow - システムをサスペンド状態に移行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
5.6 システム構成情報管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
5.6.1 システム構成情報の取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
5.6.1.1 tk_get_cfn - システム構成情報から数値列取得 . . . . . . . . . . . . . . . . . . . . . . . . 369
5.6.1.2 tk_get_cfs - システム構成情報から文字列取得 . . . . . . . . . . . . . . . . . . . . . . . . . 370
5.6.2 標準システム構成情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
5.7 メモリキャッシュ制御機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
5.7.1 SetCacheMode - キャッシュモードの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
5.7.2 ControlCache - キャッシュの制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
5.8 物理タイマ機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
5.8.1 物理タイマのユースケース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
5.8.2 StartPhysicalTimer - 物理タイマの動作開始 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
5.8.3 StopPhysicalTimer - 物理タイマの動作停止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
5.8.4 GetPhysicalTimerCount - 物理タイマのカウント値取得 . . . . . . . . . . . . . . . . . . . . . . . . . 384
5.8.5 DefinePhysicalTimerHandler - 物理タイマハンドラ定義 . . . . . . . . . . . . . . . . . . . . . . . . 385
5.8.6 GetPhysicalTimerConfig - 物理タイマのコンフィグレーション情報取得 . . . . . . . . . . . . . . . . 387
5.9 ユーティリティ機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389

μT-Kernel 3.0仕様書

xii

5.9.1 オブジェクト名設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
5.9.1.1 SetOBJNAME - オブジェクト名設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
5.9.2 高速ロック・マルチロックライブラリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
5.9.2.1 CreateLock - 高速ロックの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
5.9.2.2 DeleteLock - 高速ロックの削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
5.9.2.3 Lock - 高速ロックのロック操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
5.9.2.4 Unlock - 高速ロックのロック解除操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
5.9.2.5 CreateMLock - 高速マルチロックの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
5.9.2.6 DeleteMLock - 高速マルチロックの削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
5.9.2.7 MLock - 高速マルチロックのロック操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
5.9.2.8 MLockTmo - 高速マルチロックのロック操作(タイムアウト指定付き) . . . . . . . . . . . . . 400
5.9.2.9 MLockTmo_u - 高速マルチロックのロック操作(タイムアウト指定付き、マイクロ秒単位) . . . 401
5.9.2.10 MUnlock - 高速マルチロックのロック解除操作 . . . . . . . . . . . . . . . . . . . . . . . . . 402
6 μT-Kernel/DSの機能

403

6.1 カーネル内部状態取得機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
6.1.1 td_lst_tsk - タスクIDのリスト参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
6.1.2 td_lst_sem - セマフォIDのリスト参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
6.1.3 td_lst_flg - イベントフラグIDのリスト参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
6.1.4 td_lst_mbx - メールボックスIDのリスト参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
6.1.5 td_lst_mtx - ミューテックスIDのリスト参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
6.1.6 td_lst_mbf - メッセージバッファIDのリスト参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
6.1.7 td_lst_mpf - 固定長メモリプールIDのリスト参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
6.1.8 td_lst_mpl - 可変長メモリプールIDのリスト参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
6.1.9 td_lst_cyc - 周期ハンドラIDのリスト参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
6.1.10 td_lst_alm - アラームハンドラIDのリスト参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
6.1.11 td_lst_ssy - サブシステムIDのリスト参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
6.1.12 td_rdy_que - タスクの優先順位の参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
6.1.13 td_sem_que - セマフォの待ち行列の参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
6.1.14 td_flg_que - イベントフラグの待ち行列の参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
6.1.15 td_mbx_que - メールボックスの待ち行列の参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
6.1.16 td_mtx_que - ミューテックスの待ち行列の参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
6.1.17 td_smbf_que - メッセージバッファの送信待ち行列の参照 . . . . . . . . . . . . . . . . . . . . . . . . 421
6.1.18 td_rmbf_que - メッセージバッファの受信待ち行列の参照 . . . . . . . . . . . . . . . . . . . . . . . . 422
6.1.19 td_mpf_que - 固定長メモリプールの待ち行列の参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
6.1.20 td_mpl_que - 可変長メモリプールの待ち行列の参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
6.1.21 td_ref_tsk - タスク状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
6.1.22 td_ref_tex - タスク例外の状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
6.1.23 td_ref_sem - セマフォ状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428

μT-Kernel 3.0仕様書

xiii

6.1.24 td_ref_flg - イベントフラグ状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
6.1.25 td_ref_mbx - メールボックス状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
6.1.26 td_ref_mtx - ミューテックス状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
6.1.27 td_ref_mbf - メッセージバッファ状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
6.1.28 td_ref_mpf - 固定長メモリプール状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
6.1.29 td_ref_mpl - 可変長メモリプール状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
6.1.30 td_ref_cyc - 周期ハンドラ状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
6.1.31 td_ref_cyc_u - 周期ハンドラ状態参照(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . . . . . . . 436
6.1.32 td_ref_alm - アラームハンドラ状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
6.1.33 td_ref_alm_u - アラームハンドラ状態参照(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . . . . 438
6.1.34 td_ref_sys - システム状態参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
6.1.35 td_ref_ssy - サブシステム定義情報の参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
6.1.36 td_get_reg - タスクレジスタの参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
6.1.37 td_set_reg - タスクレジスタの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
6.1.38 td_get_utc - システム時刻参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
6.1.39 td_get_utc_u - システム時刻参照(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
6.1.40 td_get_tim - システム時刻参照(TRON表現) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
6.1.41 td_get_tim_u - システム時刻参照(TRON表現、マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . 449
6.1.42 td_get_otm - システム稼働時間参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
6.1.43 td_get_otm_u - システム稼働時間参照(マイクロ秒単位) . . . . . . . . . . . . . . . . . . . . . . . . . 452
6.1.44 td_ref_dsname - DSオブジェクト名称の参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
6.1.45 td_set_dsname - DSオブジェクト名称の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
6.2 実行トレース機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
6.2.1 td_hok_svc - システムコール・拡張SVCのフックルーチン定義 . . . . . . . . . . . . . . . . . . . . . . 458
6.2.2 td_hok_dsp - タスクディスパッチのフックルーチン定義 . . . . . . . . . . . . . . . . . . . . . . . . . . 460
6.2.3 td_hok_int - 割込みハンドラのフックルーチン定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
7 付録

464

7.1 システムコンフィギュレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
7.2 キーワード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
8 リファレンス

467

8.1 C言語インタフェース一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
8.1.1 μT-Kernel/OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
8.1.1.1 タスク管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
8.1.1.2 タスク付属同期機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
8.1.1.3 タスク例外処理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
8.1.1.4 同期・通信機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
8.1.1.5 拡張同期・通信機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470

μT-Kernel 3.0仕様書

xiv

8.1.1.6 メモリプール管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
8.1.1.7 時間管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
8.1.1.8 割込み管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
8.1.1.9 システム状態管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
8.1.1.10 サブシステム管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
8.1.2 μT-Kernel/SM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
8.1.2.1 システムメモリ管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
8.1.2.2 デバイス管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
8.1.2.3 割込み管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
8.1.2.4 I/Oポートアクセスサポート機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
8.1.2.5 省電力機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
8.1.2.6 システム構成情報管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
8.1.2.7 メモリキャッシュ制御機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
8.1.2.8 物理タイマ機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
8.1.2.9 ユーティリティ機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
8.1.3 μT-Kernel/DS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
8.1.3.1 カーネル内部状態取得機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
8.1.3.2 実行トレース機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
8.2 エラーコード一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
8.2.1 正常終了のエラークラス (0) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
8.2.2 内部エラークラス (5〜8) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
8.2.3 未サポートエラークラス (9〜16) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
8.2.4 パラメータエラークラス (17〜24) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
8.2.5 呼出コンテキストエラークラス (25〜32) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
8.2.6 資源不足エラークラス (33〜40) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
8.2.7 オブジェクト状態エラークラス (41〜48) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
8.2.8 待ち解除エラークラス (49〜56) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
8.2.9 デバイスエラークラス (57〜64) (μT-Kernel/SM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
8.2.10 各種状態エラークラス (65〜72) (μT-Kernel/SM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
8.3 APIとサービスプロファイルの一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
8.3.1 μT-Kernel/OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
8.3.1.1 タスク管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
8.3.1.2 タスク付属同期機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
8.3.1.3 タスク例外処理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
8.3.1.4 同期・通信機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
8.3.1.5 拡張同期・通信機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
8.3.1.6 メモリプール管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
8.3.1.7 時間管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
8.3.1.8 割込み管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483

μT-Kernel 3.0仕様書

xv

8.3.1.9 システム状態管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
8.3.1.10 サブシステム管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
8.3.2 μT-Kernel/SM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
8.3.2.1 システムメモリ管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
8.3.2.2 デバイス管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
8.3.2.3 割込み管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
8.3.2.4 I/Oポートアクセスサポート機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
8.3.2.5 省電力機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
8.3.2.6 システム構成情報管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
8.3.2.7 メモリキャッシュ制御機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
8.3.2.8 物理タイマ機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
8.3.2.9 ユーティリティ機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
8.3.3 μT-Kernel/DS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
8.3.3.1 カーネル内部状態取得機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
8.3.3.2 実行トレース機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487

μT-Kernel 3.0仕様書

xvi

図版目次

1.1 μT-Kernel 3.0 の位置づけと構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1 タスク状態遷移図 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.2 最初の状態の優先順位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.3 タスクBが実行状態になった後の優先順位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.4 タスクBが待ち状態になった後の優先順位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5 タスクBが待ち解除された後の優先順位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.6 システム状態の分類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.7 割込みのネストと遅延ディスパッチ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.1 高級言語対応ルーチンの動作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.1 イベントフラグに対する複数タスク待ちの機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
4.2 メールボックスで使用されるメッセージの形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
4.3 メッセージバッファによる同期通信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
4.4 bufsz＝0のメッセージバッファを使った同期式通信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
4.5 tk_rot_rdq実行前の優先順位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
4.6 tk_rot_rdq(tskpri=2)実行後の優先順位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
4.7 maker のフォーマット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
4.8 prid のフォーマット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
4.9 spver のフォーマット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
4.10 サブシステム概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
5.1 デバイス管理機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

μT-Kernel 3.0仕様書

xvii

表目次

2.1 自タスク、他タスクの区別と状態遷移図 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.1 tk_ter_tskの対象タスクの状態と実行結果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.2 tskwait と wid の値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.3 tk_rel_waiの対象タスクの状態と実行結果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.1 同じデバイスを同時にオープンしようとしたときの可否 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281

μT-Kernel 3.0仕様書

1 / 487

APIの記述形式
本仕様書のAPI説明の部分では、API(Application Programming Interface)ごとに、以下のような形式で仕様の説明を行っている。なお、APIには、カーネルの機能を直接的に呼び出すシステムコールのほかに、拡張SVC(拡張システムコール)や
マクロ、ライブラリとして実現されるものも含まれる。

API名称 - 説明
APIの名称および説明を示す。

C言語インタフェース
APIのC言語インタフェースおよびインクルードするヘッダファイルを示す。

パラメータ
APIのパラメータ、すなわちAPIを発行するときにμT-Kernelに渡す情報に関する説明を行う。

リターンパラメータ
APIのリターンパラメータ、すなわちAPIの実行が終ったときにμT-Kernelから返される情報に関する説明を行う。
なお、リターンパラメータのうち、APIの関数値として戻されるものを「戻値」と呼ぶことがある。リターンパラメータには、戻値のほかに、パラメータとして渡されたポインタの参照先に情報を返すものがある。

エラーコード
APIで発生する可能性のあるエラーに関して説明を行う。
以下のエラーコードについては、各APIのエラーコードの説明の項には含めていないが、各APIにおいて共通に発生する可能性がある。
E_SYS , E_NOSPT , E_RSFN , E_MACV , E_OACV
以下のエラーコードの検出は実装依存であり、エラーとして検出されない場合がある。
E_PAR , E_MACV , E_CTX
エラーコード E_CTX については、待ち状態に入るAPIのタスク独立部からの呼出など、APIの呼出コンテキストに意味的な誤りがある場合についてのみ、各APIのエラーコードの説明に含めている。呼出コンテキストに関する制約が実装依存であり、必ずしもエラーとする必要がない条件については、各APIのエラーコードの説明の項には含めていない。
また、実装上の制限事項により、エラーコードの説明に含まれない条件でエラーが発生する可能性もある。

μT-Kernel 3.0仕様書

2 / 487

利用可能なコンテキスト
APIを発行することができるコンテキスト(タスク部、準タスク部、タスク独立部)を示す。なお、「×」を記した項目については該当するコンテキストにおいて明確に利用可能でないAPIのほか、利用可能であるかどうかが実装依存となっている項目を含んでおり、実装によっては利用可能である可能性がある。

関連するサービスプロファイル
APIに関連するサービスプロファイルとの関係を示す。

解説
APIの機能の解説を行う。
いくつかの値を選択して設定するようなパラメータの場合には、以下のような記述方法によって仕様説明を行っている。
( x || y || z )x, y, z のいずれか一つを選択して指定する。
x｜y
x と y を同時に指定可能である。 (同時に指定する場合は x と y の論理和をとる)[x]x は指定しても指定しなくても良い。
パラメータの記述例
wfmode := (TWF_ANDW || TWF_ORW) ｜ [TWF_CLR]の場合、wfmode の指定は次の4種のいずれかになる。
TWF_ANDWTWF_ORW(TWF_ANDW | TWF_CLR)(TWF_ORW | TWF_CLR)

補足事項
特記事項や注意すべき点など、解説に対する補足事項を述べる。

仕様決定の理由
仕様決定の理由を述べる。

μT-Kernel 3.0仕様書

μT-Kernel/OS API索引
この索引は、本仕様書で説明されるμT-Kernel/OS APIのアルファベット順索引である。
• tk_can_wup - タスクの起床要求を無効化• tk_chg_pri - タスク優先度変更• tk_clr_flg - イベントフラグのクリア• tk_cre_alm - アラームハンドラの生成• tk_cre_cyc - 周期ハンドラの生成• tk_cre_cyc_u - 周期ハンドラの生成(マイクロ秒単位)• tk_cre_flg - イベントフラグ生成• tk_cre_mbf - メッセージバッファ生成• tk_cre_mbx - メールボックス生成• tk_cre_mpf - 固定長メモリプール生成• tk_cre_mpl - 可変長メモリプール生成• tk_cre_mtx - ミューテックス生成• tk_cre_sem - セマフォ生成• tk_cre_tsk - タスク生成• tk_def_int - 割込みハンドラ定義• tk_def_ssy - サブシステム定義• tk_def_tex - タスク例外ハンドラの定義• tk_del_alm - アラームハンドラの削除• tk_del_cyc - 周期ハンドラの削除• tk_del_flg - イベントフラグ削除• tk_del_mbf - メッセージバッファ削除• tk_del_mbx - メールボックス削除• tk_del_mpf - 固定長メモリプール削除• tk_del_mpl - 可変長メモリプール削除• tk_del_mtx - ミューテックス削除• tk_del_sem - セマフォ削除

3 / 487

μT-Kernel 3.0仕様書• tk_del_tsk - タスク削除• tk_dis_dsp - ディスパッチ禁止• tk_dis_tex - タスク例外の禁止• tk_dis_wai - タスク待ち状態の禁止• tk_dly_tsk - タスク遅延• tk_dly_tsk_u - タスク遅延(マイクロ秒単位)• tk_ena_dsp - ディスパッチ許可• tk_ena_tex - タスク例外の許可• tk_ena_wai - タスク待ち禁止の解除• tk_end_tex - タスク例外ハンドラの終了• tk_evt_ssy - イベント処理関数呼出• tk_exd_tsk - 自タスクの終了と削除• tk_ext_tsk - 自タスク終了• tk_frsm_tsk - 強制待ち状態のタスクを強制再開• tk_get_cpr - コプロセッサのレジスタの取得• tk_get_mpf - 固定長メモリブロック獲得• tk_get_mpf_u - 固定長メモリブロック獲得(マイクロ秒単位)• tk_get_mpl - 可変長メモリブロック獲得• tk_get_mpl_u - 可変長メモリブロック獲得(マイクロ秒単位)• tk_get_otm - システム稼働時間参照• tk_get_otm_u - システム稼働時間参照(マイクロ秒単位)• tk_get_reg - タスクレジスタの取得• tk_get_tid - 実行状態タスクのタスクID参照• tk_get_tim - システム時刻参照(TRON表現)• tk_get_tim_u - システム時刻参照(TRON表現、マイクロ秒単位)• tk_get_utc - システム時刻参照• tk_get_utc_u - システム時刻参照(マイクロ秒単位)• tk_loc_mtx - ミューテックスのロック• tk_loc_mtx_u - ミューテックスのロック(マイクロ秒単位)• tk_ras_tex - タスク例外を発生• tk_rcv_mbf - メッセージバッファから受信• tk_rcv_mbf_u - メッセージバッファから受信(マイクロ秒単位)• tk_rcv_mbx - メールボックスから受信• tk_rcv_mbx_u - メールボックスから受信(マイクロ秒単位)• tk_ref_alm - アラームハンドラ状態参照

4 / 487

μT-Kernel 3.0仕様書• tk_ref_alm_u - アラームハンドラ状態参照(マイクロ秒単位)• tk_ref_cyc - 周期ハンドラ状態参照• tk_ref_cyc_u - 周期ハンドラ状態参照(マイクロ秒単位)• tk_ref_flg - イベントフラグ状態参照• tk_ref_mbf - メッセージバッファ状態参照• tk_ref_mbx - メールボックス状態参照• tk_ref_mpf - 固定長メモリプール状態参照• tk_ref_mpl - 可変長メモリプール状態参照• tk_ref_mtx - ミューテックス状態参照• tk_ref_sem - セマフォ状態参照• tk_ref_ssy - サブシステム定義情報の参照• tk_ref_sys - システム状態参照• tk_ref_tex - タスク例外の状態参照• tk_ref_tsk - タスク状態参照• tk_ref_ver - バージョン参照• tk_rel_mpf - 固定長メモリブロック返却• tk_rel_mpl - 可変長メモリブロック返却• tk_rel_wai - 他タスクの待ち状態解除• tk_ret_int - 割込みハンドラから復帰• tk_rot_rdq - タスクの優先順位の回転• tk_rsm_tsk - 強制待ち状態のタスクを再開• tk_set_cpr - コプロセッサのレジスタの設定• tk_set_flg - イベントフラグのセット• tk_set_pow - 省電力モード設定• tk_set_reg - タスクレジスタの設定• tk_set_tim - システム時刻設定(TRON表現)• tk_set_tim_u - システム時刻設定(TRON表現、マイクロ秒単位)• tk_set_utc - システム時刻設定• tk_set_utc_u - システム時刻設定(マイクロ秒単位)• tk_sig_sem - セマフォ資源返却• tk_sig_tev - タスクイベントの送信• tk_slp_tsk - 自タスクを起床待ち状態へ移行• tk_slp_tsk_u - 自タスクを起床待ち状態へ移行(マイクロ秒単位)• tk_snd_mbf - メッセージバッファへ送信• tk_snd_mbf_u - メッセージバッファへ送信(マイクロ秒単位)

5 / 487

μT-Kernel 3.0仕様書• tk_snd_mbx - メールボックスへ送信• tk_sta_alm - アラームハンドラの動作開始• tk_sta_alm_u - アラームハンドラの動作開始(マイクロ秒単位)• tk_sta_cyc - 周期ハンドラの動作開始• tk_sta_tsk - タスク起動• tk_stp_alm - アラームハンドラの動作停止• tk_stp_cyc - 周期ハンドラの動作停止• tk_sus_tsk - 他タスクを強制待ち状態へ移行• tk_ter_tsk - 他タスク強制終了• tk_unl_mtx - ミューテックスのアンロック• tk_wai_flg - イベントフラグ待ち• tk_wai_flg_u - イベントフラグ待ち(マイクロ秒単位)• tk_wai_sem - セマフォ資源獲得• tk_wai_sem_u - セマフォ資源獲得(マイクロ秒単位)• tk_wai_tev - タスクイベント待ち• tk_wai_tev_u - タスクイベント待ち(マイクロ秒単位)• tk_wup_tsk - 他タスクの起床

6 / 487

μT-Kernel 3.0仕様書

μT-Kernel/SM API索引
この索引は、本仕様書で説明されるμT-Kernel/SM APIのアルファベット順索引である。
• abortfn - 中止処理関数• CheckInt - 割込み発生の検査• ClearInt - 割込み発生のクリア• closefn - クローズ関数• ControlCache - キャッシュの制御• CreateLock - 高速ロックの生成• CreateMLock - 高速マルチロックの生成• DefinePhysicalTimerHandler - 物理タイマハンドラ定義• DeleteLock - 高速ロックの削除• DeleteMLock - 高速マルチロックの削除• DI - 外部割込み禁止• DisableInt - 割込み禁止• EI - 外部割込み許可• EnableInt - 割込み許可• EndOfInt - 割込みコントローラにEOI発行• eventfn - イベント関数• execfn - 処理開始関数• GetCpuIntLevel - CPU内割込みマスクレベルの取得• GetCtrlIntLevel - 割込みコントローラ内割込みマスクレベルの取得• GetPhysicalTimerConfig - 物理タイマのコンフィグレーション情報取得• GetPhysicalTimerCount - 物理タイマのカウント値取得• in_b - I/Oポート読込み(バイト)• in_d - I/Oポート読込み(ダブルワード)• in_h - I/Oポート読込み(ハーフワード)• in_w - I/Oポート読込み(ワード)• isDI - 外部割込み禁止状態の取得

7 / 487

μT-Kernel 3.0仕様書• Kcalloc - メモリの割当てとクリア• Kfree - メモリの解放• Kmalloc - メモリの割当て• Krealloc - メモリの再割当て• Lock - 高速ロックのロック操作• low_pow - システムを低消費電力モードに移行• MLock - 高速マルチロックのロック操作• MLockTmo - 高速マルチロックのロック操作(タイムアウト指定付き)• MLockTmo_u - 高速マルチロックのロック操作(タイムアウト指定付き、マイクロ秒単位)• MUnlock - 高速マルチロックのロック解除操作• off_pow - システムをサスペンド状態に移行• openfn - オープン関数• out_b - I/Oポート書込み(バイト)• out_d - I/Oポート書込み(ダブルワード)• out_h - I/Oポート書込み(ハーフワード)• out_w - I/Oポート書込み(ワード)• SetCacheMode - キャッシュモードの設定• SetCpuIntLevel - CPU内割込みマスクレベルの設定• SetCtrlIntLevel - 割込みコントローラ内割込みマスクレベルの設定• SetIntMode - 割込みモード設定• SetOBJNAME - オブジェクト名設定• StartPhysicalTimer - 物理タイマの動作開始• StopPhysicalTimer - 物理タイマの動作停止• tk_cls_dev - デバイスのクローズ• tk_def_dev - デバイスの登録• tk_evt_dev - デバイスにドライバ要求イベントを送信• tk_get_cfn - システム構成情報から数値列取得• tk_get_cfs - システム構成情報から文字列取得• tk_get_dev - デバイスのデバイス名取得• tk_lst_dev - 登録済みデバイス一覧の取得• tk_opn_dev - デバイスのオープン• tk_oref_dev - デバイスのデバイス情報取得• tk_rea_dev - デバイスの読込み開始• tk_rea_dev_du - デバイスの読込み開始(64ビットマイクロ秒単位)• tk_ref_dev - デバイスのデバイス情報取得

8 / 487

μT-Kernel 3.0仕様書• tk_ref_idv - デバイス初期情報の取得• tk_srea_dev - デバイスの同期読込み• tk_srea_dev_d - デバイスの同期読込み(64ビット)• tk_sus_dev - デバイスのサスペンド• tk_swri_dev - デバイスの同期書込み• tk_swri_dev_d - デバイスの同期書込み(64ビット)• tk_wai_dev - デバイスの要求完了待ち• tk_wai_dev_u - デバイスの要求完了待ち(マイクロ秒単位)• tk_wri_dev - デバイスの書込み開始• tk_wri_dev_du - デバイスの書込み開始(64ビットマイクロ秒単位)• Unlock - 高速ロックのロック解除操作• waitfn - 完了待ち関数• WaitNsec - 微小待ち(ナノ秒)• WaitUsec - 微小待ち(マイクロ秒)

9 / 487

μT-Kernel 3.0仕様書

μT-Kernel/DS API索引
この索引は、本仕様書で説明されるμT-Kernel/DS APIのアルファベット順索引である。
• td_flg_que - イベントフラグの待ち行列の参照• td_get_otm - システム稼働時間参照• td_get_otm_u - システム稼働時間参照(マイクロ秒単位)• td_get_reg - タスクレジスタの参照• td_get_tim - システム時刻参照(TRON表現)• td_get_tim_u - システム時刻参照(TRON表現、マイクロ秒単位)• td_get_utc - システム時刻参照• td_get_utc_u - システム時刻参照(マイクロ秒単位)• td_hok_dsp - タスクディスパッチのフックルーチン定義• td_hok_int - 割込みハンドラのフックルーチン定義• td_hok_svc - システムコール・拡張SVCのフックルーチン定義• td_lst_alm - アラームハンドラIDのリスト参照• td_lst_cyc - 周期ハンドラIDのリスト参照• td_lst_flg - イベントフラグIDのリスト参照• td_lst_mbf - メッセージバッファIDのリスト参照• td_lst_mbx - メールボックスIDのリスト参照• td_lst_mpf - 固定長メモリプールIDのリスト参照• td_lst_mpl - 可変長メモリプールIDのリスト参照• td_lst_mtx - ミューテックスIDのリスト参照• td_lst_sem - セマフォIDのリスト参照• td_lst_ssy - サブシステムIDのリスト参照• td_lst_tsk - タスクIDのリスト参照• td_mbx_que - メールボックスの待ち行列の参照• td_mpf_que - 固定長メモリプールの待ち行列の参照• td_mpl_que - 可変長メモリプールの待ち行列の参照• td_mtx_que - ミューテックスの待ち行列の参照

10 / 487

μT-Kernel 3.0仕様書• td_rdy_que - タスクの優先順位の参照• td_ref_alm - アラームハンドラ状態参照• td_ref_alm_u - アラームハンドラ状態参照(マイクロ秒単位)• td_ref_cyc - 周期ハンドラ状態参照• td_ref_cyc_u - 周期ハンドラ状態参照(マイクロ秒単位)• td_ref_dsname - DSオブジェクト名称の参照• td_ref_flg - イベントフラグ状態参照• td_ref_mbf - メッセージバッファ状態参照• td_ref_mbx - メールボックス状態参照• td_ref_mpf - 固定長メモリプール状態参照• td_ref_mpl - 可変長メモリプール状態参照• td_ref_mtx - ミューテックス状態参照• td_ref_sem - セマフォ状態参照• td_ref_ssy - サブシステム定義情報の参照• td_ref_sys - システム状態参照• td_ref_tex - タスク例外の状態参照• td_ref_tsk - タスク状態参照• td_rmbf_que - メッセージバッファの受信待ち行列の参照• td_sem_que - セマフォの待ち行列の参照• td_set_dsname - DSオブジェクト名称の設定• td_set_reg - タスクレジスタの設定• td_smbf_que - メッセージバッファの送信待ち行列の参照

11 / 487

μT-Kernel 3.0仕様書

第1章

μT-Kernel 3.0の概要

12 / 487

μT-Kernel 3.0仕様書

13 / 487

1.1 TRONプロジェクトとμT-Kernel 3.0
本仕様書では、「μT-Kernel 3.0」と呼ばれるリアルタイムOSの仕様を規定している。μT-Kernel 3.0は、1984年に東京大学の坂村健博士により始められたTRONプロジェクト(http://www.tron.org/)の最新の成果である。
TRONプロジェクトでは、当時登場したばかりの小さな制御用マイクロコンピュータが、身の回りのあらゆる機器の中に組み込
まれ、相互に通信しながら機器を制御することによって、人間にとって最適な環境を作ることを想定した。TRONプロジェクトにおいては、このような概念を「超機能分散システム(HFDS: Highly-Functionally Distributed System)」と呼び、この制御を効率よく行うためのリアルタイムOS「ITRON」を開発した。ITRONの最初のバージョンであるITRON1の仕様書は1987年に出版されている。さらに、オープンの哲学に基づいてその仕様書や技術情報を誰でも無償で利用できるように公開し、産学協同での研究開発を進めた。その結果、非常に多くのプロセッサで動作するITRON仕様OSが誕生し、組込み機器用リアルタ
イムOSのデファクトスタンダードとなった。並行して、ITRONの機能を強化し、適応性をより高めたバージョンアップ版である「μITRON」の開発が行われた。ITRONやμITRONは、家電やAV機器などの民生品から自動車のエンジン制御、工場内の機械制御といった産業分野まで、さまざまな分野の組込みシステムに採用された。
TRONプロジェクトの提唱したHFDSの概念は、21世紀に入る頃には「ユビキタスコンピューティング」と呼ばれるようになり、さらに現在ではIoT(Internet of Things)と呼ばれている。TRONプロジェクトでは、1984年のプロジェクト開始当初より、今で言うIoTがマイクロコンピュータの重要な応用分野になると考え、そのためのOSやアーキテクチャの研究開発を行ってきた。
IoTエッジノード向けとしては、μITRONをさらに改良した省資源の組込みリアルタイムOS「μT-Kernel」が開発された。
こういった成果と実績により、プロジェクト開始から30年後の2010年代においては、組込み機器の約60%がTRONプロジ
ェクトの成果を利用していると報告されている(https://www.tron.org/ja/2018/04/press20180403/)。さらに2018年には、世界規模の標準化組織であるIEEE(Institute of Electrical and Electronics Engineers, 米国電気電子学会)が、μT-Kernelのバージョンアップ版であるμT-Kernel 2.0をIoTエッジノード向けリアルタイムOSの標準仕様として認定し、ほぼ同等の仕様を「IEEE 2050-2018」として公開した。
本書で仕様を規定するμT-Kernel 3.0は、IoTエッジノードの制御用に特化する形でμT-Kernel 2.0の一部の機能を整理した、μT-Kernelの最新版のOS仕様である。また、μT-Kernel 3.0では、IEEE 2050-2018で追加されたAPIなどをフィードバックする形でIEEE 2050-2018との整合性を高めている。その結果、IEEE 2050-2018に対してμT-Kernel 3.0は完全な上位互換のOSとなっている。

μT-Kernel 3.0仕様書

14 / 487

1.2 μT-Kernel 3.0の設計方針
μT-Kernel 3.0は、IoTエッジノードの制御用に設計された、省資源の組込み制御用リアルタイムOSの標準仕様である。OS
の機能やAPIの仕様の標準化によってソフトウェアの流通性や開発効率を高めつつ、16ビットを含むローエンドのシングルチップマイコン(MCU)やMMU(Memory Management Unit)を持たないマイコン、ROM/RAMの少ない小規模な組込みシ
ステムでも高い性能を発揮できるように設計されている。また、デバイスドライバ管理機能、省電力機能などを備えており、IoTのネットワーク構築に必要となる多様な通信方法、多様なデバイスを組み込んだ省電力対応のシステムを構築できる。
μT-Kernel 3.0はリアルタイムOSの標準仕様であり、CPUのアーキテクチャに左右されることなく、いろいろなCPUに実装することが可能である。しかし、ごく小規模なIoTエッジノードなどを想定したハードウェアリソースの厳しいシステムでは、CPUや
ハードウェア構成に合わせて最大限の性能が発揮できるように、OSの実装を適応化した方がよい場合や、OSの提供する機能をある程度制限した方がよい場合もある。そこでμT-Kernel 3.0では、OSの実装を適応化する余地を残しながらも、ソフト
ウェアの互換性や移植性を維持するために、「サービスプロファイル」という仕様記述方法を導入している。「サービスプロファ
イル」の利用により、実装に依存した機能の有無や差異を形式的に記述することができ、OS上で動作するミドルウェアやアプ
リケーションにおいて、実装依存機能の差異を吸収することが可能となる。
μT-Kernel 3.0の仕様には、データタイプなどの共通規定、プログラムの並行実行の単位である「タスク」の状態遷移やスケ
ジューリング方法、割込みハンドラなどの「非タスク部」の動作、OSの提供するAPIなどの仕様が含まれる。ファイル管理やネットワーク通信、プロセス管理などの機能はμT-Kernel 3.0には含まれていないが、ミドルウェアの追加により、これらの機能を備えた比較的大規模なシステムまでスケーラブルに対応できる。すなわち、μT-Kernel 3.0は、ファイル管理やネットワーク
通信、プロセス管理などの機能を持った大規模なシステムのマイクロカーネルとして使用することができる。また、マルチコア・
プロセッサに対応したシステムへの拡張も可能である。

μT-Kernel 3.0仕様書

15 / 487

1.3 μT-Kernel 3.0の構成
μT-Kernel 3.0は、タスクのスケジューリングや同期・通信などリアルタイムOS本来の機能を提供する「μT-Kernel/
OS(Operating System)」、システム管理向けの拡張機能を提供する「μT-Kernel/SM(System Manager)」、およびソフト
ウェアによるデバッガのための機能を提供する「μT-Kernel/DS(Debugger Support)」により構成される。μT-Kernel 3.0の位置づけと構成を図 1.1. 「μT-Kernel 3.0 の位置づけと構成」に示す。

図 1.1: μT-Kernel 3.0 の位置づけと構成
μT-Kernel/OSは、以下のような機能を提供する。
• タスク管理機能• タスク付属同期機能• タスク例外処理機能• 同期・通信機能• 拡張同期・通信機能• メモリプール管理機能• 時間管理機能• 割込み管理機能• システム状態管理機能• サブシステム管理機能
μT-Kernel/SMは、以下のような機能を提供する。

μT-Kernel 3.0仕様書• システムメモリ管理機能• デバイス管理機能• 割込み管理機能• I/Oポートアクセスサポート機能• 省電力機能• システム構成情報管理機能• メモリキャッシュ制御機能• 物理タイマ機能• ユーティリティ機能
μT-Kernel/DSは、デバッガ専用に以下のような機能を提供する。
• カーネル内部状態取得機能• 実行トレース機能

16 / 487

μT-Kernel 3.0仕様書

17 / 487

1.4 リファレンスコード
小規模組込みシステムでは最適化・適応化が特に重要であることから、μT-Kernel 3.0はT-Kernelとは異なり、ソースコードの単一性を保持しない。その代わり、リファレンスコードと呼ばれる参照用のソースコードを提供する。
リファレンスコードはμT-Kernel 3.0の実装の一つであり、トロンフォーラムにより配布される。T-Kernelと異なっているのは、
このリファレンスコードだけがμT-Kernel 3.0であるということではなく、OS実装者はこれを改造しても良いし、全く独自の実装をしても良い。ただし、リファレンスコードと同じ振舞いをするもののみがμT-Kernel 3.0仕様OSとして認められる。
リファレンスコードは仕様書だけでは規定するのが難しい細かい部分の動作までを規定するもので、このリファレンスコードという概念の導入により、ターゲットに合わせた適応化・最適化を行ないやすくしつつも、異なる実装に対して動作の一貫性を保つことができる。

μT-Kernel 3.0仕様書

18 / 487

1.5 適応化とサービスプロファイル
μT-Kernel 3.0はT-Kernelとの互換性を考慮に入れて仕様が策定されている。つまり、μT-Kernel 3.0とT-Kernelの間でプログラムの移植を行う際に、共通に存在する機能のみを使っていれば再コンパイルだけで移植できるように、また、修正が避けられない場合でもそれが最小限で済むように仕様が策定されている。
ただし、MMUやFPUといったハードウェアの機能に強く依存する機能や、用途に応じて明らかに不要である機能、デバッグサ
ポートにおけるフック機能など効率性に影響を及ぼす可能性のある機能については、μT-Kernel 3.0仕様ではサブセット化を許容する方針とした。サブセット化を許容した上でアプリケーションやミドルウェアの流通性を向上させるためには、それらのソ
フトウェアからμT-Kernel 3.0の実装に関する情報を取得できる必要がある。これを実現するため、μT-Kernel 3.0では「サービスプロファイル」という仕組みを導入し、μT-Kernel 3.0における実装依存性の情報を明確に規定できるようにしている。
すべてのμT-Kernel 3.0の実装はサービスプロファイルを提供し、サブセット化された機能に関する情報を提供しなければならない。

μT-Kernel 3.0仕様書

19 / 487

1.6 実装仕様書
サービスプロファイルの導入により、必ずしもすべてのμT-Kernel 3.0の実装がすべての機能を提供するとは限らない。
このため、利用者がμT-Kernel 3.0の実装依存の情報を確認できるようにし、予測していない挙動に悩むことがないようにす
るため、すべてのμT-Kernel 3.0の実装は実装仕様書を提供しなければならない。また、実装仕様書には最低限以下の情報を記述しなければならない。
μT-Kernel 3.0仕様のバージョン番号
μT-Kernel 3.0のメジャーバージョン番号とマイナーバージョン番号を明記する。
サービスプロファイルに関する情報
すべてのサービスプロファイルの定義値を明記する。

μT-Kernel 3.0仕様書

20 / 487

1.7 既存のリアルタイムOS仕様との関係
本節では、μT-Kernel 3.0の仕様と関係の深い既存のリアルタイムOS仕様との差異のうち、主なものを示す。

1.7.1 μT-Kernel 2.0との関係
1. プロセス管理や仮想記憶を想定した機能の削除
μT-Kernel 3.0は、16ビットから32ビットのCPUを搭載した小規模な組込みシステムやIoTエッジノードを制御するリ
アルタイムOSである。プロセス管理や仮想記憶の機能を持つ情報系汎用OSのカーネルとして利用することは想定していない。このため、μT-Kernel 2.0が持っていたアドレス空間管理機能(アドレス空間設定、アドレス空間チェック、論理
アドレス空間管理)やシステムメモリ割当ての機能は、μT-Kernel 3.0には含まれていない。また、サブシステム管理機能のうち、スタートアップ/クリーンアップ処理やリソースグループに関連する機能は、μT-Kernel 3.0には含まれていない。
2. システム時刻を扱うAPIの追加
μT-Kernel 3.0 で は、 1970 年 1 月 1 日 0 時 0 分 0 秒 (UTC) を シ ス テ ム 時 刻 の 起 点 と す る API と し て、tk_set_utc,
tk_set_utc_u, tk_get_utc, tk_get_utc_u, td_get_utc, td_get_utc_uが追加されている。
3. ランデブ機能の削除
μT-Kernel 3.0では、T-Kernelの拡張同期・通信機能のひとつであったランデブ機能が削除されている。

1.7.2 T-Kernel 2.0との関係
1. プロセス管理や仮想記憶を想定した機能の削除
μT-Kernel 3.0は、16ビットから32ビットのCPUを搭載した小規模な組込みシステムやIoTエッジノードを制御するリ
アルタイムOSである。プロセス管理や仮想記憶の機能を持つ情報系汎用OSのカーネルとして利用することは想定していない。このため、T-Kernelが持っていたアドレス空間管理機能(アドレス空間設定、アドレス空間チェック、論理アドレ
ス空間管理)やシステムメモリ割当ての機能は、μT-Kernel 3.0には含まれていない。また、サブシステム管理機能のうち、スタートアップ/クリーンアップ処理やリソースグループに関連する機能は、μT-Kernel 3.0には含まれていない。
2. サービスプロファイルの導入
小規模な組込みシステムを対象としたμT-Kernelにおいて、最適化・適応化を行いやすい仕様としながらも、ミドルウェ
アやアプリケションの流通性・移植性を維持するための仕組みとして、μT-Kernelの実装依存性を記述するための仕組みを導入している。具体的な説明については、項2.8. 「サービスプロファイル」 を参照のこと。
3. ユーザバッファの指定
スタックやメモリプール等の内部メモリ領域を必要とするAPIにおいて、カーネル内でのメモリの自動割当てを行う代わりに、ユーザが指定したバッファ領域を利用する指定が可能である。一般には TA_USERBUF の指定を行うことでユーザバ
ッファの指定が有効となる。
4. 16ビットCPUを想定した型の変更
μT-Kernelの対象には16ビットCPUも含まれており、INT型やUINT型で表現できる整数範囲が16ビット整数の範囲に限られる場合がある。このため、T-Kernel 2.0の一部のAPI引数や構造体メンバ等に対して、必要な値域を表現するのに十分なビット幅を持った整数型への置き換えを行なっている。
5. 小規模組込みシステムを対象とした適応化
μT-Kernelは小規模な組込みシステムを対象としていることから、それにあわせた仕様の適応化を行なっている。例としては、タスク優先度の上限値についてより小さい値での実装を許容している点などが挙げられる。
6. 割込み管理機能の整理と拡張
μT-Kernel 3.0では、T-Kernel 2.0の割込み管理機能をベースとした上で、それを整理・拡張した割込み管理機能を提供する。具体的には以下の点が異なったものとなっている。

μT-Kernel 3.0仕様書

21 / 487(a) 割込みマスクレベルの設定・取得機能の追加
CPUまたは割込みコントローラの割込みマスクレベルを設定・取得するAPIとして、SetCpuIntLevel, GetCpuIntLevel,
SetCtrlIntLevel, GetCtrlIntLevel を追加する。
(b) 割込みベクタ番号(INTVEC)の廃止
割込みに関する番号体系を単純化し分かりやすくするため、割込みベクタ番号(INTVEC)による指定を廃止した。
T-Kernel 2.0においてINTVECを引数とするAPIについては、すべて tk_def_int で利用される番号と共通の割込み番号を代わりに指定する。
7. システム時刻を扱うAPIの追加
μT-Kernel 3.0 で は、 1970 年 1 月 1 日 0 時 0 分 0 秒 (UTC) を シ ス テ ム 時 刻 の 起 点 と す る API と し て、tk_set_utc,
tk_set_utc_u, tk_get_utc, tk_get_utc_u, td_get_utc, td_get_utc_uが追加されている。
8. ランデブ機能の削除
μT-Kernel 3.0では、T-Kernelの拡張同期・通信機能のひとつであったランデブ機能が削除されている。

1.7.3 IEEE 2050-2018との関係
μT-Kernel 3.0の仕様は、IEEEがIoTエッジノード向けの標準OSとして仕様を定めた「IEEE 2050-2018」の仕様に対して、上位互換である。このため、μT-Kernel 3.0の仕様に準拠したOSであれば、そのままIEEE 2050-2018の仕様にも準拠したOSとなる。
逆に、IEEE 2050-2018の仕様は、μT-Kernel 3.0の仕様のサブセットとなっている。μT-Kernel 3.0の機能のうち、サブシ
ステム管理機能と、μT-Kernel/DSで提供されるデバッガ用の機能(カーネル内部状態取得機能および実行トレース機能)については、IEEE 2050-2018の仕様には含まれない。また、DSオブジェクト名称(dsname)に関連する機能や、1985年1月1日0時0分0秒(GMT)を起点とするシステム時刻を扱うAPI(tk_get_tim, tk_get_tim_u, tk_set_tim, tk_set_tim_u)についても、IEEE 2050-2018の仕様には含まれない。

μT-Kernel 3.0仕様書

第2章

μT-Kernelの概念

22 / 487

μT-Kernel 3.0仕様書

23 / 487

2.1 基本的な用語の意味
リアルタイムとリアルタイムシステム
応答時間や遅延時間に不確実性や非再現性がなく、deterministicであり、特にその最悪値が予測可能であるシステ
ム、ないしは予測しやすいような内部構成になっているシステムをリアルタイムシステムと呼ぶ。
μT-Kernelは、上記のような特性を持ったリアルタイムシステムを構築するためのリアルタイムOSである。
タスクと自タスク
プログラムの並行実行の単位を「タスク」と呼ぶ。すなわち、一つのタスク中のプログラムは逐次的に実行されるのに対して、異なるタスクのプログラムは並行して実行が行われる。ただし、並行して実行が行われるというのは、アプリケーシ
ョンから見た概念的な動作であり、実装上はカーネルの制御のもとで、それぞれのタスクが時分割で実行される。
また、システムコールを呼び出したタスクを「自タスク」と呼ぶ。
ディスパッチとディスパッチャ
プロセッサが実行するタスクを切り替えることを「ディスパッチ」(または「タスクディスパッチ」)と呼ぶ。また、ディスパッチ
を実現するカーネル内の機構を「ディスパッチャ」(または「タスクディスパッチャ」)と呼ぶ。
スケジューリングとスケジューラ
次に実行すべきタスクを決定する処理を「スケジューリング」(または「タスクスケジューリング」)と呼ぶ。また、スケジューリングを実現するカーネル内の機構を「スケジューラ」(または「タスクスケジューラ」)と呼ぶ。スケジューラは、一般的な実装では、システムコール処理の中やディスパッチャの中で実現される。
コンテキスト
一般に、プログラムの実行される環境を「コンテキスト」と呼ぶ。コンテキストが同じというためには、少なくとも、プロセッ
サの動作モードが同一で、用いているスタック空間が同一(スタック領域が一連)でなければならない。ただし、コンテキス
トはアプリケーションから見た概念であり、独立したコンテキストで実行すべき処理であっても、実装上は同一のプロセッ
サ動作モードで同一のスタック空間で実行されることもある。
優先順位
タスクの実行順序、すなわち実行可能状態のタスクに実行権を与えて実行状態とする際の順序関係を「優先順位Precedence」と呼ぶ。タスクXよりもタスクYの優先順位が高い場合、タスクYが先に実行される。また、あるタスクXを実行中に、タスクXよりも優先順位の高いタスクYが実行できる状態になった場合、タスクYに実行権が移ってタスクYが実行状態となるとともに、タスクXは実行状態から実行可能状態となる。
補足事項「優先順位(Precedence)」に似た意味を持つ用語として「優先度(priority)」があり、タスクの実行順序に影響を与える点はいずれも同じである。しかし、「優先度」がAPIのパラメータ等によってアプリケーションから明示的に指定されるタスクの属性であるのに対して、「優先順位」は複数のタスク間でその実行順序を示すために用いる概念である。タスク間の優先順位はタスクの優先度に基づいて定められ、優先度の高いタスクは優先順位も高い。一方、優先度の同じタスク同士であっても、両者の優先順位は同じではない。同じ優先度を持つタスク間では、先に実行できる状態(実行状態または実行可能状態)になったタスクの方が高い優先順位を持つ。ただし、tk_rot_rdq などのAPIの実行により、同じ優先度を持つタスク間の優先順位が変更される場合がある。
APIとシステムコール
アプリケーションやミドルウェアからμT-Kernelの提供する機能を呼び出すための標準インタフェースを総称して、API(Application Programming Interface)と呼ぶ。APIは、カーネルの機能を直接的に呼び出すシステムコールのほか、拡張SVCやマクロ、ライブラリ関数として実現されるものも含まれる。
拡張SVC
OSの起動時あるいは起動後に動的に追加されたシステムコールを「拡張SVC」と呼ぶ。μT-Kernel 3.0の仕様では、サブシステム管理機能 を使って拡張SVCを定義する。また、μT-Kernel/SMのAPIを実装するために、拡張SVCを利用することができる。
拡張SVCの処理を実行するプログラムを「拡張SVCハンドラ」と呼ぶ。

μT-Kernel 3.0仕様書

24 / 487

カーネル
μT-Kernel 3.0のうち、拡張SVC、マクロ、ライブラリ関数として実装される部分を除いた部分を「カーネル」と呼ぶ。
μT-Kernel/SMのAPIは拡張SVC、マクロ、ライブラリ関数として実装することが可能であり、そのような方法で実装された部分は、μT-Kernel 3.0のOS仕様には含まれるが「カーネル」には含まれない。一方、μT-Kernel/OSと
μT-Kernel/DSの全ての機能は「カーネル」に含まれる。
非タスク部実行中のシステム状態を考える場合には、「カーネル」に含まれる機能か否かを意識する必要がある。
実装定義
仕様として標準化していない事項である。実装ごとに仕様を規定しなければならない。実装仕様書に具体的な実装内容について明記しなければならない。アプリケーションプログラムにおいて、実装定義の事項に依存している部分は移植性が確保されない。
実装依存
仕様において、ターゲットシステム、または、システムの動作条件によって振舞いが変わる事項であることを示す。実装ごとに振舞いを規定しなければならない。実装仕様書に具体的な実装内容について明記しなければならない。アプリケー
ションプログラムにおいて、実装依存の事項に依存している部分は基本的に移植する際に変更が必要となる。

μT-Kernel 3.0仕様書

25 / 487

2.2 タスク状態とスケジューリング規則
2.2.1 タスク状態
タスク状態は、大きく次の5つに分類される。この内、広義の待ち状態は、さらに3つの状態に分類される。また、実行状態と実行可能状態を総称して、実行できる状態と呼ぶ。
実行状態 (RUNNING)
現在そのタスクを実行中であるという状態。ただし、タスク独立部を実行している間は、別に規定されている場合を除いて、タスク独立部の実行を開始する前に実行していたタスクが実行状態であるものとする。
実行可能状態 (READY)
そのタスクを実行する準備は整っているが、そのタスクよりも優先順位の高いタスクが実行中であるために、そのタスクを実行できない状態。言い換えると、実行できる状態のタスクの中で最高の優先順位になればいつでも実行できる状
態。
広義の待ち状態
そのタスクを実行できる条件が整わないために、実行ができない状態。言い換えると、何らかの条件が満たされるのを待っている状態。タスクが広義の待ち状態にある間、プログラムカウンタやレジスタなどのプログラムの実行状態を表現す
る情報は保存されている。タスクを広義の待ち状態から実行再開する時には、プログラムカウンタやレジスタなどを広義の待ち状態になる直前の値に戻す。広義の待ち状態は、さらに次の3つの状態に分類される。
待ち状態 (WAITING)
何らかの条件が整うまで自タスクの実行を中断するシステムコールを呼び出したことにより、実行が中断された状
態。
強制待ち状態 (SUSPENDED)
他のタスクによって、強制的に実行を中断させられた状態。
二重待ち状態 (WAITING-SUSPENDED)
待ち状態と強制待ち状態が重なった状態。待ち状態にあるタスクに対して、強制待ち状態への移行が要求されると、二重待ち状態に移行させる。
μT-Kernelでは「待ち状態(WAITING)」と「強制待ち状態(SUSPENDED)」を明確に区別しており、タスクが自ら強制待ち状態(SUSPENDED)になることはできない。
休止状態 (DORMANT)
タスクがまだ起動されていないか、実行を終了した後の状態。タスクが休止状態にある間は、実行状態を表現する情報は保存されていない。タスクを休止状態から起動する時には、タスクの起動番地から実行を開始する。また、別に規定されている場合を除いて、レジスタの内容は保証されない。
未登録状態 (NON-EXISTENT)
タスクがまだ生成されていないか、削除された後の、システムに登録されていない仮想的な状態。
実装によっては、以上のいずれにも分類されない過渡的な状態が存在する場合がある(項2.5. 「システム状態」参照)。
実行可能状態に移行したタスクが、現在実行中のタスクよりも高い優先順位を持つ場合には、実行可能状態への移行と同時にディスパッチが起こり、即座に実行状態へ移行する場合がある。この場合、それまで実行状態であったタスクは、新たに実行状態へ移行したタスクにプリエンプトされたという。また、システムコールの機能説明などで、「実行可能状態に移行させる」と記述されている場合でも、タスクの優先順位によっては、即座に実行状態に移行させる場合もある。
タスクの起動とは、休止状態のタスクを実行可能状態に移行させることをいう。このことから、休止状態と未登録状態以外の状態を総称して、起動された状態と呼ぶことがある。タスクの終了とは、起動された状態のタスクを休止状態に移行させることをいう。
タスクの待ち解除とは、タスクが待ち状態の時は実行可能状態に、二重待ち状態の時は強制待ち状態に移行させることをいう。また、タスクの強制待ちからの再開とは、タスクが強制待ち状態の時は実行可能状態に、二重待ち状態の時は待ち状態に移行させることをいう。
一般的な実装におけるタスクの状態遷移を図 2.1. 「タスク状態遷移図」に示す。実装によっては、この図にない状態遷移を行う場合がある。

μT-Kernel 3.0仕様書

26 / 487

図 2.1: タスク状態遷移図
μT-Kernelの特色として、自タスクの操作をするシステムコールと他タスクの操作をするシステムコールを明確に分離しているということがある(表 2.1. 「自タスク、他タスクの区別と状態遷移図」)。これは、タスクの状態遷移を明確にし、システムコー
ルの理解を容易にするためである。自タスク操作と他タスク操作のシステムコールを分離しているということは、言い換えると、実行状態からの状態遷移とそれ以外の状態からの状態遷移を明確に分離しているという意味にもなる。

μT-Kernel 3.0仕様書

27 / 487

タスクの待ち状態(強制待ち状態を含む)への移行
タスクの終了自タスクに対する操作(実行状態からの遷移)

他タスクに対する操作(実行状態以外からの遷移)

tk_slp_tsk
実行状態 → 待ち状態

tk_sus_tsk
実行可能、待ち状態 → 強制待ち、二重待ち状態
tk_ter_tsk
実行可能、待ち状態 → 休止状態
tk_del_tsk
休止状態 → 未登録状態

tk_ext_tsk
実行状態 → 休止状態
tk_exd_tsk
実行状態 → 未登録状態

タスクの削除表 2.1: 自タスク、他タスクの区別と状態遷移図

補足事項
待ち状態と強制待ち状態は直交関係にあり、強制待ち状態への移行の要求は、タスクの待ち解除条件には影響を与えない。言い換えると、タスクが待ち状態にあるか二重待ち状態にあるかで、タスクの待ち解除条件は変化しない。そのため、資源獲得のための待ち状態(セマフォ資源の獲得待ち状態やメモリブロックの獲得待ち状態など)にあるタスクに強制待ち状態への移行が要求され、二重待ち状態になった場合にも、強制待ち状態への移行が要求されなかった場合と同じ条件で資源の割付け(セマフォ資源やメモリブロックの割付けなど)が行われる。

仕様決定の理由μT-Kernelにおいて待ち状態(自タスクによる待ち)と強制待ち状態(他のタスクによる待ち)を区別しているのは、それらが重なる場合があるためである。それらが重なった状態を二重待ち状態として区別することで、タスクの状態遷移が明確になり、システムコールの理解が容易になる。それに対して、待ち状態のタスクはシステムコールを呼び出せないため、複数の種類の待ち状態(例えば、起床待ち状態とセマフォ資源の獲得待ち状態)が重なることはない。μT-Kernelでは、他のタスクによる待ちには一つの種類(強制待ち状態)しかないため、強制待ち状態が重なった状況を強制待ち要求のネストと扱うことで、タスクの状態遷移を明確にしている。

2.2.2 タスクのスケジューリング規則
μT-Kernelにおいては、タスクに与えられた優先度に基づくプリエンプティブな優先度ベーススケジューリング方式を採用している。同じ優先度を持つタスク間では、FCFS(First Come First Served)方式によりスケジューリングを行う。具体的には、タスクのスケジューリング規則はタスク間の優先順位を用いて、タスク間の優先順位はタスクの優先度によって、それぞれ次のように規定される。実行できるタスクが複数ある場合には、その中で最も優先順位の高いタスクが実行状態となり、他は実行可能状態となる。タスク間の優先順位は、異なる優先度を持つタスク間では、高い優先度を持つタスクの方が高い優先順位を持つ。同じ優先度を持つタスク間では、先に実行できる状態(実行状態または実行可能状態)になったタスクの方が高い
優先順位を持つ。ただし、システムコールの呼出により、同じ優先度を持つタスク間の優先順位が変更される場合がある。
最も高い優先順位を持つタスクが替わった場合には、ただちにディスパッチが起こり、実行状態のタスクが切り替わる。ただし、ディスパッチが起こらない状態(ハンドラ実行中やディスパッチ禁止状態など)になっている場合には、実行状態のタスクの切替えは、ディスパッチが起こる状態となるまで保留される。

μT-Kernel 3.0仕様書

28 / 487

補足事項
μT-Kernelのスケジューリング規則では、優先順位の高いタスクが実行できる状態にある限り、それより優先順位の低い
タスクは全く実行されない。すなわち、最も高い優先順位を持つタスクが待ち状態に入るなどの理由で実行できない状
態とならない限り、他のタスクは全く実行されない。この点で、複数のタスクを公平に実行しようというTSS(Time Sharing
System)のスケジューリング方式とは根本的に異なっている。
ただし、同じ優先度を持つタスク間の優先順位は、システムコールを用いて変更することが可能である。アプリケーションがそのようなシステムコールを用いて、TSSにおける代表的なスケジューリング方式であるラウンドロビン方式を実現することができる。
同じ優先度を持つタスク間では、先に実行できる状態(実行状態または実行可能状態)になったタスクの方が高い優先順位を持つことを、図の例を用いて説明する。図 2.2. 「最初の状態の優先順位」は、優先度1のタスクA、優先度3のタスクE、優先度2のタスクB、タスクC、タスクDがこの順序で起動された後のタスク間の優先順位を示す。この状態では、最も優先順位の高いタスクAが実行状態となっている。
ここでタスクAが終了すると、次に優先順位の高いタスクBを実行状態に遷移させる(図 2.3. 「タスクBが実行状態になった後の優先順位」)。その後タスク Aが再び起動されると、タスクBはプリエンプトされて実行可能状態に戻るが、この時タスク
Bは、タスクCとタスクDのいずれよりも先に実行できる状態になっていたことから、同じ優先度を持つタスクの中で最高の優先順位を持つことになる。すなわち、タスク間の優先順位は図 2.2. 「最初の状態の優先順位」の状態に戻る。
次に、図 2.3. 「タスクBが実行状態になった後の優先順位」の状態でタスクBが待ち状態になった場合を考える。タスクの優先順位は実行できるタスクの間で定義されるため、タスク間の優先順位は図 2.4. 「タスクBが待ち状態になった後の優先順位」の状態となる。その後タスクBが待ち解除されると、タスクBはタスクCとタスクDのいずれよりも後に実行できる状態になったことから、同じ優先度を持つタスクの中で最低の優先順位となる(図 2.5. 「タスクBが待ち解除された後の優先順位」)。
以上を整理すると、実行可能状態のタスクが実行状態になった後に実行可能状態に戻った直後には、同じ優先度を持つタスクの中で最高の優先順位を持っているのに対して、実行状態のタスクが待ち状態になった後に待ち解除されて実行できる状態になった直後には、同じ優先度を持つタスクの中で最低の優先順位となる。
なお、タスクが強制待ち状態(SUSPENDED)から実行できる状態になった直後にも、同じ優先度を持つタスクの中で最低の優先順位となる。

図 2.2: 最初の状態の優先順位

図 2.3: タスクBが実行状態になった後の優先順位

μT-Kernel 3.0仕様書

29 / 487

図 2.4: タスクBが待ち状態になった後の優先順位

図 2.5: タスクBが待ち解除された後の優先順位

μT-Kernel 3.0仕様書

30 / 487

2.3 割込み処理
μT-Kernelでの割込みは、デバイスからの外部割込みと、CPU例外による割込みの両方を含む。一つの割込み番号に対して一つの割込みハンドラを定義できる。割込みハンドラの記述方法としては、基本的にカーネルが介入せずに直接起動する方
法と、高級言語対応ルーチンを経由して起動する方法の2通りがある。
詳細は項4.8. 「割込み管理機能」を参照のこと。

μT-Kernel 3.0仕様書

31 / 487

2.4 タスク例外処理
μT-Kernelでは、例外処理のための機能として、タスク例外処理の機能を規定する。なおCPU例外については、割込みとして扱うこととする。
タスク例外処理機能は、タスクを指定してタスク例外処理を要求するシステムコールを呼び出すことで、指定したタスクに実行中の処理を中断させ、タスク例外ハンドラを実行させるための機能である。タスク例外ハンドラの実行は、タスクと同じコンテキ
ストで行われる。タスク例外ハンドラからリターンすると、中断された処理の実行が継続される。
タスク毎に一つのタスク例外ハンドラを、アプリケーションで登録することができる。
詳細は項4.3. 「タスク例外処理機能」を参照のこと。

μT-Kernel 3.0仕様書

32 / 487

2.5 システム状態
2.5.1 非タスク部実行中のシステム状態
μT-Kernelの上で動くタスクのプログラミングを行う場合には、タスク状態遷移図を見て、各タスクの状態の変化を追っていけばよい。しかし、割込みハンドラや拡張SVCハンドラなど、タスクよりカーネルに近いレベルのプログラミングもユーザが行う。
この場合は、非タスク部、すなわちタスク以外の部分を実行している間のシステム状態についても考慮しておかないと、正しく動作するシステムを開発できない。ここでは、μT-Kernelのシステム状態について説明を行う。
システム状態は、図 2.6. 「システム状態の分類」のように分類される。
図 2.6. 「システム状態の分類」で示されている状態のうち、「過渡的な状態」は、カーネル実行中(システムコール実行中)の状態に相当する。ユーザから見ると、ユーザのアプリケーションプログラムから発行したそれぞれのシステムコールが不可分に実行されるということが重要なのであり、システムコール実行中の内部状態はユーザからは見えない。カーネル実行中の状態
を「過渡的な状態」と考え、その内部をブラックボックス的に扱うのは、こういった理由による。
しかし、次の場合には、過渡的な状態の途中の段階がユーザからも見えることがある。
• メモリの獲得・解放を伴うシステムコールで、メモリの獲得・解放を行っている間。(μT-Kernel/SMのシステムメモリ管理機
能を呼び出している間)
このような、過渡的な状態にあるタスクに対して、タスクの強制終了(tk_ter_tsk)を行った場合の動作は保証されない。また、タスクの強制待ち(tk_sus_tsk)も過渡的な状態のまま停止することになり、それによりデッドロック等を引き起こす可能性がある。
したがって、tk_ter_tsk, tk_sus_tsk は原則として使用できない。これらを使用するのは、デバッガなどOSの一部といえるような機能に限るべきである。
「非タスク部」ではあるが、特定のタスク(「要求タスク」と呼ぶ)から依頼された処理を実行していると見なされる部分を「準タスク部」と呼ぶ。たとえば、拡張SVCハンドラは「準タスク部」として実行される。「準タスク部」の中では自タスクを特定でき、要求タスクが自タスクとなる。また、タスク部と同じようにタスクの状態遷移を定義することができ、準タスク部から待ち状態に入る
システムコールも発行可能である。これらの点において、準タスク部は、要求タスクから呼び出されたサブルーチンと同じような振る舞いをする。ただし、「準タスク部」はOS拡張部の位置付けであり、プロセッサの動作モードやスタック空間はタスク部と異なる。すなわち、タスク部から準タスク部に入る際には、プロセッサの動作モードやスタック空間の切り替えが起こる。この点は、タスク部の中で関数やサブルーチンを呼び出す場合とは異なっている。
一方、「非タスク部」のうち、タスク部や準タスク部の処理の進行とは全く別の要因で動作を始めるのが「タスク独立部」である。具体的には、外部割込みによって起動される割込みハンドラや、指定時間の経過によって起動されるタイムイベントハンド
ラ(周期ハンドラおよびアラームハンドラ)などが「タスク独立部」として実行される。外部割込みも、指定時間の経過も、その時点でたまたま実行中だったタスクとは無関係の要因である点に注意されたい。
結局、「非タスク部」は、「過渡的な状態」「準タスク部」「タスク独立部」の3つに分類できる。これ以外の状態が、タスクのプログラムを実行している状態、すなわち「タスク部実行中」の状態である。

図 2.6: システム状態の分類

μT-Kernel 3.0仕様書

33 / 487

2.5.2 タスク独立部と準タスク部
タスク独立部(割込みハンドラやタイムイベントハンドラ)の特徴は、タスク独立部に入る直前に実行中だったタスクを特定することが無意味であり、「自タスク」の概念が存在しないことである。したがって、タスク独立部からは、待ち状態に入るシステムコ
ールや、暗黙で自タスクを指定するシステムコールを発行することはできない。また、タスク独立部では現在実行中のタスクが特定できないので、タスクの切り換え(ディスパッチ)は起らない。ディスパッチが必要になっても、それはタスク独立部を抜けるまで遅らされる。これを遅延ディスパッチ(delayed dispatching)の原則と呼ぶ。
もし、タスク独立部である割込みハンドラの中でディスパッチを行うと、割込みハンドラの残りの部分の実行が、そこで起動されるタスクよりも後回しになるため、割込みがネストしたような場合に問題が起こる。この様子を図 2.7. 「割込みのネストと遅延
ディスパッチ」に示す。
図 2.7. 「割込みのネストと遅延ディスパッチ」は、タスクAの実行中に割込みXが発生し、その割込みハンドラ中でさらに高優
先度の割込みYが発生した状態を示している。この場合、(1)1 の割込みYからのリターン時に即座にディスパッチを起こしてタ
スクBを起動すると、割込みXの(2)〜(3)の部分の実行がタスクBよりも後回しになり、タスクAが実行状態になった時にはじめて(2)〜(3)が実行されることになる。これでは、低優先度の割込みXのハンドラが、高優先度の割込みばかりではなく、それによって起動されたタスクBにもプリエンプトされる危険を持つことになる。したがって、割込みハンドラがタスクに優先して実行されるという保証がなくなり、割込みハンドラが書けなくなってしまう。遅延ディスパッチの原則を設けているのは、こういった理由による。
それに対して、準タスク部の特徴は、準タスク部に入る直前に実行中だったタスク(要求タスク)を特定することが可能であること、タスク部と同じようにタスクの状態が定義されており、準タスク部の中で待ち状態に入ることも可能なことである。したがって、準タスク部の中では、通常のタスク実行中の状態と同じようにディスパッチングが起きる。その結果、OS拡張部などの準タ
スク部は、非タスク部であるにもかかわらず、常にタスク部に優先して実行されるとは限らない。これは、割込みハンドラがすべてのタスクに優先して実行されるのとは対照的である。
次の二つの例は、タスク独立部と準タスク部の違いを示すものである。
• タスクA(優先度8＝低)の実行中に割込みがかかり、その割込みハンドラ(タスク独立部である)の中でタスクB(優先度2＝高)に対する tk_wup_tsk が実行された。しかし、遅延ディスパッチの原則により、ここではまだディスパッチが起きず、tk_wup_tsk 実行後はまず割込みハンドラの残りの部分が実行される。割込みハンドラの後の tk_ret_int によって、はじめてディスパッチングが起り、タスクBが実行される。
• タスクA(優先度8＝低)の中で拡張SVCが実行され、その拡張SVCハンドラ(準タスク部とする)の中のタスクB(優先度2＝高)に対する tk_wup_tsk が実行された。この場合は遅延ディスパッチの原則が適用されないので、tk_wup_tsk の中でディスパッチングが行われ、タスクAが準タスク部内での実行可能状態に、タスクBが実行状態になる。したがって、拡張SVC
ハンドラの残りの部分よりもタスクBの方が先に実行される。拡張SVCハンドラの残りの部分は、再びディスパッチングが起ってタスクAが実行状態となった後で実行される。
1 (1) でディスパッチを行うと、割込みXのハンドラの残りの部分((2)〜(3))の実行が後回しになってしまう。

μT-Kernel 3.0仕様書

34 / 487

図 2.7: 割込みのネストと遅延ディスパッチ

μT-Kernel 3.0仕様書

35 / 487

2.6 オブジェクト
カーネルが操作対象とする資源をオブジェクトと総称する。オブジェクトには、タスクのほかに、メモリプールや、セマフォ、イベ
ントフラグ、メールボックスなどの同期・通信機構、およびタイムイベントハンドラ(周期ハンドラおよびアラームハンドラ)が含まれている。
オブジェクト生成時には、原則として属性を指定することができる。属性はオブジェクトの細かな動作の違いやオブジェクトの初期状態を定める。属性にTA_XXXXXが指定されている場合、そのオブジェクトを「TA_XXXXX属性のオブジェクト」と呼ぶ。特に指定すべき属性がない場合には、TA_NULL(＝0)を指定する。オブジェクト登録後に属性を読み出すインタフェース
は、一般には用意されない。
オブジェクトの属性は、下位側がシステム属性を表し、上位側が実装独自属性を表す。どのビット位置を境に上位側／下位側と区別するかは特に定めない。基本的には、標準仕様で定義されていないビットは実装独自属性として使用できる。ただし、原則としてシステム属性はLSB(最下位ビット)から MSB(最上位ビット)に向かって順に割り当てる。実装独自属性ではMSB
からLSBに向かって割り当てるものとする。属性の未定義のビットは0クリアされていなければならない。
オブジェクトは拡張情報を持つ場合がある。拡張情報はオブジェクト登録時に指定し、オブジェクトが実行を始める時にパラメータとして渡される情報で、カーネルの動作には影響を与えない。拡張情報はオブジェクトの状態参照システムコールで読み出すことができる。
オブジェクトはID番号により識別される。μT-Kernelでは、ID番号はオブジェクトの生成時に自動的に割り当てられる。利用者がID番号を指定することはできない。このため、デバッグの際にオブジェクトを識別することが困難となる。そこで、各オブジェクトの生成の際に、デバッグ用のオブジェクト名称を指定することができる。この名称はあくまでデバッグ用であり、μT-Kernel/DSの機能からのみ参照できる。また、名称に関するチェックは、μT-Kernelでは一切行われない。

μT-Kernel 3.0仕様書

36 / 487

2.7 保護レベル
μT-Kernelでは、実行時の保護レベルとして0〜3の4段階(特権モード／ユーザモードなどに相当)、アクセス対象となるメモリの保護レベルとしても0〜3の4段階がそれぞれ定義されており、現在実行中の保護レベルと同じか、それより低い保護レベ
ルのメモリにのみアクセスができる。この機能は、ユーザプログラムの不正なアクセスから、OSなどのシステムを保護するために役立つ。
各保護レベルは次のような用途に使用する。
保護レベル
0
1
2
3

用途
カーネル、サブシステム、デバイスドライバなど
システムアプリケーションタスク
(予約)
ユーザアプリケーションタスク

ただし、CPUによっては、特権モード(スーパバイザモード)とユーザモードの2段階の保護レベルしかない場合もある。
そのような場合は、特権モードを保護レベル0、ユーザモードを保護レベル3として扱う。この場合には、保護レベルとして1〜2を指定しても、保護レベル0を指定したものと解釈され、保護レベル0を指定した時と同等の動作をする。たとえば、tk_cre_tskのtskatrでTA_RNG2を指定した場合でも、TA_RNG0を指定した場合と同じく、生成されたタスクは特権
モード(保 護レ ベル 0)で 動 作す る。ま た、tk_cre_mplのmplatrでTA_RNG2を指 定し た場 合で も、TA_RNG0を指 定し た場 合と同じく、生成されたメモリプールのアクセスを制限する保護レベルが0となる。なお、この場合はサービスプロファイ
ルTK_MEM_RNG0、TK_MEM_RNG1、TK_MEM_RNG2の定義値を0とする。

特権モードとユーザモードの区別もないCPUの場合は、保護レベル0のみを使用する。この場合には、保護レベルとして1〜3を指定しても、保護レベル0を指定したものと解釈される。また、サービスプロファイルTK_MEM_RNG0、TK_MEM_RNG1、TK_MEM_RNG2、TK_MEM
定義値を0とする。
実行時の保護レベルが、アクセス対象となったメモリの保護レベルよりも低い場合には、メモリアクセス権の違反が検出され、CPU例外を発生する。
実行時の保護レベルの遷移は、システムコールまたは拡張SVCの呼出、および割込み・CPU例外により行われる。
非タスク部(タスク独立部、準タスク部など)は保護レベル0で実行する。保護レベル1〜3で実行できるのはタスク部のみである。保護レベル0でもタスク部は実行可能である。

μT-Kernel 3.0仕様書

37 / 487

2.8 サービスプロファイル
μT-Kernel 3.0は小規模組込みシステムを想定したOS仕様であり、実装を単一化せず、各プラットフォームに応じた最適化・適応化を行った実装を認めている。特に、FPU(Floating-Point Unit)などハードウェアに強く依存する機能や、デバッグサポ
ートにおけるフック機能などの効率性に影響を及ぼす可能性のある機能に対し、仕様のサブセット化を許容しており、これによって効率の良いμT-Kernel 3.0仕様OSを実現することが可能になる。このようなサブセット化を許容した上で、なおかつミド
ルウェアやアプリケーションの流通性・移植性を維持するため、μT-Kernel 3.0では他のμT-Kernel 3.0の実装との間の差異を記述するための仕組みを導入する。この記述を、サービスプロファイルと呼ぶ。
μT-Kernel 3.0におけるサービスプロファイルは、μT-Kernel 3.0の実装に関する情報をC言語の定数マクロ定義として列挙したものとして実現される。たとえば、TA_USERBUFの指定が可能な実装では、対応するサービスプロファイル項目を以下のように定義し、TA_USERBUFが利用可能であることを示さなければならない。
# define

TK_SUPPORT_USERBUF

TRUE/* ユーザバッファ指定( TA_USERBUF )のサポート */アプリケーションやミドルウェアではこのサービスプロファイル情報を利用して、TA_USERBUFに対するサポートの有無に応じた
コード記述を行うことができる。たとえば、以下のような利用方法が考えられる。
T_CTSK

ctsk = {. exinf= NULL ,# if TK_SUPPORT_USERBUF. tskatr = TA_HLNG | TA_RNG0 | TA_USERBUF ,. bufptr = taskA_stack ,# else. tskatr = TA_HLNG | TA_RNG0 ,# endif. task= task ,. itskpri = 10 ,. stksz= 2048};tskid = tk_cre_tsk (& ctsk );上記のコード例では、TA_USERBUFが利用可能か否かに応じて、tk_cre_tsk に引き渡すパケットパラメータctskの内容を設定している。これによって、TA_USERBUFをサポートする実装・そうでない実装の両者から利用可能なアプリケーションやミドルウェアを実現できる。このサービスプロファイルの仕組みを用いて、ミドルウェア開発者はサービスプロファイルを適切に利用し、ソフトウェアの流通性を向上させることが求められる。
μT-Kernel 3.0で規定される具体的なサービスプロファイルの項目については、項3.4. 「サービスプロファイル」 を参照する
こと。

μT-Kernel 3.0仕様書

第3章

μT-Kernel共通規定

38 / 487

μT-Kernel 3.0仕様書

39 / 487

3.1 データ型
3.1.1 汎用的なデータ型
typedeftypedeftypedeftypedeftypedeftypedeftypedeftypedef

signed charsigned short
signed long
signed long longunsigned char
unsigned shortunsigned longunsigned long long

B;
H;
W;
D;
UB ;
UH ;
UW ;
UD ;

/* 符号付き 8ビット整数 *//* 符号付き 16ビット整数 *//* 符号付き 32ビット整数 *//* 符号付き 64ビット整数 *//* 符号無し 8ビット整数 *//* 符号無し 16ビット整数 *//* 符号無し 32ビット整数 *//* 符号無し 64ビット整数 */typedeftypedeftypedeftypedef

char
short
long
long long

VB ;
VH ;
VW ;
VD ;

/* 型が一定しない 8ビットのデータ *//* 型が一定しない 16ビットのデータ *//* 型が一定しない 32ビットのデータ *//* 型が一定しない 64ビットのデータ */typedeftypedeftypedeftypedeftypedeftypedeftypedeftypedefvolatile
volatile
volatile
volatile
volatile
volatile
volatile
volatile

B
H
W
D
UB
UH
UW
UD

_B ;
_H ;
_W ;
_D ;
_UB ;
_UH ;
_UW ;
_UD ;

/* volatile 宣言付 */typedef signed int
typedef unsigned int

INT ;UINT ;/* プロセッサのビット幅の符号付き整数 *//* プロセッサのビット幅の符号無し整数 */typedef INT

SZ ;/* サイズ一般 */typedef INT
typedef W

ID ;MSEC ;/* ID一般 *//* 時間一般(ミリ秒) */typedef void
typedef INT(* FP ) () ;/* 関数アドレス一般 */(* FUNCP ) () ; /* 関数アドレス一般 */# define LOCAL# define EXPORT# define IMPORT

staticextern/* ローカルシンボル定義 *//* グローバルシンボル定義 *//* グローバルシンボル参照 *//** ブール値*
TRUE = 1 と定義するが、0 以外はすべて真( TRUE )である。
*
したがって、if ( bool == TRUE ) の様な判定をしてはいけない。
*
if ( bool ) の様に判定すること。
*/
typedef UINTBOOL ;# define TRUE
1/* 真 */# define FALSE
0/* 偽 */

μT-Kernel 3.0仕様書

40 / 487

注意• VB, VH, VW, VDと B, H, W, Dとの違いは、前者はビット数のみが分かっており、データ型の中身が分からないものを表すのに対して、後者は整数を表すことがはっきりしているという点である。
• SZは、実装依存のビット幅を持った整数型のデータタイプであり、CPUのビット幅やメモリ空間のサイズなどに応じて実装ごとに適切に定義される。
• BOOLは、TRUE を1と定義するが、0以外はすべて真である。したがって、TRUE を比較演算子(== および !=)の左辺または右辺の値として用いて真偽の判定を行ってはいけない。すなわち、if (ブール値 == TRUE) の様な比較演算を行うべきではなく、ブール値を直接条件として用いて、たとえば if (ブール値) の様に判定を行うべきである。

関連するサービスプロファイル
64ビットの型 D, UD, VD は、以下のサービスプロファイルが有効に設定されている場合に限り利用可能であることが保証される。
TK_HAS_DOUBLEWORD

64ビットデータ型(D, UD, VD)のサポート

補足事項
stksz, wupcnt, メッセージサイズなど、明らかに負の数にならないパラメータも、原則として符号付き整数(INTやW)のデー
タ型となっている。これは、整数はできるだけ符号付きの数として扱うというTRON全般のルールに基づいたものである。また、タイムアウト(TMO tmout)のパラメータでは、これが符号付きの整数であることを利用し、TMO_FEVR(＝ -1) を特殊な意
味に使っている。符号無しのデータ型を持つパラメータは、ビットパターンとして扱われるもの(オブジェクト属性やイベントフ
ラグなど)である。

3.1.2 意味が定義されているデータ型
パラメータの意味を明確にするため、出現頻度の高いデータ型や特殊な意味を持つデータ型に対して、以下のような名称を使用する。
typedeftypedeftypedeftypedeftypedeftypedeftypedeftypedef

INT
UW
INT
INT
W
D
UW
UD

FN ;
ATR ;
ER ;
PRI ;
TMO ;
TMO_U ;RELTIM ;RELTIM_U ;typedef struct systim {
W
hi ;
UW
lo ;
} SYSTIM ;/* 機能コード *//* オブジェクト/ハンドラ属性 *//* エラーコード *//* 優先度 *//* ミリ秒単位のタイムアウト指定 *//* 64ビットでマイクロ秒単位のタイムアウト指定 *//* ミリ秒単位の相対時間 *//* 64ビットでマイクロ秒単位の相対時間 *//* ミリ秒単位のシステム時刻 *//* 上位32ビット *//* 下位32ビット */typedef D

SYSTIM_U ;/* 64ビットでマイクロ秒単位のシステム時刻 *//** 共通定数*/# define NULL
# define TA_NULL# define TMO_POL# define TMO_FEVR

0
0
0
( -1)

/* 無効ポインタ *//* 特別な属性を指定しない *//* ポーリング *//* 永久待ち */μT-Kernel 3.0仕様書

41 / 487

注意• 複数のデータ型を複合したデータ型の場合は、その内の最も主となるデータ型で代表する。例えば、tk_cre_tsk の戻値
はタスクIDかエラーコードであるが、主となるのはタスクIDなので、データ型はIDとなる。

関連するサービスプロファイル
マイクロ秒単位の時間および時刻に関連する型 TMO_U, RELTIM_U, SYSTIM_U は、以下のサービスプロファイルが有効に設定されている場合に限り利用可能であることが保証される。
TK_SUPPORT_USEC

マイクロ秒のサポート

補足事項
マイクロ秒(μsec)を意味するパラメータやデータタイプには最後に”_u”(uはμの意味) または”_U”を付け、それ以外の64ビット整数を意味するパラメータやデータタイプには最後に”_d”(dは double integer の意味)または”_D”を付ける方針としている。TMO_U, RELTIM_U, SYSTIM_Uはこの方針によるデータタイプ名である。

μT-Kernel 3.0仕様書

42 / 487

3.2 システムコール
3.2.1 システムコールの形式
μT-Kernelでは、C言語を標準的な高級言語として使用することにしており、C言語からシステムコールを実行する場合のインタフェース方法を標準化している。
一方、アセンブリ言語のインタフェース方法は実装定義とする。アセンブリ言語でプログラムを作成する場合でも、C言語のイ
ンタフェースを利用して呼び出す方法を推奨する。これにより、アセンブリ言語で作成したプログラムも同一CPUであればOSが変わっても移植性が確保できる。
システムコールインタフェースでは、次のような共通原則を設けている。
• システムコールはすべてC言語の関数として定義される。
• 関数としての戻値は、0または正の値が正常終了、負の値がエラーコードとなる。
システムコールインタフェースの実装方法は実装依存とする。例えば、C言語のマクロやインライン関数、インラインアセンブリなどを用いて実装することが考えられる。
システムコールのC言語インタフェースのうち、パケットやポインタを使ってパラメータを渡すものについては、μT-Kernelがポ
インタ参照先のパラメータを書き換えないことを明示するために、CONSTという修飾子を付けている。
CONSTは、C言語の const 修飾子を意図したものであるが、const 修飾子に未対応のプログラムが混在した場合に、#defineのマクロ機能を使ってコンパイラのチェックを無効化できるように、const と類似した別名を使っている。
具体的なCONSTの使い方は以下のようになる。なお、詳細は開発環境に依存する。
1. 共通のインクルードファイルに次の記述を含める。
/* TKERNEL_CHECK_CONST の定義がある場合に const のチェックを有効化 */# ifdef TKERNEL_CHECK_CONST# define CONST const# else# define CONST# endif

2. プログラム中の関数定義やシステムコールの定義は、CONSTを用いて記述する。
CONSTの記述例
tk_cre_tsk ( CONST T_CTSK * pk_ctsk );foo_bar ( CONST void * buf );μT-Kernel 3.0以降では、プログラム中にCONSTを明示し、const のチェックをコンフィギュレーションで有効にして運用することを強く推奨する。

3.2.2 タスク独立部から発行できるAPI
μT-Kernel/OSの次のシステムコールは、タスク独立部およびディスパッチ禁止状態から発行できる。
システムコール名称
tk_sta_tsk
tk_ref_tsk
tk_wup_tsk
tk_rel_wai
tk_sus_tsk

説明
タスク起動
タスク状態参照
他タスクの起床
他タスクの待ち状態解除
他タスクを強制待ち状態へ移行

μT-Kernel 3.0仕様書

システムコール名称
tk_sig_tev
tk_sig_sem
tk_set_flg
tk_sta_cyc
tk_stp_cyc
tk_ref_cyc
tk_ref_cyc_u
tk_sta_alm
tk_sta_alm_u
tk_stp_alm
tk_ref_alm
tk_ref_alm_u
tk_ret_int
tk_rot_rdq
tk_get_tid
tk_ref_sys

43 / 487

説明
タスクイベントの送信
セマフォ資源返却
イベントフラグのセット
周期ハンドラの動作開始
周期ハンドラの動作停止
周期ハンドラ状態参照
周期ハンドラ状態参照(マイクロ秒単位)
アラームハンドラの動作開始
アラームハンドラの動作開始(マイクロ秒単位)
アラームハンドラの動作停止
アラームハンドラ状態参照
アラームハンドラ状態参照(マイクロ秒単位)
割込みハンドラから復帰(アセンブリ言語で記述された割込みハンドラからのみ発行可能)
タスクの優先順位の回転
実行状態タスクのタスクID参照
システム状態参照

μT-Kernel/SMの次のAPIは、タスク独立部およびディスパッチ禁止状態から発行できる。
API名称
DI
EI
isDI
SetCpuIntLevel
GetCpuIntLevel
EnableInt
DisableInt
ClearInt
EndOfInt
CheckInt
SetIntMode
SetCtrlIntLevel
GetCtrlIntLevel
out_b
out_h
out_w
out_d
in_b
in_h
in_w
in_d
WaitUsec
WaitNsec
SetOBJNAME

説明
外部割込み禁止
外部割込み許可
外部割込み禁止状態の取得
CPU内割込みマスクレベルの設定
CPU内割込みマスクレベルの取得
割込み許可
割込み禁止
割込み発生のクリア
割込みコントローラにEOI発行
割込み発生の検査
割込みモード設定
割込みコントローラ内割込みマスクレベルの設定
割込みコントローラ内割込みマスクレベルの取得
I/Oポート書込み(バイト)I/Oポート書込み(ハーフワード)
I/Oポート書込み(ワード)I/Oポート書込み(ダブルワード)
I/Oポート読込み(バイト)I/Oポート読込み(ハーフワード)
I/Oポート読込み(ワード)I/Oポート読込み(ダブルワード)
微小待ち(マイクロ秒)
微小待ち(ナノ秒)
オブジェクト名設定

μT-Kernel/DSのすべてのシステムコールは、タスク独立部およびディスパッチ禁止状態から発行できる。
上記以外のシステムコールやAPIがタスク独立部およびディスパッチ禁止状態から発行できるか否かは実装依存である。

3.2.3 システムコールの呼出制限
システムコールを呼び出すことのできる保護レベルを制限することができる。この場合、指定した保護レベルより低い保護レベルで動作しているタスク(タスク部)からシステムコールを発行した場合に、E_OACV エラーとする。

μT-Kernel 3.0仕様書

44 / 487

拡張SVCの呼出は制限されない。
例えば、保護レベル1より低い保護レベルからのシステムコールの呼出を禁止した場合、保護レベル2,3で実行しているタスク
からはシステムコールは発行できなくなる。つまり、保護レベル2,3で動作しているタスクは、拡張SVCしか発行できないということになり、サブシステムの機能のみを使ってプログラムすることになる。
この機能は、μT-Kernelをプロセス管理機能などを含むミドルウェアと組み合わせて使用する場合に、ミドルウェアの仕様に基づくタスク(ユーザプロセスなど)からμT-Kernelの機能を直接操作させないために使用する。すなわち、μT-Kernelをマイ
クロカーネルとして使用するための機能である。この場合、ユーザプロセスのAPIではマイクロカーネルを直接操作することができず、ミドルウェアのみが操作可能となる。
システムコール呼出制限をする保護レベルは、システム構成情報管理機能により設定する。システム構成情報管理機能については、項5.6. 「システム構成情報管理機能」を参照のこと。

3.2.4 パラメータパケット形式の変更
システムコールへ渡すパラメータのいくつかは、パケット形式になっている。このパケット形式のパラメータには、システムコールへ情報を渡す入力パラメータとなるもの(T_CTSKなど)とシステムコールから情報を返される出力パラメータとなるもの(T_RTSKなど)がある。
これらパケット形式のパラメータには、実装独自の情報を追加することができる。ただし、標準仕様で定義されている情報の後ろに追加しなければならない。パラメータの削除については、サービスプロファイルで無効に指定されたものに限って許容され、それ以外のパラメータを削除することは許容されない。なお、標準仕様で定義されているデータの型および順序を変更してはならない。
システムコールへの入力パラメータとなるパケット(T_CTSKなど)では、実装独自で追加された情報が未初期化(メモリの内容が不定)のまま、システムコールを呼び出した場合でも正常に動作するようにしなければならない。
通常は、追加した情報に有効な値が入っていることを示すフラグを標準仕様に含まれている属性フラグの実装独自領域に定義する。そのフラグがセットされている(1)場合にのみ追加した情報を使用し、セットされていない(0)場合にはその追加情報は未初期化(メモリの内容が不定)であるとして、デフォルト値を適用する。
これは、このOSが実装独自の機能拡張をしているかどうかに関わらず、同じアプリケーションプログラムを、再コンパイルのみで動作させるための規定である。
移植ガイドライン
サービスプロファイルで無効に指定されたパラメータを削除することが認められたため、パラメータパケットの初期化の際には注意が必要である。例えば、T_CTSK構造体に対して以下のような初期化を行うことは移植性の観点から推奨されな
い。
T_CTSK

ctsk = {NULL ,
TA_HLNG | TA_RNG0 | TA_USERBUF ,task ,
10 ,2048 ,
"" ,
buf

};

代わりに、ISO/IEC 9899:1999で規定された構文を用いて、以下のように初期化を行うことが推奨される。
T_CTSK};

ctsk = {. exinf. tskatr. task. itskpri. stksz. bufptr

=
=
=
=
=
=

NULL ,
TA_HLNG | TA_RNG0 | TA_USERBUF ,task ,
10 ,2048 ,buf

μT-Kernel 3.0仕様書

45 / 487

3.2.5 機能コード
機能コードは、システムコールを識別するために、各システムコールに割り付けられる番号である。
システムコールの機能コードは特に定めない。すべて実装定義とする。
拡張SVCの機能コードについては、tk_def_ssy を参照。

3.2.6 エラーコード
システムコールの戻値は原則として符号付きの整数で、エラーが発生した場合には負の値のエラーコード、処理を正常に終了した場合は E_OK(＝0)または正の値とする。正常終了した場合の戻値の意味はシステムコール毎に規定する。この原則の例外として、呼び出されるとリターンすることのないシステムコールがある。リターンすることのないシステムコールは、C言語イ
ンタフェースでは戻値を持たないもの(すなわちvoid型の関数)として宣言する。
エラーコードは、メインエラーコードとサブエラーコードで構成される。エラーコードの下位16ビットがサブエラーコード、残りの上位ビットがメインエラーコードとなる。メインエラーコードは、検出の必要性や発生状況などにより、エラークラスに分類される。
# define MERCD ( er )# define SERCD ( er )# define ERCD ( mer , ser )( ( ER )( er ) >> 16 )/* メインエラーコード */( ( H )( er ) )/* サブエラーコード */( ( ER )( mer ) << 16 | ( ER )( UH )( ser ) )ただし、ER型が16ビットの環境ではサブエラーコードを含めず、メインエラーコードをそのままエラーコードとしても良い。この場合、SERCDマクロを定義してはいけない。
# define MERCD ( er )# define ERCD ( mer , ser )( ( ER )( er ) )( ( ER )( mer ) )/* メインエラーコード */関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、エラーコードにサブエラーコードが含まれ、SERCDマク
ロがサポートされる。
TK_SUPPORT_SERCD

サブエラーコードのサポート

3.2.7 タイムアウト
待ち状態に入る可能性のあるシステムコールには、タイムアウトの機能を持たせる。タイムアウトは、指定された時間が経過しても処理が完了しない場合に、処理をキャンセルしてシステムコールからリターンするものである(この時、システムコールは
E_TMOUT エラーを返す)。
そのため、「システムコールがエラーコードを返した場合には、システムコールを呼び出したことによる副作用はない」という原則より、タイムアウトした場合には、システムコールを呼び出したことで、システムの状態は変化していないのが原則である。ただし、システムコールの機能上、処理のキャンセル時に元の状態に戻せない場合は例外とし、システムコールの説明でその旨を明示する。
タイムアウト時間を0に設定すると、システムコールの中で待ち状態に入るべき状況になっても、待ち状態には入らない。そのため、タイムアウト時間を0としたシステムコール呼出では、待ち状態に入る可能性がない。タイムアウト時間を0としたシステムコール呼出を、ポーリングと呼ぶ。すなわち、ポーリングを行うシステムコールでは、待ち状態に入る可能性がない。
各システムコールの説明では、タイムアウトがない(言い換えると、永久待ちの)場合の振舞いを説明するのを原則とする。シス
テムコールの説明で「待ち状態に入る」ないしは「待ち状態に移行させる」と記述されている場合でも、タイムアウト時間を指定した場合には、指定時間経過後に待ち状態が解除され、メインエラーコードを E_TMOUT としてシステムコールからリターンする。また、ポーリングの場合には、待ち状態に入らずにメインエラーコードを E_TMOUT としてシステムコールからリターンする。

μT-Kernel 3.0仕様書

46 / 487

タイムアウト指定(TMO型およびTMO_U型)は、正の値でタイムアウト時間、TMO_POL(＝0)でポーリング、TMO_FEVR(＝-1)で永久待ちを指定する。タイムアウト時間が指定された場合、タイムアウトの処理は、システムコールが呼び出されてから、指定された以上の時間が経過した後に行うことを保証しなければならない。
補足事項
ポーリングを行うシステムコールでは待ち状態に入らないため、それを呼び出したタスクの優先順位は変化しない。
一般的な実装においては、タイムアウト時間に1が指定されると、システムコールが呼び出されてから2回めのタイマ割込
み(「タイムティック」と呼ぶ場合がある)でタイムアウト処理を行う。タイムアウト時間に0を指定することはできないため(0はTMO_POL に割り付けられている)、このような実装では、システムコールが呼び出された後の最初のタイマ割込みでタイムア
ウトすることはない。

3.2.8 相対時間とシステム時刻
イベントの発生する時刻を、システムコールを呼び出した時刻などからの相対値で指定する場合には、相対時間(RELTIM型
またはRELTIM_U型)を用いる。相対時間を用いてイベントの発生時刻が指定された場合、イベントの処理は、基準となる時刻から指定された以上の時間が経過した後に行うことを保証しなければならない。イベントの発生間隔など、イベントの発生する時刻以外を指定する場合にも、相対時間(RELTIM型またはRELTIM_U型)を用いる。その場合、指定された相対時間の解釈方法は、それぞれの場合毎に定める。時刻を絶対値で指定する場合には、システム時刻(SYSTIM型またはSYSTIM_U型)を用いる。μT-Kernelには現在のシステム時刻を設定する機能が用意されているが、この機能を用いてシステム時刻を変更した場合にも、相対時間を用いて指定されたイベントが発生する実世界の時刻(これを実時刻と呼ぶ)は変化しない。言い換えると、相対時間を用いて指定されたイベントが発生するシステム時刻は変化することになる。
SYSTIM システム時刻
基準時間1ミリ秒、64ビットの符号付整数
typedef struct systim {
W
hi ;
UW
lo ;
} SYSTIM ;/* 上位32ビット *//* 下位32ビット */SYSTIM_U システム時刻
基準時間1マイクロ秒、64ビットの符号付整数
typedef D

SYSTIM_U ;/* 64ビット */RELTIM 相対時間
基準時間1ミリ秒、32ビットの符号なし整数(UW)
typedef UW

RELTIM ;RELTIM_U 相対時間
基準時間1マイクロ秒、64ビットの符号なし整数(UD)typedef UD

RELTIM_U ;/* 64ビットでマイクロ秒単位の相対時間 */TMO タイムアウト時間
基準時間1ミリ秒、32ビットの符号付整数(W)typedef W

TMO ;TMO_FEVR＝(-1)で永久待ちを指定できる。
TMO_U タイムアウト時間
基準時間1マイクロ秒、64ビットの符号付整数(D)typedef D

TMO_U ;/* 64ビットでマイクロ秒単位のタイムアウト */μT-Kernel 3.0仕様書

47 / 487

TMO_FEVR＝(-1)で永久待ちを指定できる。
関連するサービスプロファイル
マイクロ秒単位の時間および時刻に関連する型 TMO_U, RELTIM_U, SYSTIM_U は、以下のサービスプロファイルが有効に設定されている場合に限り利用可能であることが保証される。
TK_SUPPORT_USEC

マイクロ秒のサポート

補足事項
RELTIM, RELTIM_U, TMO, TMO_Uで指定された時間は、指定された時間以上経過した後にタイムアウト等が起こることを保証しなければならない。例えば、タイマ割込み間隔が1ミリ秒で、タイムアウト時間として1ミリ秒が指定された場合、システムコール呼出後の2回目のタイマ割込みでタイムアウトする。(1回目のタイマ割込みでは1ミリ秒未満である。)
システム時刻(SYSTIM_U)がカーネル内部でオーバーフローしてしまうような値を引数に指定した場合のシステムコールの動作は未定義である。

μT-Kernel 3.0仕様書

48 / 487

3.3 高級言語対応ルーチン
タスクやハンドラを高級言語で記述した場合にもカーネルに関する処理と言語環境に関する処理を分離できるように、高級言語対応ルーチンの機能を用意している。高級言語対応ルーチンの利用の有無は、オブジェクト属性やハンドラ属性の一つ(TA_HLNG)として指定される。
TA_HLNG の指定が無い場合は、tk_cre_tsk や tk_def_int などのパラメータで指定されたスタートアドレスから直接タスクやハンドラを起動するが、TA_HLNG の指定がある場合は、最初に高級言語のスタートアップ処理ルーチン(高級言語対応ルーチン)を起動し、その中から tk_cre_tsk や tk_def_int のパラメータで指定されたタスク起動アドレスやハンドラアドレスに間接ジャンプする。この場合、カーネルから見ると、タスク起動アドレスやハンドラアドレスは高級言語対応ルーチンに対するパラメータとなる。こういった方法をとることにより、カーネルに関する処理と言語環境に関する処理が分離され、異なる言語環境にも容易に対応できる。
また、高級言語対応ルーチンを利用すれば、ハンドラをC言語の関数として書いた場合に、単なる関数のリターン(returnや”}”)を行うだけで、ハンドラから戻るシステムコールを自動的に実行することが可能となる。
しかし、CPUの実行モードがあるシステムにおいては、カーネルと同じ保護レベルで動作する割込みハンドラなどでは比較的容易に高級言語対応ルーチンを実現できるのに対し、カーネルと異なる保護レベルで動作するタスクやタスク例外ハンドラな
どは高級言語対応ルーチンを実現することが難しい。そのため、タスクの場合は高級言語対応ルーチンを使用したとしても関数からのリターンによるタスクの終了は保証しない。タスクの関数からreturnや”}”を用いてリターンした場合の動作は未定義とする。タスクの最後には、必ず自タスク終了(tk_ext_tsk)または自タスクの終了と削除(tk_exd_tsk)を発行する必要がある。
また、タスク例外ハンドラの高級言語対応ルーチンはソースコードで提供することとし、ユーザプログラムに組み込むものとしている。
高級言語対応ルーチンの内部動作は図 3.1. 「高級言語対応ルーチンの動作」のようになる。

図 3.1: 高級言語対応ルーチンの動作

μT-Kernel 3.0仕様書

49 / 487

3.4 サービスプロファイル
μT-Kernel 3.0のサービスプロファイルを以下に示す。これらのサービスプロファイルを定義することは必須である。なお、このほかにOSの実装者が独自のサービスプロファイルの定義を追加することは構わない。

3.4.1 有効・無効を示すプロファイル
ある機能が有効か無効かを示すサービスプロファイルは、TRUE、FALSE のいずれかに定義された以下のマクロによってそれぞれ規定される。(以下の定義はあくまで例であり、実際の各プロファイルの値については実装に応じて適切に定義しなければならない。)
3.4.1.1

デバイスドライバ向け機能# define# define# define# define

TK_SUPPORT_TASKEVENTTK_SUPPORT_DISWAITK_SUPPORT_IOPORTTK_SUPPORT_MICROWAIT

TRUE
TRUE
TRUE
TRUE

/* タスクイベント関連機能のサポート *//* タスクの待ち禁止状態のサポート *//* I / Oポートアクセス機能のサポート *//* 微小待ち機能のサポート */TK_SUPPORT_TASKEVENT、TK_SUPPORT_DISWAIは、高機能で汎用性の高いデバイスドライバを使用するシステムではTRUEを推奨する。
TK_SUPPORT_IOPORT、TK_SUPPORT_MICROWAITは、一般にはTRUEを推奨する。
3.4.1.2

省電力機能# define TK_SUPPORT_LOWPOWER

TRUE/* 省電力機能のサポート */TK_SUPPORT_LOWPOWERは、TRUEを推奨する。ただし、省電力の要求の強くないシステムや、ハードウェア上の制約のあるシステ
ムでは、FALSEでよい。
3.4.1.3

動的/静的メモリ管理機能# define TK_SUPPORT_USERBUF# define TK_SUPPORT_AUTOBUF# define TK_SUPPORT_MEMLIB

FALSE
TRUE
TRUE

/* ユーザバッファ指定( TA_USERBUF )のサポート *//* 自動バッファ割当て( TA_USERBUF指定なし)のサポート *//* メモリ割当てライブラリのサポート */TK_SUPPORT_USERBUFは、一般にはFALSEを推奨する。
TK_SUPPORT_AUTOBUFは、一般にはTRUEを推奨する。
ただし、メモリ管理を静的に行うシステムでは、TK_SUPPORT_USERBUFをTRUEとし、TK_SUPPORT_AUTOBUFをFALSEとしてもよい。
TK_SUPPORT_USERBUFとTK_SUPPORT_AUTOBUFの両方をFALSEとすることはできない。
TK_SUPPORT_MEMLIBは、一般にはTRUEを推奨する。
3.4.1.4

タスク例外処理機能# define TK_SUPPORT_TASKEXCEPTIONTRUE /* タスク例外処理機能のサポート */TK_SUPPORT_TASKEXCEPTIONは、複数のソフトウェアモジュールで構成され、柔軟な異常系の処理を必要とするような、比較的大規模なシステムではTRUEを推奨する。

μT-Kernel 3.0仕様書

3.4.1.5

50 / 487

サブシステム関連機能# define TK_SUPPORT_SUBSYSTEM# define TK_SUPPORT_SSYEVENT

TRUE
TRUE

/* サブシステム管理機能のサポート *//* サブシステムのイベント処理のサポート */TK_SUPPORT_SUBSYSTEM、TK_SUPPORT_SSYEVENTは、ミドルウェアを利用するような、比較的大規模なシステムではTRUEを推奨する。
3.4.1.6

システム構成情報取得機能# define TK_SUPPORT_SYSCONF

FALSE/* システム構成情報管理機能のサポート */TK_SUPPORT_SYSCONFは、システム構成情報(タスクなどのオブジェクトの最大数など)の指定を静的に行うシステム、たとえばOSのビルド時にシステム構成情報をハードコーティングするようなシステムではFALSEとする。一方、システム構成情報の指定を柔軟に行うシステムではTRUEとする。
3.4.1.7

64ビット対応、16ビット対応# define# define# define# define

TK_HAS_DOUBLEWORD
TK_SUPPORT_USEC
TK_SUPPORT_LARGEDEVTK_SUPPORT_SERCD

FALSE
FALSE
FALSE
TRUE

/* 64ビットデータ型(D , UD , VD )のサポート *//* マイクロ秒のサポート *//* 大容量デバイス(64ビット)のサポート *//* サブエラーコードのサポート */TK_HAS_DOUBLEWORD、TK_SUPPORT_USEC、TK_SUPPORT_LARGEDEVは、 対 象 と な る ハ ー ド ウ ェ ア や シ ス テ ム の 用 途 に 依 存 して、TRUEまたはFALSEとする。
TK_HAS_DOUBLEWORD がFALSEであるとき、TK_SUPPORT_USEC および TK_SUPPORT_LARGEDEV もFALSEとなる。
TK_SUPPORT_SERCDは、INTやERが32ビットのシステムではTRUEを推奨し、INTやERが16ビットのシステムではFALSEを推奨する。
3.4.1.8

CPU、ハードウェア、システム、コンパイラ依存機能

以下のプロファイルは、対象となるハードウェアやOSの実装に依存して、TRUEまたはFALSEとする。
3.4.1.8.1# define# define# define# define# define

3.4.1.8.2# define# define# define# define

割込み関連機能TK_SUPPORT_INTCTRLTK_HAS_ENAINTLEVELTK_SUPPORT_CPUINTLEVELTK_SUPPORT_CTRLINTLEVELTK_SUPPORT_INTMODE

TRUE
TRUE
FALSE
TRUE
TRUE

/* 割込みコントローラ制御機能のサポート *//* 割込み優先度の指定が可能 *//* CPU内割込みマスクレベルのサポート *//* 割込みコントローラ内割込みマスクレベルのサポート *//* 割込みモード設定機能のサポート */

TRUE
TRUE
FALSE
TRUE

/* メモリキャッシュ制御機能のサポート *//* キャッシュモード設定機能のサポート *//* ライトバックキャッシュのサポート *//* ライトスルーキャッシュのサポート */キャッシュ制御機能
TK_SUPPORT_CACHECTRLTK_SUPPORT_SETCACHEMODE
TK_SUPPORT_WBCACHETK_SUPPORT_WTCACHE

μT-Kernel 3.0仕様書

3.4.1.8.3

FPU(COP)サポート# define# define# define# define# define

TK_SUPPORT_FPU
TK_SUPPORT_COP0
TK_SUPPORT_COP1
TK_SUPPORT_COP2
TK_SUPPORT_COP3

3.4.1.8.4

その他の機能# define# define# define# define# define# define# define# define# define

51 / 487

TK_SUPPORT_ASM
TK_SUPPORT_REGOPSTK_ALLOW_MISALIGN
TK_BIGENDIAN
TK_TRAP_SVC
TK_HAS_SYSSTACKTK_SUPPORT_PTIMER
TK_SUPPORT_UTC
TK_SUPPORT_TRONTIME

TRUE
TRUE
FALSE
FALSE
FALSE

/* FPU機能のサポート *//* 番号0のコプロセッサ利用機能のサポート *//* 番号1のコプロセッサ利用機能のサポート *//* 番号2のコプロセッサ利用機能のサポート *//* 番号3のコプロセッサ利用機能のサポート */

FALSE
FALSE
FALSE
FALSE
TRUE
TRUE
TRUE
TRUE
FALSE

/* アセンブリ言語による処理ルーチンのサポート *//* タスクレジスタ取得・設定機能のサポート *//* メモリのミスアラインアクセスが可能 *//* ビッグエンディアン(定義必須) *//* システムコールの呼び出しにCPUのトラップ命令を利用 *//* タスクが独立したシステムスタックを持つ *//* 物理タイマ機能のサポート *//* UNIX表現のシステム時刻のサポート *//* TRON表現のシステム時刻のサポート */TK_SUPPORT_UTC と TK_SUPPORT_TRONTIME の少なくとも一方はTRUEでなければならない。
3.4.1.9

デバッグサポート関連機能# define TK_SUPPORT_DSNAME# define TK_SUPPORT_DBGSPT

FALSE
FALSE

/* DSオブジェクト名称のサポート *//* μT - Kernel / DSのサポート */TK_SUPPORT_DSNAME、TK_SUPPORT_DBGSPTは、必要に応じてTRUEまたはFALSEとする。
なお、TK_SUPPORT_DBGSPTは、μT-Kernel/DSのAPIのうち、td_ref_dsname と td_set_dsname 以外のAPIの利用の可否を示す。TK_SUPPORT_DBGSPTがFALSEであっても、TK_SUPPORT_DSNAMEがTRUEであれば、td_ref_dsname と td_set_dsnameを利用できる。
3.4.1.10 サービスプロファイルの判定方法
μT-Kernel 3.0の各実装では前述のプロファイルはすべて定義されなければならないが、プロファイル定義の提供されない
他のOSやプロファイルの漏れなどを想定し、未定義の場合も考慮したプロファイルの利用が推奨される。例えば、有効・無効・
未定義を全て区別して扱う場合には、たとえば以下のような条件判定を行えば良い。
# if defined ( TK_SUPPORT_xxx )# if TK_SUPPORT_xxx/* プロファイルが有効に定義されている場合 */# else/* プロファイルが無効に定義されている場合 */# endif# else/* プロファイルが未定義の場合 */# endif

ここで、もし以下のようにプロファイル定義をそのまま ”#if” の条件として使うと、このプロファイルを無効として定義していた
場合と、このプロファイルが未定義だった場合との区別ができない。
# if TK_SUPPORT_xxx/* プロファイルが有効に定義されている場合 */# else/* プロファイルが無効または未定義の場合 */# endifμT-Kernel 3.0仕様書

52 / 487

3.4.2 値を持つサービスプロファイル
上限値やバージョン番号などを示すサービスプロファイルは、その値を示すマクロとして規定される。(以下の定義はあくまで一例であり、実際のプロファイルの値については実装依存である。)# define# define# define# define

TK_SPECVER_MAGIC
TK_SPECVER_MAJOR
TK_SPECVER_MINOR
TK_SPECVER

6/* μT - KernelのMAGIC */3/* 仕様書のメジャーバージョン番号 */0/* 仕様書のマイナーバージョン番号 */(( TK_SPECVER_MAJOR << 8) | TK_SPECVER_MINOR )/* μT - Kernelのバージョン番号 */# define# define# define

TK_MAX_TSKPRI
TK_WAKEUP_MAXCNTTK_SEMAPHORE_MAXCNT

32
65535
65535

# define# define# define# define# define# define

TK_SUSPEND_MAXCNTTK_MEM_RNG0
TK_MEM_RNG1
TK_MEM_RNG2
TK_MEM_RNG3
TK_MAX_PTIMER

65535
0
0
0
3
2

/* 最大タスク優先度 ( >= 16) *//* タスクの起床要求の最大キューイング数 ( >= 1) *//* セマフォ資源数の最大値( maxsem )の上限値( >= 32767) *//* タスクの強制待ち要求の最大ネスト数 ( >= 1) *//* TA_RNG0の実際のメモリ保護レベル (0〜3) *//* TA_RNG1の実際のメモリ保護レベル (0〜3) *//* TA_RNG2の実際のメモリ保護レベル (0〜3) *//* TA_RNG3の実際のメモリ保護レベル (0〜3) *//* 最大物理タイマ番号 ( >= 0)(物理タイマ番号に1〜TK_MAX_PTIMERが指定可) */TK_MEM_RNGn は、TA_RNGnで指定されたメモリの実際のメモリ保護レベルを指し、TK_MEM_RNGn == TK_MEM_RNGm ならば、メモリアクセスの保護レベルについてTA_RNGnとTA_RNGmが同一であることを示す。すなわち、保護レベルが n のメモリを、保護レベ
ル m を持つタスクからアクセスしてもアクセス権違反の例外が生じないことが保証される。
なお、値を持つサービスプロファイルに対しても、defined(...)等を用いてプロファイル定義が提供されないケースを考慮した上で利用することが推奨される。

3.4.3 サービスプロファイルの具体例
以下にサービスプロファイルの具体例を示す。
3.4.3.1

16ビットCPUでごく小規模なシステムでのプロファイル例# define# define# define# define

TK_SUPPORT_TASKEVENTTK_SUPPORT_DISWAITK_SUPPORT_IOPORTTK_SUPPORT_MICROWAIT

FALSE
FALSE
TRUE
TRUE

# define TK_SUPPORT_LOWPOWER

TRUE# define TK_SUPPORT_USERBUF# define TK_SUPPORT_AUTOBUF# define TK_SUPPORT_MEMLIB

TRUE
FALSE
FALSE

# define TK_SUPPORT_TASKEXCEPTION

FALSE# define TK_SUPPORT_SUBSYSTEM# define TK_SUPPORT_SSYEVENT

FALSE
FALSE

# define TK_SUPPORT_SYSCONF

FALSE# define# define# define# define

FALSE
FALSE
FALSE
FALSE

TK_HAS_DOUBLEWORD
TK_SUPPORT_USEC
TK_SUPPORT_LARGEDEVTK_SUPPORT_SERCD

μT-Kernel 3.0仕様書

53 / 487# define# define# define# define# define

TK_SUPPORT_INTCTRLTK_HAS_ENAINTLEVELTK_SUPPORT_CPUINTLEVELTK_SUPPORT_CTRLINTLEVELTK_SUPPORT_INTMODE

FALSE
FALSE
FALSE
FALSE
TRUE

# define# define# define# define

TK_SUPPORT_CACHECTRLTK_SUPPORT_SETCACHEMODE
TK_SUPPORT_WBCACHETK_SUPPORT_WTCACHE

FALSE
FALSE
FALSE
FALSE

# define# define# define# define# define

TK_SUPPORT_FPU
TK_SUPPORT_COP0
TK_SUPPORT_COP1
TK_SUPPORT_COP2
TK_SUPPORT_COP3

FALSE
FALSE
FALSE
FALSE
FALSE

# define# define# define# define# define# define# define# define# define

TK_SUPPORT_ASM
TK_SUPPORT_REGOPSTK_ALLOW_MISALIGN
TK_BIGENDIAN
TK_TRAP_SVC
TK_HAS_SYSSTACKTK_SUPPORT_PTIMER
TK_SUPPORT_UTC
TK_SUPPORT_TRONTIME

TRUE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
TRUE
FALSE

# define TK_SUPPORT_DSNAME# define TK_SUPPORT_DBGSPT

FALSE
FALSE

# define# define# define# define

TK_SPECVER_MAGIC
TK_SPECVER_MAJOR
TK_SPECVER_MINOR
TK_SPECVER

630(( TK_SPECVER_MAJOR << 8) | TK_SPECVER_MINOR )# define# define# define# define# define# define# define# define# define

TK_MAX_TSKPRI
TK_WAKEUP_MAXCNTTK_SEMAPHORE_MAXCNT
TK_SUSPEND_MAXCNTTK_MEM_RNG0
TK_MEM_RNG1
TK_MEM_RNG2
TK_MEM_RNG3
TK_MAX_PTIMER

16
4095
4095
4095
0
0
0
0
0

3.4.3.2

比較的大規模なシステムでのプロファイル例# define# define# define# define

TK_SUPPORT_TASKEVENTTK_SUPPORT_DISWAITK_SUPPORT_IOPORTTK_SUPPORT_MICROWAIT

TRUE
TRUE
TRUE
TRUE

# define TK_SUPPORT_LOWPOWER

TRUE# define TK_SUPPORT_USERBUF# define TK_SUPPORT_AUTOBUF# define TK_SUPPORT_MEMLIB

FALSE
TRUE
TRUE

# define TK_SUPPORT_TASKEXCEPTIONTRUE

μT-Kernel 3.0仕様書

54 / 487# define TK_SUPPORT_SUBSYSTEM# define TK_SUPPORT_SSYEVENT

TRUE
TRUE

# define TK_SUPPORT_SYSCONF

TRUE# define# define# define# define

TK_HAS_DOUBLEWORD
TK_SUPPORT_USEC
TK_SUPPORT_LARGEDEVTK_SUPPORT_SERCD

TRUE
TRUE
TRUE
TRUE

# define# define# define# define# define

TK_SUPPORT_INTCTRLTK_HAS_ENAINTLEVELTK_SUPPORT_CPUINTLEVELTK_SUPPORT_CTRLINTLEVELTK_SUPPORT_INTMODE

TRUE
TRUE
FALSE
TRUE
TRUE

# define# define# define# define

TK_SUPPORT_CACHECTRLTK_SUPPORT_SETCACHEMODE
TK_SUPPORT_WBCACHETK_SUPPORT_WTCACHE

TRUE
TRUE
TRUE
TRUE

# define# define# define# define# define

TK_SUPPORT_FPU
TK_SUPPORT_COP0
TK_SUPPORT_COP1
TK_SUPPORT_COP2
TK_SUPPORT_COP3

TRUE
TRUE
FALSE
FALSE
FALSE

# define# define# define# define# define# define# define# define# define

TK_SUPPORT_ASM
TK_SUPPORT_REGOPSTK_ALLOW_MISALIGN
TK_BIGENDIAN
TK_TRAP_SVC
TK_HAS_SYSSTACKTK_SUPPORT_PTIMER
TK_SUPPORT_UTC
TK_SUPPORT_TRONTIME

TRUE
TRUE
FALSE
FALSE
TRUE
TRUE
TRUE
TRUE
FALSE

# define TK_SUPPORT_DSNAME# define TK_SUPPORT_DBGSPT

TRUE
TRUE

# define# define# define# define

TK_SPECVER_MAGIC
TK_SPECVER_MAJOR
TK_SPECVER_MINOR
TK_SPECVER

630(( TK_SPECVER_MAJOR << 8) | TK_SPECVER_MINOR )# define# define# define# define# define# define# define# define# define

TK_MAX_TSKPRI
TK_WAKEUP_MAXCNTTK_SEMAPHORE_MAXCNT
TK_SUSPEND_MAXCNTTK_MEM_RNG0
TK_MEM_RNG1
TK_MEM_RNG2
TK_MEM_RNG3
TK_MAX_PTIMER

140
65535
65535
65535
0
0
0
3
10

μT-Kernel 3.0仕様書

第4章

μT-Kernel/OSの機能
この章では、μT-Kernel/OS(Operating System)で提供しているシステムコールの詳細について説明を行う。

55 / 487

μT-Kernel 3.0仕様書

56 / 487

4.1 タスク管理機能
タスク管理機能は、タスクの状態を直接的に操作／参照するための機能である。タスクを生成／削除する機能、タスクを起動／終了する機能、タスクの優先度を変更する機能、タスクの状態を参照する機能が含まれる。タスクはID番号で識別されるオ
ブジェクトである。タスクのID番号をタスクIDと呼ぶ。タスク状態とスケジューリング規則については、項2.2. 「タスク状態とス
ケジューリング規則」を参照すること。
タスクは、実行順序を制御するために、ベース優先度と現在優先度を持つ。単にタスクの優先度といった場合には、タスクの現在優先度を指す。タスクのベース優先度は、タスクの起動時にタスクの起動時優先度に初期化する。ミューテックス機能を使わない場合には、タスクの現在優先度は常にベース優先度に一致している。そのため、タスク起動直後の現在優先度は、タス
クの起動時優先度になっている。ミューテックス機能を使う場合に現在優先度がどのように設定されるかについては、項4.5.1.
「ミューテックス」で述べる。
カーネルは、タスクの終了時に、ミューテックスのロック解除を除いては、タスクが獲得した資源(セマフォ資源、メモリブロックなど)を解放する処理を行わない。タスク終了時に資源を解放するのは、アプリケーションの責任である。

μT-Kernel 3.0仕様書

57 / 487

4.1.1 tk_cre_tsk - タスク生成
C言語インタフェース#include <tk/tkernel.h>ID tskid = tk_cre_tsk(CONST T_CTSK *pk_ctsk);
パラメータ
CONST T_CTSK*

pk_ctsk

Packet to Create Task

タスク生成情報

pk_ctsk の内容
void*
exinf
Extended Information
ATR
tskatrTask AttributeFP
task
Task Start Address
PRI
itskpri
Initial Task Priority
SZ
stksz
Stack Size
SZ
sstkszSystem Stack Sizevoid*
stkptrUser Stack PointerUB
dsname[8]DS Object namevoid*
bufptrBuffer Pointer──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
タスク属性
タスク起動アドレス
タスク起動時優先度
スタックサイズ(バイト数)
システムスタックサイズ(バイト数)
ユーザスタックポインタ
DSオブジェクト名称
ユーザバッファポインタ

リターンパラメータ
ID

tskid
または

Task ID
Error Code

タスクID
エラーコードエラーコードE_NOMEM
E_LIMITE_RSATRE_NOSPT

メモリ不足(管理ブロックやスタック用の領域が確保できない)
タスクの数がシステムの制限を超えた
予約属性(tskatr が不正あるいは利用できない)、指定のコプロセッサは存在しない
未サポート機能(TA_ASM, TA_USERSTACK, TA_TASKSPACE, TA_USERBUF に関する指定が未サポー
トの場合)
パラメータエラー
指定のコプロセッサが使用できない(動作中のハードウェアには搭載されていない、または動作異常が検出された)

E_PAR
E_NOCOP

利用可能なコンテキスト
タスク部
○

準タスク部
○

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

TA_ASMのタスク属性指定が可能

タスク独立部×μT-Kernel 3.0仕様書

58 / 487

TK_SUPPORT_USERBUF
TK_SUPPORT_AUTOBUFTK_SUPPORT_FPU
TK_SUPPORT_COPn
TK_HAS_SYSSTACK

TA_USERBUFのタスク属性指定が可能
自動バッファ割当て(TA_USERBUFのタスク属性指定なし)が可能
TA_FPUのタスク属性指定が可能
TA_COPnのタスク属性指定が可能
タスクがユーザスタックとは独立したシステムスタックを持ち、ユーザスタ
ック・システムスタックに対する個別の指定(TA_USERSTACK, TA_SSTKSZ)が可能
TA_DSNAMEのタスク属性指定が可能
指定可能な最大タスク優先度の値 (>= 16)

TK_SUPPORT_DSNAME
TK_MAX_TSKPRI
解説

タスクを生成しタスクID番号を割り当てる。具体的には、生成するタスクに対してTCB(Task Control Block)を割り付
け、itskpri, task, stksz などの情報をもとにその初期設定を行う。
対象タスクは生成後、休止状態(DORMANT)となる。
itskpri によって、タスクが起動する時の優先度の初期値を指定する。タスク優先度には1以上の値を指定することができ、数の小さい方が高い優先度となる。指定可能な最大のタスク優先度は TK_MAX_TSKPRI で規定される。
exinf は、対象タスクに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した情報は、タスクに起動パラメータとして渡される他、tk_ref_tsk で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい
場合や、途中で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf に入れる。カーネルでは exinf の内容について関知しない。
tskatr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。tskatr のシステム属性の部分では、次のような指定を行う。
tskatr := (TA_ASM || TA_HLNG)| [TA_SSTKSZ] | [TA_USERSTACK] | [TA_USERBUF] | [TA_DSNAME]| (TA_RNG0 || TA_RNG1 || TA_RNG2 || TA_RNG3)| [TA_COP0] | [TA_COP1] | [TA_COP2] | [TA_COP3] | [TA_FPU]
TA_ASM
TA_HLNG
TA_SSTKSZ
TA_USERSTACK
TA_USERBUF
TA_DSNAME
TA_RNGn
TA_COPn
TA_FPU

対象タスクがアセンブリ言語で書かれている
対象タスクが高級言語で書かれている
システムスタックサイズを指定する
ユーザスタックポインタを指定する
スタック領域としてユーザが指定した領域を使用する
DSオブジェクト名称を指定する
対象タスクは保護レベルnで実行する
対象タスクが第n番目のコプロセッサを使用する(浮動小数点演算用コプロセッサやDSPを含む)
対象タスクが浮動小数点演算用コプロセッサを使用する(TA_COPn による指定の内、特に浮動小
数点演算を使用するための、CPUに依存しない汎用的な指定である)

実装独自属性の機能は、例えば、被デバッグ対象のタスクであることを指定したりするために利用できる。また、システム属性の残りの部分は、将来マルチプロセッサ属性の指定などを行うために利用できる。
# define# define# define# define# define# define# define# define# define# define# define

TA_ASM
TA_HLNG
TA_SSTKSZ
TA_USERSTACK
TA_USERBUF
TA_DSNAME
TA_RNG0
TA_RNG1
TA_RNG2
TA_RNG3
TA_COP0

0 x00000000
0 x00000001
0 x00000002
0 x00000004
0 x00000020
0 x00000040
0 x00000000
0 x00000100
0 x00000200
0 x00000300
0 x00001000/* アセンブリ言語によるプログラム *//* 高級言語によるプログラム *//* システムスタックサイズを指定 *//* ユーザスタックポインタを指定 *//* ユーザバッファポインタを指定 *//* DSオブジェクト名称を指定 *//* 保護レベル0 で実行 *//* 保護レベル1 で実行 *//* 保護レベル2 で実行 *//* 保護レベル3 で実行 *//* ID =0 のコプロセッサを使用 */μT-Kernel 3.0仕様書# define TA_COP1# define TA_COP2# define TA_COP3

59 / 487

0 x00002000
0 x00004000
0 x00008000/* ID =1 のコプロセッサを使用 *//* ID =2 のコプロセッサを使用 *//* ID =3 のコプロセッサを使用 */TA_HLNG の指定を行った場合には、タスク起動時に直接 task のアドレスにジャンプするのではなく、高級言語の環境設定プ
ログラム(高級言語対応ルーチン)を通してから task のアドレスにジャンプする。TA_HLNG 属性の場合のタスクは次の形式となる。
void task ( INT stacd , void * exinf )
{
/*
処理
*/
tk_ext_tsk () ; または tk_exd_tsk () ; /* タスクの終了 */}タスクの起動パラメータとして、tk_sta_tsk で指定するタスク起動コード stacd、および tk_cre_tsk で指定する拡張情報
exinf を渡す。
関数からの単純なリターン(return)でタスクを終了することはできない(してはいけない)。その場合の動作は不定(実装依存)である。
TA_ASM 属性の場合のタスクの形式は実装依存とする。ただし、起動パラメータとして stacd, exinf を渡さなければならない。
タスクは、TA_RNGn で指定された保護レベルで動作する。システムコールや拡張SVCを呼び出すことで保護レベル0に移行し、システムコールや拡張SVCから戻ると元の保護レベルに復帰する。
各タスクはシステムスタックとユーザスタックの２本のスタックを持つ。ユーザスタックは TA_RNGn で指定した保護レベルで使用される。システムスタックは保護レベル0で使用される。システムコールや拡張SVCを呼び出すことにより保護レベルが遷移したときに使用するスタックが切り替えられる。
なお、TA_RNG0 を指定したタスクでは、保護レベルの遷移が起きないためスタックの切替も起きない。TA_RNG0 の場合は、ユー
ザスタックサイズとシステムスタックサイズの合計を１本のスタックとし、ユーザスタック兼システムスタックとして使用する。
TA_SSTKSZ を指定した場合に sstksz が有効になる。TA_SSTKSZ を指定しなかった場合は、sstksz は無視されデフォルトサイ
ズが適用される。
TA_USERSTACK を指定した場合に stkptr が有効になる。この場合、ユーザスタックはカーネルで用意しない。ユーザスタック
は呼出側で用意する。stksz には0を設定しなければならない。TA_USERSTACK を指定しなかった場合は、stkptr は無視される。ただし、TA_RNG0 の場合は、TA_USERSTACK を指定することはできない。TA_RNG0 と TA_USERSTACK を同時に指定した場合
は E_PAR が発生する。
ユーザスタックとシステムスタックを区別せずタスクごとにスタックを1本持った実装向けに TA_USERBUF の指定が提供される。この属性を指定した場合に bufptr が有効となり、bufptr を先頭とする stksz バイトのメモリ領域をユーザスタック兼シス
テムスタック領域として使用する。この場合、これらのスタックはカーネルで用意しない。
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 エラーとなる。
補足事項
タスクは、TA_RNGn で指定した保護レベルと保護レベル0のいずれかでのみ動作する。例えば、TA_RNG3 を指定したタスクが保護レベル1および2で動作することはない。
割込みスタックが分離されていないシステムでは、割込みハンドラもシステムスタックを使用する。割込みハンドラは保護レベ
ル0で動作する。
システムスタックのデフォルトサイズは、システムコールの実行により消費するサイズおよび割込みスタックが分離されていな
いシステムでは割込みハンドラにより消費されるサイズを考慮して決定する。

μT-Kernel 3.0仕様書

60 / 487

TA_COPn の定義は、CPUなどのハードウェアに依存して決められるため移植性はない。
TA_FPU は、TA_COPn の定義の内、浮動小数点演算の使用に関してのみ移植性のある指定方法として用意される。例えば、浮動小数点コプロセッサが TA_COP0 の場合は、TA_FPU＝TA_COP0 となる。浮動小数点演算を行うのに特にコプロセッサの使用を指定する必要がない場合は、TA_FPU＝0となる。
CPUの実行保護モードのないシステムにおいても、移植性確保のために TA_RNGn などすべての属性を受け付けなければならない。例えば、TA_RNGn の指定はすべて TA_RNG0 相当として処理してもよいが、エラーとはしない。
移植ガイドライン
T-Kernel 2.0にはTA_USERBUFとbufptrが存在しない。そのため、この機能を使っている場合はT-Kernel 2.0への移植の際に修正が必要となるが、正しくstkszを設定してあれば、TA_USERBUFとbufptrを削除するだけで移植できる。
μT-Kernelの最大のタスク優先度はTK_MAX_TSKPRIで示される。この値は可変だが、16以上であることが保証されているた
め、利用するタスク優先度の範囲を1〜16に限定することで移植の際のタスク優先度の修正が不要となる。

μT-Kernel 3.0仕様書

61 / 487

4.1.2 tk_del_tsk - タスク削除
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_del_tsk(ID tskid);
パラメータ
ID

tskid

Task ID

タスクID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_OBJ

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが休止状態(DORMANT)でない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
tskid で示されたタスクを削除する。
具体的には、tskid で指定されたタスクを休止状態(DORMANT)から未登録状態(NON-EXISTENT)(システムに存在しない状態)へと移行させ、それに伴ってTCBおよびスタック領域を解放する。また、タスクID番号も解放される。休止状態(DORMANT)でないタスクに対してこのシステムコールを実行すると、E_OBJ のエラーとなる。
このシステムコールで自タスクの指定はできない。自タスクを指定した場合には、自タスクが休止状態(DORMANT)ではない
ため、E_OBJ のエラーとなる。自タスクを削除するには、本システムコールではなく、tk_exd_tsk システムコールを発行する。

μT-Kernel 3.0仕様書

62 / 487

4.1.3 tk_sta_tsk - タスク起動
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_sta_tsk(ID tskid, INT stacd);
パラメータ
ID
INT

tskid
stacd

Task ID
Task Start Code

タスクID
タスク起動コード

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_OBJ

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが休止状態(DORMANT)でない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
なし
解説
tskid で示されたタスクを起動する。具体的には、休止状態(DORMANT)から実行可能状態(READY)へと移す。
stacd により、タスクの起動時にタスクに渡すパラメータを設定することができる。このパラメータは、対象タスクから参照する
ことができ、簡単なメッセージ通信の目的で利用できる。
タスク起動時のタスク優先度は、対象タスクが生成された時に指定されたタスク起動時優先度(itskpri)となる。
このシステムコールによる起動要求のキューイングは行わない。すなわち、対象タスクが休止状態(DORMANT)でないのにこのシステムコールが発行された場合、このシステムコールは無視され、発行タスクに E_OBJ のエラーが返る。
移植ガイドライン
stacd がINT型であり、処理系によって指定できる値の範囲が異なる可能性があるため注意が必要である。

μT-Kernel 3.0仕様書

63 / 487

4.1.4 tk_ext_tsk - 自タスク終了
C言語インタフェース#include <tk/tkernel.h>void tk_ext_tsk(void);
パラメータなし
リターンパラメータ※ システムコールを発行したコンテキストには戻らない
エラーコード※ 次のようなエラーを検出する可能性があるが、エラーを検出した場合でも、システムコールを発行したコンテキストには戻らない。したがって、システムコールのリターンパラメータとして直接エラーコードを返すことはできない。万一エラーを検出した場
合の動作は、実装依存となる。
E_CTX

コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
自タスクを正常終了させ、休止状態(DORMANT)へと移行させる。
補足事項
tk_ext_tsk によるタスクの終了時に、終了するタスクがそれ以前に獲得した資源(メモリブロック、セマフォなど) を自動的に解放するということはない。タスク終了前に資源を解放しておくのは、ユーザの責任である。
tk_ext_tsk は発行元のコンテキストに戻らないシステムコールである。したがって、何らかのエラーを検出した場合にエラーコ
ードを返しても、これらのシステムコールを呼んだ側ではエラーのチェックを行っていないのが普通であり、プログラムが暴走する可能性がある。そこで、これらのシステムコールでは、エラーを検出した場合にも、システムコール発行元へは戻らないものとする。
タスクが休止状態(DORMANT)に戻る時は、タスク優先度などTCBに含まれている情報もリセットされるというのが原則である。たとえば、tk_chg_pri によりタスク優先度を変更されているタスクが、tk_ext_tsk により終了した時、タスク優先度は
tk_cre_tsk で指定したタスク起動時優先度(itskpri)に戻る。tk_ext_tsk 実行時のタスク優先度になるわけではない。
元のコンテキストに戻らないシステムコールは、すべてtk_ret_???またはtk_ext_???(tk_exd_???)の名称となっている。

μT-Kernel 3.0仕様書

64 / 487

4.1.5 tk_exd_tsk - 自タスクの終了と削除
C言語インタフェース#include <tk/tkernel.h>void tk_exd_tsk(void);
パラメータなし
リターンパラメータ※ システムコールを発行したコンテキストには戻らない
エラーコード※ 次のようなエラーを検出する可能性があるが、エラーを検出した場合でも、システムコールを発行したコンテキストには戻らない。したがって、システムコールのリターンパラメータとして直接エラーコードを返すことはできない。万一エラーを検出した場
合の動作は、実装依存となる。
E_CTX

コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
自タスクを正常終了させ、さらに自タスクを削除する。すなわち、自タスクを未登録状態(NON-EXISTENT)(システムに存在しない状態)へと移行させる。
補足事項
tk_exd_tsk によるタスクの終了時に、終了するタスクがそれ以前に獲得した資源(メモリブロック、セマフォなど) を自動的に解放するということはない。タスク終了前に資源を解放しておくのは、ユーザの責任である。
tk_exd_tsk は発行元のコンテキストに戻らないシステムコールである。したがって、何らかのエラーを検出した場合にエラーコ
ードを返しても、これらのシステムコールを呼んだ側ではエラーのチェックを行っていないのが普通であり、プログラムが暴走する可能性がある。そこで、これらのシステムコールでは、エラーを検出した場合にも、システムコール発行元へは戻らないものとする。

μT-Kernel 3.0仕様書

65 / 487

4.1.6 tk_ter_tsk - 他タスク強制終了
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ter_tsk(ID tskid);
パラメータ
ID

tskid

Task ID

タスクID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_OBJ

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが休止状態(DORMANT)または自タスク)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
tskid で示されたタスクを強制的に終了させる。すなわち、tskid で示された対象タスクを休止状態(DORMANT)に移行させる。
対象タスクが待ち状態(強制待ち状態(SUSPENDED)を含む)にあった場合でも、対象タスクは待ち解除となって終了する。また、対象タスクが何らかの待ち行列(セマフォ待ちなど)につながれていた場合には、tk_ter_tsk の実行によってその待ち行列から削除される。
本システムコールでは、自タスクの指定はできない。自タスクを指定した場合には、E_OBJ のエラーとなる。
tk_ter_tsk の対象タスクの状態と実行結果との関係についてまとめたものを表 4.1. 「tk_ter_tskの対象タスクの状態と実行
結果」に示す。
補足事項
tk_ter_tsk によるタスクの終了時に、終了するタスクがそれ以前に獲得した資源(メモリブロック、セマフォなど)を自動的に解放するということはない。タスク終了前に資源を解放しておくのは、ユーザの責任である。

μT-Kernel 3.0仕様書

66 / 487

対象タスク状態実行できる状態(RUNNING,READY) (自タスク以外)
実行状態(RUNNING)(自タスク)
待ち状態(WAITING)
強制待ち状態(SUSPENDED)
二重待ち状態(WAITING-SUSPENDED)
休止状態(DORMANT)
未登録状態(NON-EXISTENT)

tk_ter_tsk の ercd
E_OK

処理
強制終了処理

E_OBJ
E_OK
E_OK
E_OK
E_OBJ
E_NOEXS

何もしない
強制終了処理強制終了処理強制終了処理
何もしない
何もしない

表 4.1: tk_ter_tskの対象タスクの状態と実行結果
タスクが休止状態(DORMANT)に戻る時は、タスク優先度などTCBに含まれている情報もリセットされるというのが原則である。たとえば、tk_chg_pri によりタスク優先度を変更されているタスクが、tk_ter_tsk により終了した時、タスク優先度は
tk_cre_tsk で指定したタスク起動時優先度(itskpri)に戻る。tk_sta_tsk によって再度タスクを起動した場合、tk_ter_tsk を実行して強制終了された時のタスク優先度になるわけではない。
他タスクの強制終了は、デバッガなどのOSに密接に関連したごく一部でのみ使用することを原則とする。一般のアプリケーシ
ョンやミドルウェアでは、他タスクの強制終了は原則として使用してはいけない。これは次のような理由による。
強制終了は、対象タスクの実行状態に関係なく行われる。例えば、タスクがあるミドルウェアの機能を呼び出しているとき、そのタスクを強制終了するとミドルウェアの実行途中でタスクが終了してしまうことになる。そのような状況になれば、ミドルウェアの正常動作は保証できなくなる。
このように、タスクの状態(何を実行中か)が不明な状況で、そのタスクを強制終了させることはできない。したがって、一般にタスクの強制終了は使用してはならない。

μT-Kernel 3.0仕様書

67 / 487

4.1.7 tk_chg_pri - タスク優先度変更
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_chg_pri(ID tskid, PRI tskpri);
パラメータ
ID
PRI

tskid
tskpri

Task ID
Task Priority

タスクID
タスク優先度Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_ILUSE

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
パラメータエラー(tskpri が不正あるいは利用できない値)
不正使用(上限優先度違反)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

指定可能な最大タスク優先度の値 (>= 16)

解説tskid で指定されるタスクのベース優先度を、tskpri で指定される値に変更する。それに伴って、タスクの現在優先度も変更する。
タスク優先度としては、1〜TK_MAX_TSKPRIの値を指定することができ、数の小さい方が高い優先度となる。
tskid に TSK_SELF(＝0)が指定されると、自タスクを対象タスクとする。ただし、タスク独立部から発行したシステムコールでtskid＝TSK_SELF を指定した場合には、E_ID のエラーとなる。また、tskpri に TPRI_INI(＝0)が指定されると、対象タスクのベース優先度を、タスクの起動時優先度(itskpri)に変更する。
このシステムコールで変更した優先度は、タスクが終了するまで有効である。タスクが休止状態(DORMANT)に戻る時、終了前のタスクの優先度は捨てられ、タスク生成時に指定されたタスク起動時優先度(itskpri)になる。ただし、休止状態(DORMANT)中に変更した優先度は有効である。次にタスクを起動したときは、その変更された優先度で起動される。
このシステムコールを実行した結果、対象タスクの現在優先度がベース優先度に一致している場合(ミューテックス機能を使わない場合には、この条件は常に成り立つ)には、次の処理を行う。

μT-Kernel 3.0仕様書

68 / 487

対象タスクが実行できる状態である場合、タスクの優先順位を、変更後の優先度にしたがって変化させる。変更後の優先度と同じ優先度を持つタスクの間では、対象タスクの優先順位を最低とする。
対象タスクが何らかのタスク優先度順の待ち行列につながれている場合にも、その待ち行列の中での順序を、変更後の優先度にしたがって変化させる。変更後の優先度と同じ優先度を持つタスクの間では、対象タスクを最後につなぐ。
対象タスクが TA_CEILING 属性のミューテックスをロックしているか、ロックを待っている場合で、tskpri で指定されたベース
優先度が、それらのミューテックスのいずれかの上限優先度よりも高い場合には、E_ILUSE エラーを返す。
補足事項
このシステムコールを呼び出した結果、対象タスクのタスク優先度順の待ち行列の中での順序が変化した場合、対象タスクないしはその待ち行列で待っている他のタスクの待ち解除が必要になる場合がある(メッセージバッファの送信待ち行列、および可変長メモリプールの獲得待ち行列)。
対象タスクが、TA_INHERIT 属性のミューテックスのロック待ち状態である場合、このシステムコールでベース優先度を変更したことにより、推移的な優先度継承の処理が必要になる場合がある。
ミューテックス機能を使わない場合には、対象タスクに自タスク、変更後の優先度に自タスクのベース優先度を指定してこのシステムコールが呼び出されると、自タスクの実行順位は同じ優先度を持つタスクの中で最低となる。そのため、このシステム
コールを用いて、実行権の放棄を行うことができる。
移植ガイドライン
μT-Kernelの最大のタスク優先度はTK_MAX_TSKPRIで示される。この値は可変だが、16以上であることが保証されているた
め、利用するタスク優先度の範囲を1〜16に限定することで移植の際のタスク優先度の修正が不要となる。

μT-Kernel 3.0仕様書

69 / 487

4.1.8 tk_get_reg - タスクレジスタの取得
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_get_reg(ID tskid, T_REGS *pk_regs, T_EIT *pk_eit, T_CREGS *pk_cregs);
パラメータ
ID
T_REGS*
T_EIT*

tskid
pk_regs
pk_eitTask ID
Packet of Registers
Packet of EIT Registers

T_CREGS*pk_cregs

Packet of Control Registers

対象タスクのID
汎用レジスタの値を返す領域へのポインタ
例外時に保存されるレジスタの値を返す
領域へのポインタ
制御レジスタの値を返す領域へのポインタ

ercd

Error Code

エラーコードリターンパラメータ
ER

T_REGS, T_EIT, T_CREGSの内容は、CPUおよび実装ごとに定義する。
エラーコード
E_OK
E_ID
E_NOEXS
E_OBJ
E_CTX

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが自タスク)
コンテキストエラー(タスク独立部からの発行)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

タスクレジスタ取得・設定機能のサポート

解説
tskid のタスクの現在のレジスタの内容を参照する。
pk_regs, pk_eit, pk_cregs にそれぞれ NULL を指定すると、対応するレジスタは参照されない。
参照されたレジスタの値が、タスク部実行中のものであるとは限らない。
自タスクに対して本システムコールを発行することはできない。(E_OBJ)

μT-Kernel 3.0仕様書

70 / 487

補足事項
参照可能なレジスタは、タスクのコンテキストに含まれるすべてのレジスタを原則とする。また、CPUに物理的に存在するレジスタ以外に、カーネルが仮想的にレジスタとして扱っているものがあればそれも含まれる。

μT-Kernel 3.0仕様書

71 / 487

4.1.9 tk_set_reg - タスクレジスタの設定
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_set_reg(ID tskid, CONST T_REGS *pk_regs, CONST T_EIT *pk_eit, CONST T_CREGS *pk_cregs);
パラメータ
ID
CONST T_REGS*CONST T_EIT*CONST T_CREGS*

tskid
pk_regs
pk_eitpk_cregs

Task ID
Packet of Registers
Packet of EIT Registers
Packet of Control Registers

対象タスクのID
汎用レジスタ
例外時に保存されるレジスタ
制御レジスタ

T_REGS, T_EIT, T_CREGSの内容は、CPUおよび実装ごとに定義する。
リターンパラメータER

ercd

Error Code

エラーコードエラーコード
E_OK
E_ID
E_NOEXS
E_OBJ
E_CTX
E_PAR

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが自タスク)
コンテキストエラー(タスク独立部からの発行)設定するレジスタ値が不正(実装依存)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

タスクレジスタ取得・設定機能のサポート

解説
tskid のタスクのレジスタを指定の内容に設定する。
pk_regs, pk_eit, pk_cregs にそれぞれ NULL を指定すると、対応するレジスタは設定されない。
設定するレジスタの値が、タスク部実行中のものであるとは限らない。レジスタの値を設定したことによる影響には、カーネルは関知しない。

μT-Kernel 3.0仕様書

72 / 487

ただし、カーネルの動作上変更が許されないレジスタやレジスタ内の一部のビットが変更できないようになっている場合がある。(実装依存)自タスクに対して本システムコールを発行することはできない。(E_OBJ)

μT-Kernel 3.0仕様書

73 / 487

4.1.10 tk_get_cpr - コプロセッサのレジスタの取得
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_get_cpr(ID tskid, INT copno, T_COPREGS *pk_copregs);
パラメータ
ID
INT
T_COPREGS*

tskid
copno
pk_copregs

Task ID
Coprocessor Number
Packet of Coprocessor
Registers

対象タスクのID
コプロセッサ番号(0〜3)
コプロセッサのレジスタの値を返す領域へ
のポインタ

ercd

Error Code

エラーコードT_COP0REG

cop0

コプロセッサ番号0のレジスタ

T_COP1REG

cop1

T_COP2REG

cop2

T_COP3REG

cop3

Coprocessor Number 0
Register
Coprocessor Number 1
Register
Coprocessor Number 2
Register
Coprocessor Number 3
Register

リターンパラメータER
pk_copregs の内容

コプロセッサ番号1のレジスタ
コプロセッサ番号2のレジスタ
コプロセッサ番号3のレジスタ

T_COPnREGの内容は、CPUおよび実装ごとに定義する。
エラーコード
E_OK
E_ID
E_NOEXS
E_OBJ
E_CTX
E_PAR

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが自タスク)
コンテキストエラー(タスク独立部からの発行)
パラメータエラー(copno が不正または指定のコプロセッサは存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

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

番号nのコプロセッサ利用機能のサポート

タスク独立部×μT-Kernel 3.0仕様書

74 / 487

なお、すべてのnについてTK_SUPPORT_COPnが無効である場合、本APIはサポートされない。
解説
tskid のタスクの copno で指定したコプロセッサの現在のレジスタ内容を参照する。
参照されたレジスタの値が、タスク部実行中のものであるとは限らない。
自タスクに対して本システムコールを発行することはできない。(E_OBJ)
補足事項
参照可能なレジスタは、タスクのコンテキストに含まれるすべてのレジスタを原則とする。また、CPUに物理的に存在するレジスタ以外に、カーネルが仮想的にレジスタとして扱っているものがあればそれも含まれる。

μT-Kernel 3.0仕様書

75 / 487

4.1.11 tk_set_cpr - コプロセッサのレジスタの設定
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_set_cpr(ID tskid, INT copno, CONST T_COPREGS *pk_copregs);
パラメータ
ID
INT
CONST T_COPREGS*

tskid
copno
pk_copregs

Task ID
Coprocessor Number
Packet of Coprocessor
Registers

対象タスクのID
コプロセッサ番号(0〜3)
コプロセッサのレジスタ

T_COP0REG

cop0

コプロセッサ番号0のレジスタ

T_COP1REG

cop1

T_COP2REG

cop2

T_COP3REG

cop3

Coprocessor Number 0
Register
Coprocessor Number 1
Register
Coprocessor Number 2
Register
Coprocessor Number 3
RegisterError Code

エラーコードpk_copregs の内容

コプロセッサ番号1のレジスタ
コプロセッサ番号2のレジスタ
コプロセッサ番号3のレジスタ

リターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_OBJ
E_CTX
E_PAR

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが自タスク)
コンテキストエラー(タスク独立部からの発行)
パラメータエラー(copno が不正または指定のコプロセッサは存在しない)、設定するレジスタ値が不正(実装依存)

利用可能なコンテキスト
タスク部
○

準タスク部
○

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

番号nのコプロセッサ利用機能のサポート

タスク独立部×μT-Kernel 3.0仕様書

76 / 487

なお、すべてのnについてTK_SUPPORT_COPnが無効である場合、本APIはサポートされない。
解説
tskid のタスクの copno で指定したコプロセッサのレジスタに指定の内容を設定する。
設定するレジスタの値が、タスク部実行中のものであるとは限らない。レジスタの値を設定したことによる影響には、カーネルは関知しない。
ただし、カーネルの動作上変更が許されないレジスタやレジスタ内の一部のビットが変更できないようになっている場合がある。(実装依存)自タスクに対して本システムコールを発行することはできない。(E_OBJ)

μT-Kernel 3.0仕様書

77 / 487

4.1.12 tk_ref_tsk - タスク状態参照
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_tsk(ID tskid, T_RTSK *pk_rtsk);
パラメータ
ID
tskid
T_RTSK* pk_rtsk

Task ID
Packet to Refer Task Status

タスクID
タスク状態を返す領域へのポインタ

Error Code

エラーコードリターンパラメータ
ER

ercd

pk_rtsk の内容
void*
exinf
Extended Information
PRI
tskpri
Task Priority
PRI
tskbpri
Task Base Priority
UINT
tskstatTask State
UW
tskwait
Task Wait Factor
ID
wid
Waiting Object ID
INT
wupcntWakeup Count
INT
suscntSuspend Count
UW
waitmask
Wait Mask
UINT
texmask
Task Exception Mask
UINT
tskevent
Task Event──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
現在の優先度
ベース優先度
タスク状態
待ち要因
待ちオブジェクトID
起床要求キューイング数
強制待ち要求ネスト数待ちを禁止されている待ち要因
許可されているタスク例外
発生しているタスクイベント

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
パラメータエラー(pk_rtsk が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

待ち禁止状態に関する情報(waitmask)の取得が可能
タスク例外情報(texmask)の取得が可能
タスクイベント発生情報(tskevent)の取得が可能

μT-Kernel 3.0仕様書

78 / 487

解説
tskid で示された対象タスクの各種の状態を参照する。
tskstat は次のような値をとる。
TTS_RUNTTS_RDY
TTS_WAITTS_SUSTTS_WASTTS_DMT
TTS_NODISWAI

0x00010x00020x00040x00080x000c0x00100x0080

実行状態(RUNNING)
実行可能状態(READY)
待ち状態(WAITING)
強制待ち状態(SUSPENDED)
二重待ち状態(WAITING-SUSPENDED)
休止状態(DORMANT)
待ち禁止拒否状態

TTS_RUN, TTS_WAI などによるタスク状態の表現はビット対応になっているため、和集合の判定を行う(例えば、実行状態(RUNNING)または実行可能状態(READY)であることを判定する)場合に便利である。なお、上記の状態のうち、TTS_WAS は
TTS_SUS と TTS_WAI が複合したものであるが、TTS_SUS がこれ以外の状態(TTS_RUN, TTS_RDY, TTS_DMT)と複合することはな
い。
TTS_WAI(TTS_WAS 含む)の場合、tk_dis_wai による待ち禁止を拒否している状態であれば、TTS_NODISWAI がセットされる。TTS_WAI 以外と TTS_NODISWAI が組み合わされることはない。
割込みハンドラの 中か ら、割 り込ま れた タス クを対 象と した tk_ref_tsk を実行 した 場合は、tskstat として 実行 状態(RUNNING)(TTS_RUN)を返す。
tskstat が TTS_WAI(TTS_WAS を含む)の場合、tskwait, wid は 表 4.2. 「tskwait と wid の値」のような値をとる。
tskwaitTTW_SLPTTW_DLY
TTW_SEM
TTW_FLG
TTW_MBX
TTW_MTX
TTW_SMBF
TTW_RMBF
TTW_CAL
TTW_ACP
TTW_RDV(TTW_CAL | TTW_RDV)
TTW_MPF
TTW_MPL
TTW_EV1TTW_EV2TTW_EV3
TTW_EV4TTW_EV5
TTW_EV6TTW_EV7
TTW_EV8

値
0x00000001
0x00000002
0x00000004
0x00000008
0x00000040
0x00000080
0x00000100
0x00000200
0x00000400
0x00000800
0x00001000
0x00001400
0x00002000
0x00004000
0x00010000
0x00020000
0x00040000
0x00080000
0x00100000
0x00200000
0x00400000
0x00800000

意味tk_slp_tsk による待ちtk_dly_tsk による待ちtk_wai_sem による待ちtk_wai_flg による待ちtk_rcv_mbx による待ちtk_loc_mtx による待ちtk_snd_mbf による待ちtk_rcv_mbf による待ち
(予約)
(予約)
(予約)
(予約)
tk_get_mpf による待ちtk_get_mpl による待ちタスクイベント#1待ちタスクイベント#2待ちタスクイベント#3待ちタスクイベント#4待ちタスクイベント#5待ちタスクイベント#6待ちタスクイベント#7待ちタスクイベント#8待ち

wid
00
待ち対象の semid
待ち対象の flgid
待ち対象の mbxid
待ち対象の mtxid
待ち対象の mbfid
待ち対象の mbfid
(予約)
(予約)
(予約)
(予約)
待ち対象の mpfid
待ち対象の mplid
0
0
0
0
0
0
0
0

表 4.2: tskwait と wid の値
tskstat が TTS_WAI (TTS_WAS を含む) でない場合は、tskwait, wid はともに0となる。
waitmask は、tskwait と同じビット並びとなる。
texmask は、許可されている各タスク例外を1<<タスク例外コードのビット値として、論理和(OR)した値である。

μT-Kernel 3.0仕様書

79 / 487

tskevent は、発生している各タスクイベントを1<<(タスクイベント番号-1)のビット値として論理和(OR)した値である。
休止状態(DORMANT)のタスクでは wupcnt=0, suscnt=0, tskevent=0 である。
tskid＝TSK_SELF＝0によって自タスクの指定を行うことができる。ただし、タスク独立部から発行したシステムコールでtskid＝TSK_SELF＝0を指定した場合には、E_ID のエラーとなる。
tk_ref_tsk で、対象タスクが存在しない場合には、エラー E_NOEXS となる。
補足事項
このシステムコールで tskid＝TSK_SELF を指定した場合でも、自タスクのIDは分からない。自タスクのIDを知りたい場合には、tk_get_tid を利用する。

μT-Kernel 3.0仕様書

80 / 487

4.2 タスク付属同期機能
タスク付属同期機能は、タスクの状態を直接的に操作することによって同期を行うための機能である。タスクを起床待ちにする機能とそこから起床する機能、タスクの起床要求をキャンセルする機能、タスクの待ち状態を強制解除する機能、タスクを強制待ち状態へ移行する機能とそこから再開する機能、自タスクの実行を遅延する機能、タスクイベントに関する機能、タスクの待ち状態を禁止する機能が含まれる。
タスクに対する起床要求は、キューイングされる。すなわち、起床待ち状態でないタスクを起床しようとすると、そのタスクを起床しようとしたという記録が残り、後でそのタスクが起床待ちに移行しようとした時に、タスクを起床待ち状態にしない。タスクに対する起床要求のキューイングを実現するために、タスクは起床要求キューイング数を持つ。タスクの起床要求キューイング
数は、タスクの起動時に0にクリアする。
タスクに対する強制待ち要求は、ネストされる。すなわち、すでに強制待ち状態(二重待ち状態を含む)になっているタスクを再度強制待ち状態に移行させようとすると、そのタスクを強制待ち状態に移行させようとしたという記録が残り、後でそのタスクを強制待ち状態(二重待ち状態を含む)から再開させようとした時に、強制待ちからの再開を行わない。タスクに対する強制待ち要求のネストを実現するために、タスクは強制待ち要求ネスト数を持つ。タスクの強制待ち要求ネスト数は、タスクの起動時に0にクリアする。

μT-Kernel 3.0仕様書

81 / 487

4.2.1 tk_slp_tsk - 自タスクを起床待ち状態へ移行
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_slp_tsk(TMO tmout);
パラメータ
TMO

tmout

Timeout

タイムアウト指定(ミリ秒)

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_PAR
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
パラメータエラー(tmout≦(-2))
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
tk_slp_tsk システムコールでは、自タスクを実行状態(RUNNING)から起床待ち状態(tk_wup_tsk を待つ状態)に移す。ただし、自タスクに対する起床要求がキューイングされている場合、具体的には自タスクの起床要求キューイング数が1以上の場合には、起床要求キューイング数から1を減じ、自タスクを待ち状態に移行させず、そのまま実行を継続する。
tmout で指定した時間が経過する前にこのタスクを対象とした tk_wup_tsk が発行された場合は、このシステムコールは正常終了する。一方、tmout で指定した時間が経過する間に tk_wup_tsk が発行されなかった場合は、タイムアウトエラ
ー E_TMOUT となる。なお、tmout＝TMO_FEVR＝(-1)により、タイムアウトまでの時間が無限大であることを示す。この場合
は、tk_wup_tsk が発行されるまで永久に待ち状態になる。
補足事項
tk_slp_tsk は自タスクを待ち状態に移すシステムコールであるため、tk_slp_tsk がネストすることはあり得ない。しかし、tk_slp_tsk によって待ち状態になっているタスクに対して、他のタスクから tk_sus_tsk が実行される可能性はある。この場合、このタスクは二重待ち状態(WAITING-SUSPENDED)となる。

μT-Kernel 3.0仕様書

82 / 487

タスクの単純な遅延(時間待ち)を行うのであれば、tk_slp_tsk ではなく、tk_dly_tsk を用いるべきである。
タスク起床待ちはアプリケーションでの利用を前提とし、ミドルウェアでは原則として使用してはいけない。これは、次の理由による。
同一タスクにおいて、2ヵ所以上でタスク起床待ちによる同期を行うと、起床要求が混同してしまい誤動作することになる。例
えば、アプリケーションとミドルウェアの双方で起床待ちによる同期を利用していた場合、ミドルウェア内で起床待ちしている間に、アプリケーションが起床要求してしまうことがありえる。このような状況になれば、ミドルウェアもアプリケーションも正常な動作はできなくなる。
このように、どこで起床待ちしているかなどの状況がわからないと、正しいタスクの同期ができなくなる。タスク起床待ちによるタスクの同期は簡便な方法としてよく利用されるため、アプリケーションで自由に利用できることを確保するために、ミドルウェ
アでは使用しないことを原則とする。

μT-Kernel 3.0仕様書

83 / 487

4.2.2 tk_slp_tsk_u - 自タスクを起床待ち状態へ移行(マイクロ秒単位)
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_slp_tsk_u(TMO_U tmout_u);
パラメータ
TMO_U

tmout_u

Timeout

タイムアウト指定(マイクロ秒)

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_PAR
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
パラメータエラー(tmout_u≦(-2))
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

マイクロ秒のサポート

解説
tk_slp_tsk のパラメータである tmout を64ビットマイクロ秒単位の tmout_u としたシステムコールである。
パラメータが tmout_u となった点を除き、本システムコールの仕様は tk_slp_tsk と同じである。詳細は tk_slp_tsk の説明を参照のこと。

μT-Kernel 3.0仕様書

84 / 487

4.2.3 tk_wup_tsk - 他タスクの起床
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_wup_tsk(ID tskid);
パラメータ
ID

tskid

Task ID

タスクID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_OBJ
E_QOVR

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが自タスクまたは休止状態(DORMANT))
キューイングまたはネストのオーバーフロー(キューイング数 wupcnt のオーバーフロー)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

タスクの起床要求の最大キューイング数 (>= 1)

解説tskid で示されるタスクが tk_slp_tsk の実行による待ち状態であった場合に、その待ち状態を解除する。
本システムコールでは、自タスクを指定することはできない。自タスクを指定した場合には、E_OBJ のエラーとなる。
対象タスクが tk_slp_tsk を実行しておらず、待ち状態でない場合には、tk_wup_tsk による起床要求はキューイングされる。
すなわち、対象タスクに対して tk_wup_tsk が発行されたという記録が残り、この後で対象タスクが tk_slp_tsk を実行した場
合にも、待ち状態にはならない。これを起床要求のキューイングと呼ぶ。
起床要求のキューイングの動作は、具体的には次のようになる。各タスクは、TCBの中に起床要求キューイング数(wupcnt)という状態を持っており、その初期値(tk_sta_tsk 実行時の値)は0である。起床待ち状態でないタスクに対して tk_wup_tsk を実行することにより、対象タスクの起床要求キューイング数がプラス1される。一方、タスクが tk_slp_tsk を実行することにより、そのタスクの起床要求キューイング数がマイナス1される。そうして、起床要求キューイング数＝0のタスクが tk_slp_tsk を実行した時に、起床要求キューイング数がマイナスになる代わりに、そのタスクが待ち状態になる。
tk_wup_tsk を1回キューイングすること(wupcnt＝1)は常に可能であるが、起床要求キューイング数(wupcnt)の最大値は実装依存であり、最大値はサービスプロファイル TK_WAKEUP_MAXCNT で規定される。すなわち、待ち状態でないタスクに対して
tk_wup_tsk を1回発行してもエラーとはならないが、2回目以降の tk_wup_tsk がエラーとなるかどうかは実装依存である。

μT-Kernel 3.0仕様書

85 / 487

起床要求キューイング数(wupcnt)の最大値の制限を越えて tk_wup_tsk を発行した場合には、E_QOVR のエラーとなる。

μT-Kernel 3.0仕様書

86 / 487

4.2.4 tk_can_wup - タスクの起床要求を無効化
C言語インタフェース#include <tk/tkernel.h>
INT wupcnt = tk_can_wup(ID tskid);
パラメータ
ID

tskid

Task ID

タスクID

Wakeup Count
Error Code

キューイングされていた起床要求回数
エラーコードリターンパラメータ
INT

wupcntまたは

エラーコード
E_ID
E_NOEXS
E_OBJ

不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが休止状態(DORMANT))

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
tskid で示されたタスクの起床要求キューイング数(wupcnt)をリターンパラメータとして返し、同時にその起床要求をすべてキャンセルする。すなわち、対象タスクの起床要求キューイング数(wupcnt)を0にする。
tskid＝TSK_SELF＝0によって自タスクの指定になる。ただし、タスク独立部から発行したシステムコールで tskid＝TSK_SELF＝0を指定した場合には、E_ID のエラーとなる。
補足事項
このシステムコールは、周期的にタスクを起床して動かすような処理を行う場合に、時間内に処理が終わっているかどうかを判定するために利用できる。すなわち、前の起床要求に対する処理が終了して tk_slp_tsk を発行する前に、それを監視するタ
スクが tk_can_wup を発行し、そのリターンパラメータである wupcnt が1以上の値であった場合、前の起床要求に対する処理が時間内に終了しなかったということを示す。したがって、処理の遅れに対して何らかの処置をとることができる。

μT-Kernel 3.0仕様書

87 / 487

4.2.5 tk_rel_wai - 他タスクの待ち状態解除
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_rel_wai(ID tskid);
パラメータ
ID

tskid

Task ID

タスクID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_OBJ

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが待ち状態ではない(自タスクや休止状態(DORMANT)の場合を含む))利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
なし
解説
tskid で示されるタスクが何らかの待ち状態(強制待ち状態(SUSPENDED)を除く)にある場合に、それを強制的に解除する。
tk_rel_wai により待ち状態が解除されたタスクに対しては、エラー E_RLWAI が返る。このとき、対象タスクは資源を確保せずに(待ち解除の条件が満たされないまま)待ち解除となることが保証される。
tk_rel_wai では、待ち状態解除要求のキューイングは行わない。すなわち、tskid で示される対象タスクが既に待ち状態であればその待ち状態を解除するが、対象タスクが待ち状態でなければ、発行元にエラー E_OBJ が返る。本システムコールで自タスクを指定した場合にも、同様に E_OBJ のエラーとなる。
tk_rel_wai では、強制待ち状態(SUSPENDED)の解除は行わない。二重待ち状態(WAITING-SUSPENDED)のタスクを対象として tk_rel_wai を発行すると、対象タスクは強制待ち状態(SUSPENDED)となる。強制待ち状態(SUSPENDED)も解除する必要がある場合には、別に tk_rsm_tsk または tk_frsm_tsk を発行する。
tk_rel_wai の対象タスクの状態と実行結果との関係についてまとめたものを 表 4.3. 「tk_rel_waiの対象タスクの状態と実
行結果 」 に示す。

μT-Kernel 3.0仕様書

88 / 487

対象タスク状態実行できる状態(RUNNING, READY)(自タスク以外)
実行状態(RUNNING)(自タスク)
待ち状態(WAITING)
強制待ち状態(SUSPENDED)
二重待ち状態(WAITING-SUSPENDED)
休止状態(DORMANT)
未登録状態(NON-EXISTENT)

tk_rel_wai の ercd
E_OBJ

処理
何もしない

E_OBJ
E_OK
E_OBJ
E_OK
E_OBJ
E_NOEXS

何もしない
待ち解除
何もしない
SUSPENDED状態に移行
何もしない
何もしない

表 4.3: tk_rel_waiの対象タスクの状態と実行結果
補足事項
アラームハンドラ等を用いて、あるタスクが待ち状態に入ってから一定時間後にこのシステムコールを発行することにより、タイムアウトに類似した機能を実現することができる。
tk_rel_wai と tk_wup_tsk とは次のような違いがある。
• tk_wup_tsk は tk_slp_tsk による待ち状態のみを解除するが、tk_rel_wai ではそれ以外の要因(tk_wai_flg, tk_wai_sem,
tk_rcv_mbx, tk_get_mpl, tk_dly_tsk 等) による待ち状態も解除する。
• 待 ち 状 態 に 入 っ て い た タ ス ク か ら 見 る と、tk_wup_tsk に よ る 待 ち 状 態 の 解 除 は 正 常 終 了 (E_OK) で あ る の に 対 して、tk_rel_wai による待ち状態の解除はエラー(E_RLWAI)である。
• tk_wup_tsk の場合は、対象タスクがまだ tk_slp_tsk を実行していなくても、要求がキューイングされる。一方、tk_rel_waiの場合は、対象タスクが既に待ち状態に無い場合には、E_OBJ のエラーとなる。

μT-Kernel 3.0仕様書

89 / 487

4.2.6 tk_sus_tsk - 他タスクを強制待ち状態へ移行
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_sus_tsk(ID tskid);
パラメータ
ID

tskid

Task ID

タスクID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_OBJ
E_CTX
E_QOVR

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが自タスクまたは休止状態(DORMANT))
ディスパッチ禁止状態で実行状態のタスクを指定した
キューイングまたはネストのオーバーフロー(ネスト数 suscnt のオーバーフロー)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

タスクの強制待ち要求の最大ネスト数 (>= 1)

解説tskid で示されたタスクを強制待ち状態(SUSPENDED)に移し、タスクの実行を中断させる。
強制待ち状態(SUSPENDED)は、tk_rsm_tsk, tk_frsm_tsk システムコールの発行によって解除される。
tk_sus_tsk の対象タスクが既に待ち状態であった場合には、tk_sus_tsk の実行により、対象タスクは待ち状態と強制待ち状態が複合した二重待ち状態(WAITING-SUSPENDED)となる。その後、このタスクの待ち解除の条件が満たされると、対象
タスクは強制待ち状態(SUSPENDED)に移行する。一方、このタスクに対して tk_rsm_tsk が発行されると、対象タスクは前と同じ待ち状態に戻る。(図 2.1. 「タスク状態遷移図」 を参照)
強制待ち状態(SUSPENDED)は他タスクの発行したシステムコールによる中断状態を意味するものなので、本システムコー
ルで自タスクを指定することはできない。自タスクを指定した場合には、E_OBJ のエラーとなる。
タスク独立部からの本システムコールの発行において、ディスパッチ禁止状態で実行状態(RUNNING)のタスクを指定した
場合は E_CTX のエラーとなる。

μT-Kernel 3.0仕様書

90 / 487あるタスクに対して複数回の tk_sus_tsk が発行された場合、そのタスクは多重の強制待ち状態(SUSPENDED)になる。これを強制待ち要求のネストと呼ぶ。この場合、tk_sus_tsk が発行された回数(suscnt)と同じ回数の tk_rsm_tsk を発行することにより、対象タスクが元の状態に戻る。したがって、tk_sus_tsk〜tk_rsm_tsk の対をネストすることが可能である。
強制待ち要求のネストの機能(同一タスクに対して2回以上の tk_sus_tsk を発行する機能)の有無およびその回数の上限値
は、実装依存である。
強制待ち要求をネストできないシステムで複数の tk_sus_tsk が発行された場合や、ネスト回数の制限値を越えた場合には、
E_QOVR のエラーとなる。
補足事項
あるタスクが資源獲得のための待ち状態(セマフォ待ちなど)で、かつ強制待ち状態(SUSPENDED)の場合でも、強制待ち状態(SUSPENDED)でない時と同じ条件によって資源の割当て(セマフォの割当てなど)が行われる。強制待ち状態(SUSPENDED)であっても、資源割当ての遅延などが行われるわけではなく、資源割当てや待ち状態の解除に関する条件や優先度は全く変わらない。すなわち、強制待ち状態(SUSPENDED)は、他の処理やタスク状態と直交関係にある。
強制待ち状態(SUSPENDED)のタスクに対して資源割当ての遅延(一時的な優先度の低下) を行いたいのであれば、ユー
ザ側で、tk_sus_tsk, tk_rsm_tsk に tk_chg_pri を組み合せて発行すれば良い。
タスク強制待ちは、デバッガのブレークポイント処理等のOSに密接に関連したごく一部でのみ使用することを原則とする。一
般のアプリケーションおよびミドルウェアでは原則として使用してはいけない。これは、次のような理由による。
タスク強制待ちは、対象のタスクの実行状態に関係なく行われる。例えば、タスクがあるミドルウェアの機能を呼び出しているとき、そのタスクを強制待ち状態にするとミドルウェアの内部でタスクが停止することになる。ミドルウェアでは、リソース管理な
どで排他制御等を行っている場合があり、あるタスクがミドルウェア内でリソースを獲得したまま停止してしまったことにより、他のタスクがそのミドルウェアを使用できなくなる状況が起きうる。このようにして連鎖的にタスクが停止してしまい、システム全
体が停止(デッドロック)することもありうる。
このように、タスクの状態(何を実行中か)が不明な状況で、そのタスクを停止させることはできない。したがって、一般にタスク
強制待ちは使用してはならない。

μT-Kernel 3.0仕様書

91 / 487

4.2.7 tk_rsm_tsk - 強制待ち状態のタスクを再開
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_rsm_tsk(ID tskid);
パラメータ
ID

tskid

Task ID

タスクID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_OBJ

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが強制待ち状態(SUSPENDED)ではない(自タスクや休止状態(DORMANT)の場合を含む))

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
tskid で示されたタスクの強制待ち状態(SUSPENDED)を解除する。すなわち、対象タスクが以前に発行された tk_sus_tsk
によって強制待ち状態(SUSPENDED)に入り、その実行が中断している場合に、その状態を解除し、実行を再開させる。
対象タスクが待ち状態(WAITING)と強制待ち状態(SUSPENDED)の複合した二重待ち状態(WAITING-SUSPENDED)であった場合には、tk_rsm_tsk の実行により強制待ち状態(SUSPENDED)のみが解除され、対象タスクは待ち状態となる。
([図 2.1. 「タスク状態遷移図」]を参照)
本システムコールでは、自タスクを指定することはできない。自タスクを指定した場合には、E_OBJ のエラーとなる。
tk_rsm_tsk では、強制待ち要求のネスト(suscnt)を1回分だけ解除する。したがって、対象タスクに対して2回以上のtk_sus_tsk が発行されていた場合(suscnt≧2)には、tk_rsm_tsk の実行が終わった後も、対象タスクはまだ強制待ち状態(SUSPENDED)のままである。

μT-Kernel 3.0仕様書

92 / 487

補足事項
実行状態(RUNNING)もしくは実行可能状態(READY)のタスクが tk_sus_tsk により強制待ち状態(SUSPENDED)になった後、tk_rsm_tsk や tk_frsm_tsk によって実行を再開した場合、そのタスクは同じ優先度を持つタスクの中で最低の優先順位となる。
たとえば、同じ優先度のtask_Aとtask_Bに対して以下のシステムコールを実行した場合、次のような動作をする。
tk_sta_tsk ( tskid＝task_A , stacd_A );tk_sta_tsk ( tskid＝task_B , stacd_B );/* この時はFCFSの原則により、優先順位はtask_A→task_Bとなっている */tk_sus_tsk ( tskid＝task_A );tk_rsm_tsk ( tskid＝task_A );/* この時に優先順位はtask_B→task_Aとなる */μT-Kernel 3.0仕様書

93 / 487

4.2.8 tk_frsm_tsk - 強制待ち状態のタスクを強制再開
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_frsm_tsk(ID tskid);
パラメータ
ID

tskid

Task ID

タスクID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_OBJ

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが強制待ち状態(SUSPENDED)ではない(自タスクや休止状態(DORMANT)の場合を含む))

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
tskid で示されたタスクの強制待ち状態(SUSPENDED)を解除する。すなわち、対象タスクが以前に発行された tk_sus_tsk
によって強制待ち状態(SUSPENDED)に入り、その実行が中断している場合に、その状態を解除し、実行を再開させる。
対象タスクが待ち状態(WAITING)と強制待ち状態(SUSPENDED)の複合した二重待ち状態(WAITING-SUSPENDED)であった場合には、tk_frsm_tsk の実行により強制待ち状態(SUSPENDED)のみが解除され、対象タスクは待ち状態となる。([図 2.1. 「タスク状態遷移図」]を参照)
本システムコールでは、自タスクを指定することはできない。自タスクを指定した場合には、E_OBJ のエラーとなる。
tk_frsm_tsk では、強制待ち要求のネスト(suscnt)をすべて解除(suscnt＝0)する。したがって、対象タスクに対して2回以上の tk_sus_tsk が発行されていた場合(suscnt≧2)でも、それらの要求をすべて解除(suscnt＝0)する。すなわち、強制待ち状態(SUSPENDED)は必ず解除され、対象タスクが二重待ち状態(WAITING-SUSPENDED)でない限り実行を再開できる。

μT-Kernel 3.0仕様書

94 / 487

補足事項
実行状態(RUNNING)もしくは実行可能状態(READY)のタスクが tk_sus_tsk により強制待ち状態(SUSPENDED)になった後、tk_rsm_tsk や tk_frsm_tsk によって実行を再開した場合、そのタスクは同じ優先度を持つタスクの中で最低の優先順位となる。
たとえば、同じ優先度のtask_Aとtask_Bに対して以下のシステムコールを実行した場合、次のような動作をする。
tk_sta_tsk ( tskid＝task_A , stacd_A );tk_sta_tsk ( tskid＝task_B , stacd_B );/* この時はFCFSの原則により、優先順位はtask_A→task_Bとなっている */tk_sus_tsk ( tskid＝task_A );tk_frsm_tsk ( tskid＝task_A );/* この時に優先順位はtask_B→task_Aとなる */μT-Kernel 3.0仕様書

95 / 487

4.2.9 tk_dly_tsk - タスク遅延
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_dly_tsk(RELTIM dlytim);
パラメータ
RELTIM

dlytimDelay Time

遅延時間(ミリ秒)

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_PAR
E_CTX
E_RLWAIE_DISWAI

正常終了
パラメータエラー(dlytim が不正)
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
自タスクの実行を一時的に停止し、時間経過待ちの状態に入る。タスクの実行を停止する時間は、dlytim により指定される。
時間経過待ちの状態は待ち状態の一つであり、tk_rel_wai により時間経過待ちを解除することができる。
このシステムコールを発行したタスクが強制待ち状態(SUSPENDED)または二重待ち状態(WAITING-SUSPENDED)になっている間も、時間経過のカウントは行われる。
dlytim の基準時間(時間の単位)はシステム時刻の基準時間(＝1ミリ秒)と同じである。
補足事項
このシステムコールは、tk_slp_tsk とは異なり、遅延時間として指定された時間が経過した場合に正常終了となる。また、
遅延時間中に tk_wup_tsk が実行されても、待ち解除とはならない。遅延時間が経過する前に tk_dly_tsk が終了するのは、tk_ter_tsk や tk_rel_wai が発行された場合に限られる。

μT-Kernel 3.0仕様書

96 / 487

4.2.10 tk_dly_tsk_u - タスク遅延(マイクロ秒単位)
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_dly_tsk_u(RELTIM_U dlytim_u);
パラメータ
RELTIM_U

dlytim_u

Delay Time

遅延時間(マイクロ秒)

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコード
E_OK
E_PAR
E_CTX
E_RLWAIE_DISWAI

正常終了
パラメータエラー(dlytim_u が不正)
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

マイクロ秒のサポート

解説
tk_dly_tsk のパラメータである dlytim を64ビットマイクロ秒単位の dlytim_u としたシステムコールである。
パラメータが dlytim_u となった点を除き、本システムコールの仕様は tk_dly_tsk と同じである。詳細は tk_dly_tsk の説明を参照のこと。

μT-Kernel 3.0仕様書

97 / 487

4.2.11 tk_sig_tev - タスクイベントの送信
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_sig_tev(ID tskid, INT tskevt);
パラメータ
ID
INT

tskid
tskevtTask ID
Task Event

タスクID
タスクイベント番号(1〜8)Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_OBJ
E_PAR

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが休止状態(DORMANT))
パラメータエラー(tskevt が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

タスクイベント関連機能のサポート

解説
tskid のタスクへ tskevt で指定したタスクイベントを送信する。
タスクイベントは、タスクごとに保持される8種類のイベントであり、1〜8の番号で指定する。
タスクイベントの発生回数は保持されず、発生の有無のみが保持される。
tskid＝TSK_SELF＝0によって自タスクの指定になる。ただし、タスク独立部から発行したシステムコールで tskid＝TSK_SELF＝0を指定した場合には、E_ID のエラーとなる。
補足事項
タスクイベントは、tk_slp_tsk〜tk_wup_tsk と同様のタスク付属の同期機能であるが、次の点が異なる。

μT-Kernel 3.0仕様書

98 / 487• 起床要求(タスクイベント)の回数は保持されない。
• 8種類のイベントタイプで起床要求を分類できる。
同一タスクにおいて、同じイベントタイプを使用して2ヵ所以上で同期を行うと混乱することになる。イベントタイプの割当ては明確に行うべきである。
タスクイベントは、ミドルウェアでの利用を前提とし、アプリケーションでは原則として使用しない。アプリケーションでは、tk_slp_tsk〜tk_wup_tsk の利用を推奨する。

μT-Kernel 3.0仕様書

99 / 487

4.2.12 tk_wai_tev - タスクイベント待ち
C言語インタフェース#include <tk/tkernel.h>
INT tevptn = tk_wai_tev(UINT waiptn, TMO tmout);
パラメータ
UINT
TMO

waiptntmout

Wait Event Pattern
Timeout

待ちタスクイベントのパターン
タイムアウト指定(ミリ秒)Task Event Pattern
Error Code

待ち解除時のタスクイベント発生状況
エラーコードリターンパラメータ
INT

tevptnまたは

エラーコード
E_PAR
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

パラメータエラー(waiptn, tmout が不正)待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

タスクイベント関連機能のサポート

解説
waiptn で指定したタスクイベントのいずれかが発生するまで待つ。タスクイベントの発生で待ちが解除された場合、waiptnで指定したタスクイベントはクリア(発生中のタスクイベント &= ~waiptn)される。また、戻値(tevptn)に待ちが解除された時に発生していたタスクイベントの状態(クリア前の状態)を返す。
waiptn および tevptn は、各タスクイベントを1<<(タスクイベント番号-1)のビット値として論理和(OR)した値である。
tmout により待ち時間の最大値(タイムアウト値)を指定することができる。tmout の基準時間(時間の単位)はシステム時刻の基準時間(＝1ミリ秒)と同じである。待ち解除の条件が満足されない(tk_sig_tev が実行されない)まま tmout の時間が経過すると、タイムアウトエラー E_TMOUT となってシステムコールが終了する。
tmout として TMO_POL＝0を指定した場合は、タイムアウト値として0を指定したことを示し、タスクイベントが発生していなくても待ちに入らず E_TMOUT を返す。また、tmout として TMO_FEVR＝(-1)を指定した場合は、タイムアウト値として無限大の時

μT-Kernel 3.0仕様書

間を指定したことを示し、タイムアウトせずにタスクイベントが発生するまで待ち続ける。

100 / 487

μT-Kernel 3.0仕様書

101 / 487

4.2.13 tk_wai_tev_u - タスクイベント待ち(マイクロ秒単位)
C言語インタフェース#include <tk/tkernel.h>
INT tevptn = tk_wai_tev_u(UINT waiptn, TMO_U tmout_u);
パラメータ
UINT
TMO_U

waiptntmout_u

Wait Event Pattern
Timeout

待ちタスクイベントのパターン
タイムアウト指定(マイクロ秒)

Task Event Pattern
Error Code

待ち解除時のタスクイベント発生状況
エラーコードリターンパラメータ
INT

tevptnまたは

エラーコード
E_PAR
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

パラメータエラー(waiptn, tmout_u が不正)待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

タスクイベント関連機能のサポート
マイクロ秒のサポート

解説
tk_wai_tev のパラメータである tmout を64ビットマイクロ秒単位の tmout_u としたシステムコールである。
パラメータが tmout_u となった点を除き、本システムコールの仕様は tk_wai_tev と同じである。詳細は tk_wai_tev の説明を参照のこと。

μT-Kernel 3.0仕様書

102 / 487

4.2.14 tk_dis_wai - タスク待ち状態の禁止
C言語インタフェース#include <tk/tkernel.h>
INT tskwait = tk_dis_wai(ID tskid, UW waitmask);
パラメータ
ID
UW

tskid
waitmask

Task ID
Wait Mask

タスクID
タスク待ち禁止設定

Task Wait
Error Code

タスク待ち禁止後のタスク待ち状態
エラーコードリターンパラメータ
INTtskwaitまたは

エラーコード
E_ID
E_NOEXS
E_PAR

不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
パラメータエラー(waitmask が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

タスクの待ち禁止状態のサポート

解説
tskid のタスクに対して、waitmask で指定した待ち要因による待ちに入ることを禁止する。タスクがすでに waitmask で指定した待ち要因の待ちに入っている場合は、その待ちを解除する。
waitmask には、以下の待ち要因を任意に組み合わせて論理和(OR)で指定する。
# define# define# define# define# define# define# define# define# define

TTW_SLPTTW_DLY
TTW_SEM
TTW_FLG
TTW_MBX
TTW_MTX
TTW_SMBF
TTW_RMBF
TTW_CAL

0 x00000001
0 x00000002
0 x00000004
0 x00000008
0 x00000040
0 x00000080
0 x00000100
0 x00000200
0 x00000400/* 起床待ちによる待ち *//* タスクの遅延による待ち *//* セマフォ待ち *//* イベントフラグ待ち *//* メールボックス待ち *//* ミューテックス待ち *//* メッセージバッファ送信待ち *//* メッセージバッファ受信待ち *//* (予約) */μT-Kernel 3.0仕様書# define# define# define# define# define# define# define# define# define# define# define# define# define

TTW_ACP
TTW_RDVTTW_MPF
TTW_MPL
TTW_EV1TTW_EV2TTW_EV3
TTW_EV4TTW_EV5
TTW_EV6TTW_EV7
TTW_EV8
TTX_SVC

103 / 487

0 x00000800
0 x00001000
0 x00002000
0 x00004000
0 x00010000
0 x00020000
0 x00040000
0 x00080000
0 x00100000
0 x00200000
0 x00400000
0 x00800000
0 x80000000/* (予約) *//* (予約) *//* 固定長メモリプール待ち *//* 可変長メモリプール待ち *//* タスクイベント＃１待ち *//* タスクイベント＃２待ち *//* タスクイベント＃３待ち *//* タスクイベント＃４待ち *//* タスクイベント＃５待ち *//* タスクイベント＃６待ち *//* タスクイベント＃７待ち *//* タスクイベント＃８待ち *//* 拡張SVC呼出禁止 */TTX_SVC はタスクの待ちではないが、拡張SVCの呼出を禁止する特殊な指定となる。TTX_SVC が指定されている場合、そのタ
スクが拡張SVCを呼び出そうとすると、拡張SVCを呼び出さずに E_DISWAI を返す。すでに呼び出している拡張SVCを終了させるような効果はない。
戻値(tskwait)には、tk_dis_wai によって待ち禁止処理が行われた後のタスクの待ち状態を(INT型のビット幅 - 1)個分のビットパターンで返す。INT型のビット幅が32ビットの場合、この値は tk_ref_tsk の tskwait と同じ値となる。なお、tskwaitには TTX_SVC に関する情報は返されない。tskwait が0であれば、タスクは待ち状態に入っていない(または待ちが解除された)ことを示す。tskwait が0でなければ、waitmask に指定した以外の要因で待っていることになる。INT型のビット幅が32ビ
ットより小さい場合、ビット幅に入りきらない上位ビット分の情報は返されない。そのため、tskwait が0であっても、タスクがwaitmask に指定した以外の要因で待っている可能性がある。
タスクの待ちが tk_dis_wai により解除された場合、または待ち禁止状態で新たに待ちに入ろうとした場合は、E_DISWAI が返される。
待ち禁止状態でその待ちに入る可能性があるシステムコールを呼び出したとき、待ちに入らずに処理できる場合であってもE_DISWAI が返される。例えば、メッセージバッファに空きがあり、待ちに入ることなく送信できるような状況で、メッセージバ
ッファへ送信(tk_snd_mbf)を行った場合も、メッセージの送信は行われずに E_DISWAI が返される。
拡張SVCの実行中に設定された待ち禁止は、拡張SVCから呼出元に戻る際に自動的に解除される。また、拡張SVCを呼び出した時も自動的に解除され、拡張SVCから戻ってきたときに元の設定に復帰する。
タスクが休止状態(DORMANT)に戻るときにも、自動的に解除される。ただし、休止状態(DORMANT)であるときの設定は有効であり、次にタスクが起動したときはその待ち禁止が適用される。
セマフォなど主なオブジェクトでは、オブジェクト生成時に TA_NODISWAI を指定することができる。TA_NODISWAI を指定して生成されたオブジェクトでは、tk_dis_wai による待ち禁止は拒否され、待ちは禁止されない。
tskid＝TSK_SELF＝0によって自タスクの指定になる。ただし、タスク独立部から発行したシステムコールで tskid＝TSK_SELF＝0を指定した場合には、E_ID のエラーとなる。
補足事項
待ち禁止機能は、拡張SVCの処理を途中で中止したい場合に使用することを想定した機能である。ただし、その用途に限定されるものではない。
移植ガイドライン
tk_dis_wai の戻値(tskwait)がINT型であり、処理系によってとれる値の範囲に異なる可能性があるため注意が必要である。例えば、16ビット環境ではタスクイベントの待ちに関する情報をすべては取得できない。μT-Kernelでプロセッサのビット幅に関係なくタスク待ち状態を取得するには、tk_ref_tsk の tskwait を参照する必要がある。なお、T-KernelではINT型のビ
ット幅が32ビット以上であると定義されているので、tk_dis_wai の戻値でタスクの待ち状態をすべて取得できる。

μT-Kernel 3.0仕様書

104 / 487

4.2.15 tk_ena_wai - タスク待ち禁止の解除
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ena_wai(ID tskid);
パラメータ
ID

tskid

Task ID

タスクID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

タスクの待ち禁止状態のサポート

解説
tskid のタスクに tk_dis_wai によって設定された待ち禁止をすべて解除する。
tskid＝TSK_SELF＝0によって自タスクの指定になる。ただし、タスク独立部から発行したシステムコールで tskid＝TSK_SELF＝0を指定した場合には、E_ID のエラーとなる。

μT-Kernel 3.0仕様書

105 / 487

4.3 タスク例外処理機能
タスク例外処理機能は、タスクに発生した例外事象に対する処理を、タスクのコンテキストで行うための機能である。
タスク例外ハンドラが起動されるのは、次の条件がすべて揃った時である。
1. tk_def_tex によるタスク例外ハンドラの登録
2. tk_ena_tex によるタスク例外の許可
3. tk_ras_tex によるタスク例外の発生
タスク例外ハンドラは、タスク例外が発生したタスクのコンテキストで、かつタスク生成時に指定した保護レベルで、そのタスクの一部として実行される。また、タスク例外ハンドラ内では、タスク例外に関する状態を除き、通常のタスク部の実行中と同じ状態であり、使用できるシステムコールも同等である。
タスク例外ハンドラは、対象タスクがタスク部を実行しているときにのみ起動される。対象タスクがタスク部以外を実行中のときにタスク例外が発生した場合は、タスク部に戻ってからタスク例外ハンドラが起動される。準タスク部(拡張SVC)を実行中にタスク例外が発生した場合は、拡張SVCの処理が中止されタスク部へ戻ってくる。その際、拡張SVCを中止するために必要な処理(拡張SVCに対する「ブレーク処理」と呼ぶ)があれば、それを実行してから、拡張SVCの要求元のタスクに戻る。ブレーク
処理は、サブシステム管理機能のブレーク関数によって実行される。
発生したタスク例外要求は、タスク例外ハンドラが呼び出された(タスク例外ハンドラが実行を開始した)時点でクリアされる。
タスク例外は、0〜(UINT型のビット幅 - 1)のタスク例外コードにより指定される。例えば、UINTが16ビットの環境では、0〜15の例外コードが利用可能である。このうち、0が最も優先度が高く(UINT型のビット幅 - 1)が低い。また、タスク例外コード0は特殊な扱いとなる。
タスク例外コード1〜(UINT型のビット幅 - 1)の動作:• タスク例外ハンドラはネストして実行されない。タスク例外ハンドラの実行中に発生したタスク例外はペンディングされる。(タスク例外コード0の場合を除く)• タスク例外ハンドラからリターンすることで、タスク例外によって割り込まれた位置に復帰する。
• タスク例外ハンドラからリターンせずに、longjmp() などによりタスク内の任意の位置にジャンプすることもできる。
タスク例外コード0の動作:• タスク例外コード1〜(UINT型のビット幅 - 1)のタスク例外ハンドラを実行中でもネストして実行される。タスク例外コード0のタスク例外ハンドラの実行中はネストされない。
• ユーザスタックポインタをタスク起動時の初期値に設定してから、タスク例外ハンドラが実行される。ただし、ユーザス
タックとシステムスタックが分離されていないシステムでは、スタックポインタは初期値に戻されない。
• タスク例外ハンドラから復帰することは出来ない。必ず tk_ext_tsk または tk_exd_tsk によってタスクを終了しなければならない。
移植ガイドライン
利用可能なタスク例外コードはUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではタスク例
外コードの範囲が0〜15に限られる。

μT-Kernel 3.0仕様書

106 / 487

4.3.1 tk_def_tex - タスク例外ハンドラの定義
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_def_tex(ID tskid, CONST T_DTEX *pk_dtex);
パラメータ
ID
CONST T_DTEX*

tskid
pk_dtex

Task ID
Packet to Define Task
Exception

タスクID
タスク例外ハンドラ定義情報

pk_dtex の内容
ATR
texatrTask Exception AttributeFP
texhdrTask Exception Handler──(以下に実装独自に他の情報を追加してもよい)──

タスク例外ハンドラ属性
タスク例外ハンドラアドレス

リターンパラメータER

ercd

Error Code

エラーコードエラーコード
E_OK
E_NOMEM
E_ID
E_NOEXS
E_OBJ
E_RSATR
E_PAR

正常終了
メモリ不足(管理ブロック用の領域が確保できない)
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(tskid のタスクは TA_RNG0 属性)
予約属性(texatr が不正あるいは利用できない)パラメータエラー(pk_dtex が不正あるいは利用できない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

タスク例外処理機能のサポート

解説
tskid で指定したタスクに対するタスク例外ハンドラを定義する。タスク例外ハンドラはタスクに対して1つのみ定義可能で、すでに定義されていた場合は、後から定義した関数が有効となる。pk_dtex＝NULL の時は定義を解除する。

μT-Kernel 3.0仕様書

107 / 487

タスク例外ハンドラを定義または解除すると、ペンディングされているタスク例外要求はクリアされ、すべてのタスク例外は禁止状態となる。
texatr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。texatr のシステム属性には、現在のバージョンでは割当てがなく、システム属性は使われていない。
タスク例外ハンドラは、下記のような形式になる。
void texhdr ( INT texcd ){/*タスク例外の処理*//* タスク例外ハンドラの終了 */if ( texcd == 0 ) {tk_ext_tsk () または tk_exd_tsk () ;} else {tk_end_tex () ;return または longjmp () ;}}タスク例外ハンドラは、TA_ASM 属性相当のみで高級言語対応ルーチンを経由しての呼出は行われない。したがって、タスク例
外ハンドラのエントリー部分はアセンブリ言語で作成する必要がある。カーネル提供者は、上記のC言語のタスク例外ハンドラを呼び出すためのエントリールーチンのアセンブリ言語のソースコードを提供しなければならない。つまり、高級言語対応ルーチンに相当するソースコードを提供しなければならない。
タスク生成時の保護レベルが TA_RNG0 のタスクに対して、タスク例外を使用することはできない。
補足事項
タスク生成時にはタスク例外ハンドラは定義されておらず、タスク例外も禁止されている。
タスクが休止状態(DORMANT)に戻る時には自動的にタスク例外ハンドラは解除され、タスク例外は禁止される。また、ペンディングされていたタスク例外はクリアされる。ただし、休止状態(DORMANT)であるときに、タスク例外ハンドラを定義することはできる。
タスク例外は、tk_ras_tex によって発生するソフトウェア的なもので、CPUの例外と直接の関連はない。

μT-Kernel 3.0仕様書

108 / 487

4.3.2 tk_ena_tex - タスク例外の許可
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ena_tex(ID tskid, UINT texptn);
パラメータ
ID
UINT

tskid
texptn

Task ID
Task Exception Pattern

タスクID
タスク例外パターン

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない、タスク例外ハンドラが定義されていない)パラメータエラー(texptn が不正あるいは利用できない)

E_PAR
利用可能なコンテキスト

タスク部
○

準タスク部
○

タスク独立部×

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

タスク例外処理機能のサポート

解説
tskid のタスクへのタスク例外の発生を許可する。
texptn は、タスク例外コードを1<<タスク例外コードのビット値として、論理和(OR)した値である。
tk_ena_tex は、texptn で指定したタスク例外を許可する。 現在のタスク例外の許可状態を texmask とすると次のようになる。
許可：texmask |= texptn
texptn の全ビットを0とした場合は、texmask に対して何の操作も行わないことになる。ただし、この場合でもエラーとはならない。
タスク例外ハンドラが定義されていないタスクのタスク例外を許可することはできない。
休止状態(DORMANT)のタスクに対しても適用される。

μT-Kernel 3.0仕様書

109 / 487

移植ガイドライン
指定可能なタスク例外コードはUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではタスク例外
コードが0〜15に限られる。

μT-Kernel 3.0仕様書

110 / 487

4.3.3 tk_dis_tex - タスク例外の禁止
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_dis_tex(ID tskid, UINT texptn);
パラメータ
ID
UINT

tskid
texptn

Task ID
Task Exception Pattern

タスクID
タスク例外パターン

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない、タスク例外ハンドラが定義されていない)パラメータエラー(texptn が不正あるいは利用できない)

E_PAR
利用可能なコンテキスト

タスク部
○

準タスク部
○

タスク独立部×

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

タスク例外処理機能のサポート

解説
tskid のタスクへのタスク例外の発生を禁止する。
texptn は、タスク例外コードを1<<タスク例外コードのビット値として、論理和(OR)した値である。
tk_dis_tex は、texptn で指定したタスク例外を禁止する。現在のタスク例外の許可状態を texmask とすると次のようになる。
禁止：texmask &= ~texptn
texptn の全ビットを0とした場合は、texmask に対して何の操作も行わないことになる。ただし、この場合でもエラーとはならない。
禁止されているタスク例外は無視され、ペンディングもされない。ペンディングされているタスク例外がある状態で、そのタスク例外が禁止された場合は、タスク例外要求が捨てられる(ペンディング状態がクリアされる)。
休止状態(DORMANT)のタスクに対しても適用される。

μT-Kernel 3.0仕様書

111 / 487

移植ガイドライン
指定可能なタスク例外コードはUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではタスク例外
コードが0〜15に限られる。

μT-Kernel 3.0仕様書

112 / 487

4.3.4 tk_ras_tex - タスク例外を発生
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ras_tex(ID tskid, INT texcd);
パラメータ
ID
INT

tskid
texcd

Task ID
Task Exception Code

タスクID
タスク例外コード

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない、タスク例外ハンドラが定義されていない)
オブジェクトの状態が不正(tskid のタスクは休止状態(DORMANT))
パラメータエラー(texcd が不正あるいは利用できない)
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)

E_OBJ
E_PAR
E_CTX
利用可能なコンテキスト

タスク部
○

準タスク部
○

タスク独立部×

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

タスク例外処理機能のサポート

解説
tskid のタスクに対して texcd のタスク例外を発生させる。ただし、tskid のタスクにおいて texcd のタスク例外が許可されていない場合は、発生させたタスク例外は無視され、ペンディングもされない。この場合でも、本システムコールには E_OK が返される。
tskid のタスクがタスク例外ハンドラの実行中であれば、タスク例外はペンディングされる。ペンディングされる場合、対象タスクが拡張SVCの実行中であっても、その拡張SVCに対するブレーク処理(ブレーク関数)は実行されない。
ただし、texcd＝0の場合は、対象タスクが例外ハンドラを実行中であってもペンディングされない。対象タスクが、タスク例外コード1〜(UINT型のビット幅 - 1)の例外に対するタスク例外ハンドラの実行中であればタスク例外は受け付けられ、拡張SVC
実行中であれば、その拡張SVCに対するブレーク処理(ブレーク関数)が実行される。対象タスクが、タスク例外コード0の例外
に対するタスク例外ハンドラを実行中の場合は、タスク例外の発生は無視される。

μT-Kernel 3.0仕様書

113 / 487

tskid＝TSK_SELF＝0によって自タスクの指定を行うことができる。
タスク独立部から発行することはできない。(E_CTX)
補足事項
対象タスクが拡張SVCを実行中の場合には、その拡張SVCに対応するブレーク処理(ブレーク関数)が、tk_ras_tex の発行タ
スクの準タスク部として実行される。すなわち、ブレーク処理の実行されるコンテキストは、tk_ras_tex の発行タスクを要求タ
スクとする準タスク部である。
したがって、このような場合、ブレーク処理の実行が終わるまで tk_ras_tex から戻ってこない。このため、タスク独立部から
tk_ras_tex を発行することはできない仕様になっている。
また、ブレーク処理実行中に tk_ras_tex を呼び出したタスクに発生したタスク例外は、ブレーク処理(ブレーク関数)の終了まで保留される。
移植ガイドライン
指定可能なタスク例外コードはUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではタスク例外
コードが0〜15に限られる。

μT-Kernel 3.0仕様書

114 / 487

4.3.5 tk_end_tex - タスク例外ハンドラの終了
C言語インタフェース#include <tk/tkernel.h>
INT texcd = tk_end_tex(BOOL enatex);
パラメータ
BOOL

enatex

Enable Task Exception

タスク例外ハンドラ呼出の許可

Task Exception CodeError Code

発生している例外コード
エラーコードリターンパラメータ
INT

texcd
または

エラーコードE_CTX

コンテキストエラー(タスク例外ハンドラ以外またはタスク例外コード0(検出は実装依存))

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

タスク例外処理機能のサポート

解説
タスク例外ハンドラを終了し、新たなタスク例外ハンドラの呼出を許可する。ペンディングされているタスク例外がある場合は、その内の最も優先度の高いタスク例外コードを戻値に返す。ペンディングされているタスク例外がなければ0を返す。
enatex＝FALSE の場合、ペンディングされているタスク例外があると新たなタスク例外ハンドラの呼出は許可されない。この場合、tk_end_tex から戻った時点で、戻値に返された texcd の例外ハンドラを実行している状態になっている。ペンディングされているタスク例外がない場合は新たなタスク例外ハンドラの呼出が許可される。
enatex＝TRUE の場合は、ペンディングされているタスク例外の有無に関係なく、新たなタスク例外ハンドラの呼出を許可する。ペンディングされているタスク例外があっても、タスク例外ハンドラを終了した状態になる。
タスク例外ハンドラの終了は tk_end_tex を呼び出すこと以外にはない。タスク例外ハンドラが起動されてから tk_end_texを呼び出すまでがタスク例外ハンドラの実行中となる。tk_end_tex を呼び出さずにタスク例外ハンドラからリターンしたとしても、リターン先はまだタスク例外ハンドラの実行中となる。同様に、tk_end_tex を呼び出さずに longjmp によりタスク例外ハン
ドラから抜けたとしても、そのジャンプ先はタスク例外ハンドラの実行中である。
タスク例外がペンディングされている状態で tk_end_tex を呼び出すことにより、ペンディングされていたタスク例外が新たに受け付けられる。この時、tk_end_tex を拡張SVCハンドラ内から呼び出した場合でも、tk_end_tex を呼び出した拡張SVCハμT-Kernel 3.0仕様書

115 / 487

ンドラに対するブレーク処理(ブレーク関数)は実行されない。拡張SVCをネストして呼び出していた場合は、拡張SVCのネストが１段浅くなるときに戻先の拡張SVCに対応するブレーク処理(ブレーク関数)が実行される。タスク例外ハンドラが呼び出されるのは、タスク部に戻ってからとなる。
タスク例外コード0の場合、タスク例外ハンドラを終了することはできないため、tk_end_tex を発行することはできない。必ず
tk_ext_tsk または tk_exd_tsk でタスクを終了しなければならない。タスク例外コード0を処理中に tk_end_tex を発行した場合の動作は不定(実装依存)である。
タスク例外ハンドラ以外から発行することはできない。タスク例外ハンドラ以外から発行した場合の動作は不定(実装依存)である。
補足事項
tk_end_tex(TRUE) とすると、ペンディングされたタスク例外がある場合、tk_end_tex の直後にさらにタスク例外ハンドラが呼び出されることになる。そのため、スタックが戻されないままにタスク例外ハンドラが呼び出されることとなり、スタックオーバー
フローの可能性がある。
通常は tk_end_tex(FALSE)を利用し、次のようにタスク例外が残っている間繰り返し処理するようにするとよい。
void texhdr ( INT texcd ){if ( texcd == 0 ){/*タスク例外0用の処理*/
tk_exd_tsk () ;
}
do {
/*
タスク例外1〜( UINT型のビット幅 - 1)用の処理*/} while ( ( texcd = tk_end_tex ( FALSE )) > 0 );}厳密には、tk_end_tex で0が返されループを終了してから texhdr を抜けるまでの間にタスク例外が発生した場合には、スタックが戻されずに texhdr に再入する可能性はある。しかし、タスク例外はソフトウェア的なものであり、タスクの実行と無関係に発生することは通常ないため、実用上は問題ないと思われる。
移植ガイドライン
指定可能なタスク例外コードはUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではタスク例外
コードが0〜15に限られる。

μT-Kernel 3.0仕様書

116 / 487

4.3.6 tk_ref_tex - タスク例外の状態参照
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_tex(ID tskid, T_RTEX *pk_rtex);
パラメータ
ID
T_RTEX*

tskid
pk_rtex

Task ID
Packet to Refer Task
Exception Status

タスクID
タスク例外状態を返す領域へのポインタ

ercd

Error Code

エラーコードリターンパラメータ
ER
pk_rtex の内容
UINT
pendtexPending Task Exception
UINT
texmask
Task Exception Mask
──(以下に実装独自に他の情報を追加してもよい)──

発生しているタスク例外
許可されているタスク例外

エラーコード
正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
パラメータエラー(pk_rtex が不正)

E_OK
E_ID
E_NOEXS
E_PAR
利用可能なコンテキスト

タスク部
○

準タスク部
○

タスク独立部×

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

タスク例外処理機能のサポート

解説
tskid で示された対象タスクのタスク例外の状態を参照する。
pendtex は現在発生しているタスク例外を示す。タスク例外の発生からタスク例外ハンドラが呼び出されるまでの間、pendtexに示される。
texmask は許可されているタスク例外を示す。

μT-Kernel 3.0仕様書

117 / 487

pendtex, texmask とも、1<<タスク例外コードのビット値として表した値である。
tskid＝TSK_SELF＝0によって自タスクの指定を行うことができる。ただし、タスク独立部から発行したシステムコールでtskid＝TSK_SELF＝0を指定した場合には、E_ID のエラーとなる。

μT-Kernel 3.0仕様書

118 / 487

4.4 同期・通信機能
同期・通信機能は、タスクとは独立したオブジェクトにより、タスク間の同期・通信を行うための機能である。セマフォ、イベント
フラグ、メールボックスの各機能が含まれる。

μT-Kernel 3.0仕様書

119 / 487

4.4.1 セマフォ
セマフォは、使用されていない資源の有無や数量を数値で表現することにより、その資源を使用する際の排他制御や同期を行うためのオブジェクトである。セマフォ機能には、セマフォを生成／削除する機能、セマフォの資源を獲得／返却する機能、
セマフォの状態を参照する機能が含まれる。セマフォはID番号で識別されるオブジェクトである。セマフォのID番号をセマフォ
IDと呼ぶ。
セマフォは、対応する資源の有無や数量を表現するセマフォ資源数(セマフォカウント値)と、資源の獲得を待つタスクの待ち行列を持つ。資源をm個返却する側(イベントを知らせる側)では、セマフォの資源数をm個増やす。一方、資源をn個獲得する側(イベントを待つ側)では、セマフォの資源数をn個減らす。セマフォの資源数が足りなくなった場合(具体的には、資源数を減らすと資源数が負になる場合)、資源を獲得しようとしたタスクは、次に資源が返却されるまでセマフォ資源の獲得待ち状態となる。セマフォ資源の獲得待ち状態になったタスクは、そのセマフォの待ち行列につながれる。
また、セマフォに対して資源が返却され過ぎるのを防ぐために、セマフォ毎にセマフォ資源数の最大値を設定することができる。最大資源数を越える資源がセマフォに返却されようとした場合(具体的には、セマフォの資源数を増やすと最大資源数を超える場合)には、エラーを報告する。

μT-Kernel 3.0仕様書

4.4.1.1

120 / 487

tk_cre_sem - セマフォ生成

C言語インタフェース#include <tk/tkernel.h>
ID semid = tk_cre_sem(CONST T_CSEM *pk_csem);
パラメータ
CONST T_CSEM*

pk_csem

Packet to Create
Semaphore

セマフォ生成情報

pk_csem の内容
void*
ATR
INT
INT

exinf
sematrisemcnt
maxsemExtended Information
Semaphore Attribute
Initial Semaphore Count
Maximum SemaphoreCount
UB
dsname[8]DS Object name──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
セマフォ属性セマフォ資源数の初期値
セマフォ資源数の最大値
DSオブジェクト名称

リターンパラメータ
ID

semid
または

Semaphore ID
Error Code

セマフォID
エラーコードエラーコードE_NOMEM
E_LIMITE_RSATR
E_PAR

メモリ不足(管理ブロック用の領域が確保できない)
セマフォの数がシステムの上限を超えた
予約属性(sematr が不正あるいは利用できない)パラメータエラー(pk_csem が不正, isemcnt, maxsem が負または不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

セマフォ属性としてTA_NODISWAI(待ち禁止の拒否)が指定可能
TA_DSNAMEのセマフォ属性指定が可能
セマフォ資源数の最大値(maxsem)の上限値 (>= 32767)

解説
セマフォを生成しセマフォID番号を割り当てる。具体的には、生成するセマフォに対して管理ブロックを割り付け、そのセマフォ
資源数の初期値を isemcnt、最大値(上限値)を maxsem とする。なお、maxsem には少なくとも32767が指定できなくてはなら

μT-Kernel 3.0仕様書

121 / 487

ない。32768以上の値が指定できるかは実装に依存する。
exinf は、対象セマフォに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した情報は、tk_ref_sem で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい場合や、途中で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf に入れる。カーネルでは exinf の内容について関知しない。
sematr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。sematr のシステム属性の部分では、次のような指定を行う。
sematr:= (TA_TFIFO || TA_TPRI) | (TA_FIRST || TA_CNT) | [TA_DSNAME] | [TA_NODISWAI]
TA_TFIFO
TA_TPRI
TA_FIRST
TA_CNT
TA_DSNAME
TA_NODISWAI

待ちタスクのキューイングはFIFO
待ちタスクのキューイングは優先度順
待ち行列先頭のタスクを優先
要求数の少ないタスクを優先
DSオブジェクト名称を指定する
tk_dis_wai による待ち禁止を拒否する

TA_TFIFO, TA_TPRI では、タスクがセマフォの待ち行列に並ぶ際の並び方を指定することができる。属性が TA_TFIFO であれ
ばタスクの待ち行列はFIFOとなり、属性が TA_TPRI であればタスクの待ち行列はタスクの優先度順となる。
TA_FIRST, TA_CNT では、資源獲得の優先順を指定する。TA_FIRST および TA_CNT の指定によって待ち行列の並び順が変わることはない。待ち行列の並び順は TA_TFIFO, TA_TPRI によってのみ決定される。
TA_FIRST では、要求するセマフォ資源数に関係なく待ち行列の先頭のタスクから順に資源を割り当てる。待ち行列の先頭のタスクが要求分の資源を獲得できない限り、待ち行列の後ろのタスクが資源を獲得することはない。
TA_CNT では、要求するセマフォ資源数の獲得できるタスクから順に割り当てる。具体的には、待ち行列の先頭のタスクから順に要求するセマフォ資源数を検査し、その資源数が割り当てられるタスクに割り当てる。要求するセマフォ資源数の少ない順に割り当てるわけではない。
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 エラーとなる。
# define# define# define# define# define# define

TA_TFIFO
TA_TPRI
TA_FIRST
TA_CNT
TA_DSNAME
TA_NODISWAI

0 x00000000
0 x00000001
0 x00000000
0 x00000002
0 x00000040
0 x00000080/* 待ちタスクをFIFOで管理 *//* 待ちタスクを優先度順で管理 *//* 待ち行列先頭のタスクを優先 *//* 要求数の少ないタスクを優先 *//* DSオブジェクト名称を指定 *//* 待ち禁止拒否 */μT-Kernel 3.0仕様書

4.4.1.2

122 / 487

tk_del_sem - セマフォ削除

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_del_sem(ID semid);
パラメータ
ID

semid

Semaphore ID

セマフォID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
不正ID番号(semid が不正あるいは利用できない)
オブジェクトが存在していない(semid のセマフォが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
semid で示されたセマフォを削除する。
本システムコールの発行により、対象セマフォのID番号および管理ブロック用の領域は解放される。
対象セマフォにおいて条件成立を待っているタスクがあった場合にも、本システムコールは正常終了するが、待ち状態にあったタスクにはエラー E_DLT が返される。

μT-Kernel 3.0仕様書

4.4.1.3

123 / 487

tk_sig_sem - セマフォ資源返却

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_sig_sem(ID semid, INT cnt);
パラメータ
ID
INT

semid
cnt

Semaphore ID
Count

セマフォID
返却するセマフォ資源数

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXSE_QOVR
E_PAR

正常終了
不正ID番号(semid が不正あるいは利用できない)
オブジェクトが存在していない(semid のセマフォが存在しない)
キューイングまたはネストのオーバーフロー(セマフォ資源数 semcnt のオーバーフロー)
パラメータエラー(cnt≦0)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
なし
解説
semid で示されたセマフォに対して、cnt 個の資源を返却する操作を行う。対象セマフォに対して既に待っているタスクがあれば、要求するセマフォ資源数を確認して可能であれば資源を割り当てる。資源を割り当てられたタスクを実行可能状態(READY)に移す。条件によっては、複数のタスクに資源が割り当てられ実行可能状態(READY)になる場合がある。
セマフォ資源数の増加により、その値がセマフォ資源数の最大値(maxsem)を越えようとした場合は、E_QOVR のエラーとなる。この場合、資源の返却は一切行われず、セマフォ資源数(semcnt)も変化しない。
補足事項
セマフォ資源数(semcnt)がその初期値(isemcnt)を越えた場合にも、エラーとはならない。排他制御ではなく、同期の目的(tk_wup_tsk〜tk_slp_tsk と同様)でセマフォを使用する場合には、セマフォ資源数(semcnt)が初期値(isemcnt)を越えることがある。一方、排他制御の目的でセマフォを使う場合は、セマフォ資源数の初期値(isemcnt)と最大値(maxsem)を等しい値にしておくことにより、セマフォ資源数の増加によるエラーをチェックすることができる。

μT-Kernel 3.0仕様書

4.4.1.4

124 / 487

tk_wai_sem - セマフォ資源獲得

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_wai_sem(ID semid, INT cnt, TMO tmout);
パラメータ
ID
INT
TMO

semid
cnt
tmout

Semaphore ID
Count
Timeout

セマフォID
要求するセマフォ資源数
タイムアウト指定(ミリ秒)

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
不正ID番号(semid が不正あるいは利用できない)
オブジェクトが存在していない(semid のセマフォが存在しない)
パラメータエラー(tmout≦(-2), cnt≦0)
待ちオブジェクトが削除された(待ちの間に対象セマフォが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
semid で示されたセマフォから、cnt 個の資源を獲得する操作を行う。資源が獲得できれば、本システムコールの発行タスクは待ち状態に入らず、実行を継続する。この場合、そのセマフォのセマフォ資源数(semcnt)は cnt 分減算される。資源が獲得できなければ、本システムコールを発行したタスクは待ち状態に入る。すなわち、そのセマフォに対する待ち行列につながれる。この場合、そのセマフォのセマフォ資源数(semcnt)は不変である。
tmout により待ち時間の最大値(タイムアウト値)を指定することができる。tmout の基準時間(時間の単位)はシステム時刻の基準時間(＝1ミリ秒)と同じである。待ち解除の条件が満足されない(tk_sig_sem が実行されない)まま tmout の時間が経過すると、タイムアウトエラー E_TMOUT となってシステムコールが終了する。
tmout として TMO_POL＝0を指定した場合は、タイムアウト値として0を指定したことを示し、資源を獲得できなくても待ちに入らず E_TMOUT を返す。また、tmout として TMO_FEVR＝(-1)を指定した場合は、タイムアウト値として無限大の時間を指定したことを示し、タイムアウトせずに資源が獲得できるまで待ち続ける。

μT-Kernel 3.0仕様書

4.4.1.5

125 / 487

tk_wai_sem_u - セマフォ資源獲得(マイクロ秒単位)

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_wai_sem_u(ID semid, INT cnt, TMO_U tmout_u);
パラメータ
ID
INT
TMO_U

semid
cnt
tmout_u

Semaphore ID
Count
Timeout

セマフォID
資源要求数
タイムアウト指定(マイクロ秒)

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
不正ID番号(semid が不正あるいは利用できない)
オブジェクトが存在していない(semid のセマフォが存在しない)
パラメータエラー(tmout_u≦(-2), cnt≦0)
待ちオブジェクトが削除された(待ちの間に対象セマフォが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

マイクロ秒のサポート

解説
tk_wai_sem のパラメータである tmout を64ビットマイクロ秒単位の tmout_u としたシステムコールである。
パラメータが tmout_u となった点を除き、本システムコールの仕様は tk_wai_sem と同じである。詳細は tk_wai_sem の説
明を参照のこと。

μT-Kernel 3.0仕様書

4.4.1.6

126 / 487

tk_ref_sem - セマフォ状態参照

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_sem(ID semid, T_RSEM *pk_rsem);
パラメータ
ID
semid
T_RSEM* pk_rsem

Semaphore ID
Packet to Refer Semaphore
Status

セマフォID
セマフォ状態を返す領域へのポインタ

Error Code

エラーコードリターンパラメータERercd

pk_rsem の内容
void*
exinf
Extended InformationID
wtsk
Waiting Task ID
INT
semcntSemaphore Count──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
待ちタスクのID
現在のセマフォ資源数

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(semid が不正あるいは利用できない)
オブジェクトが存在していない(semid のセマフォが存在しない)
パラメータエラー(pk_rsem が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
semid で示された対象セマフォの各種の状態を参照し、リターンパラメータとして現在のセマフォ資源数(semcnt)、待ちタスクのID(wtsk)、拡張情報(exinf) を返す。
wtsk は、このセマフォで待っているタスクのIDを示す。複数のタスクが待っている場合には、待ち行列の先頭のタスクのIDを返す。待ちタスクが無い場合は wtsk＝0となる。
対象セマフォが存在しない場合には、エラー E_NOEXS となる。

μT-Kernel 3.0仕様書

127 / 487

4.4.2 イベントフラグ
イベントフラグは、イベントの有無をビット毎のフラグで表現することにより、同期を行うためのオブジェクトである。イベントフラ
グ機能には、イベントフラグを生成／削除する機能、イベントフラグをセット／クリアする機能、イベントフラグで待つ機能、イベ
ントフラグの状態を参照する機能が含まれる。イベントフラグはID番号で識別されるオブジェクトである。イベントフラグのID
番号をイベントフラグIDと呼ぶ。
イベントフラグは、対応するイベントの有無をビット毎に表現するビットパターンと、そのイベントフラグで待つタスクの待ち行列を持つ。イベントフラグのビットパターンを、単にイベントフラグと呼ぶ場合もある。イベントを知らせる側では、イベントフラグのビットパターンの指定したビットをセットないしはクリアすることが可能である。一方、イベントを待つ側では、イベントフラグのビットパターンの指定したビットのすべてまたはいずれかがセットされるまで、タスクをイベントフラグ待ち状態にすることができる。イベントフラグ待ち状態になったタスクは、そのイベントフラグの待ち行列につながれる。

μT-Kernel 3.0仕様書

4.4.2.1

128 / 487

tk_cre_flg - イベントフラグ生成

C言語インタフェース#include <tk/tkernel.h>
ID flgid = tk_cre_flg(CONST T_CFLG *pk_cflg);
パラメータ
CONST T_CFLG*

pk_cflg

Packet to Create EventFlag

イベントフラグ生成情報

pk_cflg の内容
void*
exinf
Extended Information
ATR
flgatrEventFlag AttributeUINT
iflgptn
Initial EventFlag Pattern
UB
dsname[8]DS Object name──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
イベントフラグ属性
イベントフラグの初期値
DSオブジェクト名称

リターンパラメータ
ID

flgid
または

EventFlag ID
Error Code

イベントフラグID
エラーコードエラーコードE_NOMEM
E_LIMITE_RSATR
E_PAR

メモリ不足(管理ブロック用の領域が確保できない)
イベントフラグの数がシステムの上限を超えた
予約属性(flgatr が不正あるいは利用できない)パラメータエラー(pk_cflg が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

イベントフラグ属性として待ち禁止の拒否(TA_NODISWAI)が指定可能
TA_DSNAMEのイベントフラグ属性指定が可能

解説
イベントフラグを生成しイベントフラグID番号を割り当てる。具体的には、生成するイベントフラグに対して管理ブロックを割り付け、その初期値を iflgptn とする。一つのイベントフラグで、プロセッサの1ワード分のビットをグループ化して扱う。操作はすべて1ワード分を単位とする。
exinf は、対象イベントフラグに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した情報は、tk_ref_flg
で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい場合や、途中で内容を変更したい場合

μT-Kernel 3.0仕様書

129 / 487には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf に入れる。カーネルでは exinf の内容について関知しない。
flgatr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。flgatr のシステム属性の部分では、次のような指定を行う。
flgatr:= (TA_TFIFO || TA_TPRI) | (TA_WMUL || TA_WSGL) | [TA_DSNAME] | [TA_NODISWAI]
TA_TFIFO
TA_TPRI
TA_WSGL
TA_WMUL
TA_DSNAME
TA_NODISWAI

待ちタスクのキューイングはFIFO
待ちタスクのキューイングは優先度順
複数タスクの待ちを許さない(Wait Single Task)
複数タスクの待ちを許す(Wait Multiple Task)
DSオブジェクト名称を指定する
tk_dis_wai による待ち禁止を拒否する

TA_WSGL を指定した場合は、複数のタスクが同時に待ち状態になることを禁止する。TA_WMUL を指定した場合は、同時に複数のタスクが待ち状態となることが許される。
TA_TFIFO, TA_TPRI では、タスクがイベントフラグの待ち行列に並ぶ際の並び方を指定することができる。属性が TA_TFIFO
であればタスクの待ち行列はFIFOとなり、属性が TA_TPRI であればタスクの待ち行列はタスクの優先度順となる。ただし、TA_WSGL を指定した場合は待ち行列を作らないため、TA_TFIFO, TA_TPRI のどちらを指定しても動作に変わりはない。
複数のタスクが待っている場合、待ち行列の先頭から順に待ち条件が成立しているか検査し、待ち条件が成立しているタスクの待ちを解除する。したがって、待ち行列の先頭のタスクが必ずしも最初に待ちが解除される訳ではない。また、待ち条件が成立したタスクが複数あれば、複数のタスクの待ちが解除される。
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 エラーとなる。
# define# define# define# define# define# define

TA_TFIFO
TA_TPRI
TA_WSGL
TA_WMUL
TA_DSNAME
TA_NODISWAI

0 x00000000
0 x00000001
0 x00000000
0 x00000008
0 x00000040
0 x00000080/* 待ちタスクをFIFOで管理 *//* 待ちタスクを優先度順で管理 *//* 複数タスクの待ちを許さない *//* 複数タスクの待ちを許す *//* DSオブジェクト名称を指定 *//* 待ち禁止拒否 */移植ガイドライン
T_CFLGのiflgptnメンバはUINT型であり、処理系によってビット幅が異なる可能性があるため注意が必要である。

μT-Kernel 3.0仕様書

4.4.2.2

130 / 487

tk_del_flg - イベントフラグ削除

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_del_flg(ID flgid);
パラメータ
ID

flgid

EventFlag ID

イベントフラグID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
不正ID番号(flgid が不正あるいは利用できない)
オブジェクトが存在していない(flgid のイベントフラグが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
flgid で示されたイベントフラグを削除する。
本システムコールの発行により、対象イベントフラグのID番号および管理ブロック用の領域は解放される。
対象イベントフラグにおいて条件成立を待っているタスクがあった場合にも、本システムコールは正常終了するが、待ち状態にあったタスクにはエラー E_DLT が返される。

μT-Kernel 3.0仕様書

4.4.2.3

131 / 487

tk_set_flg - イベントフラグのセット

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_set_flg(ID flgid, UINT setptn);
パラメータ
ID
UINT

flgid
setptnEventFlag ID
Set Bit Pattern

イベントフラグID
セットするビットパターン

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
不正ID番号(flgid が不正あるいは利用できない)
オブジェクトが存在していない(flgid のイベントフラグが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイルなし
解説
tk_set_flg では、flgid で示される1ワードのイベントフラグのうち、setptn で示されているビットがセットされる。すなわ
ち、flgid で示されるイベントフラグの値に対して、setptn の値で論理和がとられる。(イベントフラグ値 flgptn に対して
flgptn |= setptn の処理を実行)
tk_set_flg によりイベントフラグの値が変更された結果、tk_wai_flg でそのイベントフラグを待っていたタスクの待ち解除の条
件を満たすようになれば、そのタスクの待ち状態が解除され、実行状態(RUNNING)または実行可能状態(READY)(待っていたタスクが二重待ち状態(WAITING-SUSPENDED)であった場合には強制待ち状態(SUSPENDED))へと移行する。
tk_set_flg で setptn の全ビットを0とした場合には、対象イベントフラグに対して何の操作も行わないことになる。ただし、この場合でもエラーとはならない。
TA_WMUL の属性を持つイベントフラグに対しては、同一のイベントフラグに対して複数のタスクが同時に待つことができる。したがって、イベントフラグでもタスクが待ち行列を作ることになる。この場合、一回の tk_set_flg で複数のタスクが待ち解除となることがある。
移植ガイドライン
setptnはUINT型であり、処理系によってビット幅が異なる可能性があるため注意が必要である。

μT-Kernel 3.0仕様書

4.4.2.4

132 / 487

tk_clr_flg - イベントフラグのクリア

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_clr_flg(ID flgid, UINT clrptn);
パラメータ
ID
UINT

flgid
clrptnEventFlag ID
Clear Bit Pattern

イベントフラグIDクリアするビットパターン

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
不正ID番号(flgid が不正あるいは利用できない)
オブジェクトが存在していない(flgid のイベントフラグが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
tk_clr_flg では、flgid で示される1ワードのイベントフラグのうち、対応する clrptn の0になっているビットがクリアされる。すなわち、flgid で示されるイベントフラグの値に対して、clrptn の値で論理積がとられる。(イベントフラグ値 flgptn に対して
flgptn &= clrptn の処理を実行)
tk_clr_flg では、対象イベントフラグを待っているタスクが待ち解除となることはない。すなわち、ディスパッチは起らない。
tk_clr_flg で clrptn の全ビットを1とした場合には、対象イベントフラグに対して何の操作も行わないことになる。ただし、この
場合でもエラーとはならない。
移植ガイドライン
clrptnはUINT型であり、処理系によってビット幅が異なる可能性があるため注意が必要である。

μT-Kernel 3.0仕様書

4.4.2.5

133 / 487

tk_wai_flg - イベントフラグ待ち

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_wai_flg(ID flgid, UINT waiptn, UINT wfmode, UINT *p_flgptn, TMO tmout);
パラメータ
ID
UINT
UINT
UINT*

flgid
waiptnwfmodep_flgptn

EventFlag ID
Wait Bit Pattern
Wait EventFlag Mode
Pointer to EventFlag Bit Pattern

TMO

tmout

Timeout

イベントフラグID
待ちビットパターン
待ちモード
リターンパラメータ flgptn を返す領域へのポ
インタ
タイムアウト指定(ミリ秒)

Error CodeEventFlag Bit Pattern

エラーコード待ち解除時のビットパターン

リターンパラメータ
ER
UINT

ercd
flgptnエラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_OBJ
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
不正ID番号(flgid が不正あるいは利用できない)
オブジェクトが存在していない(flgid のイベントフラグが存在しない)
パラメータエラー(waiptn＝0, wfmode が不正, tmout≦(-2))
オブジェクトの状態が不正(TA_WSGL 属性のイベントフラグに対する複数タスクの待ち)
待ちオブジェクトが削除された(待ちの間に対象イベントフラグが削除)待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
tk_wai_flg では、wfmode で示される待ち解除の条件にしたがって、flgid で示されるイベントフラグがセットされるのを待つ。
flgid で示されるイベントフラグが、既に wfmode で示される待ち解除条件を満たしている場合には、発行タスクは待ち状態にならずに実行を続ける。
wfmode では、次のような指定を行う。

μT-Kernel 3.0仕様書

134 / 487

wfmode := (TWF_ANDW || TWF_ORW) ｜ [TWF_CLR || TWF_BITCLR]
TWF_ANDWTWF_ORWTWF_CLRTWF_BITCLR

0x00
0x01
0x10
0x20

AND待ち
OR待ち
全クリア指定条件ビットのみクリア指定

TWF_ORW を指定した場合には、flgid で示されるイベントフラグのうち、waiptn で指定したビットのいずれかがセットされるのを待つ(OR待ち)。また、TWF_ANDW を指定した場合には、flgid で示されるイベントフラグのうち、waiptn で指定したビットのす
べてがセットされるのを待つ(AND待ち)。
TWF_CLR の指定が無い場合には、条件が満足されてこのタスクが待ち解除となった場合にも、イベントフラグの値はそのままである。TWF_CLR の指定がある場合には、条件が満足されてこのタスクが待ち解除となった場合、イベントフラグの値(全部のビット)が0にクリアされる。TWF_BITCLR の指定がある場合には、条件が満足されてこのタスクが待ち解除となった場合、イベン
トフラグの待ち解除条件に一致したビットのみが0クリアされる。(イベントフラグ値 &= ~待ち解除条件)
flgptn は、本システムコールによる待ち状態が解除される時のイベントフラグの値(TWF_CLR または TWF_BITCLR 指定の場合
は、イベントフラグがクリアされる前の値) を示すリターンパラメータである。flgptn で返る値は、このシステムコールの待ち解除の条件を満たすものになっている。なお、タイムアウト等で待ちが解除された場合は、flgptn の内容は不定となる。
tmout により待ち時間の最大値(タイムアウト値)を指定することができる。tmout の基準時間(時間の単位)はシステム時刻の基準時間(＝1ミリ秒)と同じである。待ち解除の条件が満足されないまま tmout の時間が経過すると、タイムアウトエラー
E_TMOUT となってシステムコールが終了する。
tmout として TMO_POL＝0を指定した場合は、タイムアウト値として0を指定したことを示し、条件を満たしていなくても待ちに入らず E_TMOUT を返す。また、tmout として TMO_FEVR＝(-1)を指定した場合は、タイムアウト値として無限大の時間を指定したことを示し、タイムアウトせずに条件が成立するまで待ち続ける。
タイムアウトした場合は、TWF_CLR または TWF_BITCLR の指定があってもイベントフラグのクリアは行われない。
waiptn を0とした場合は、パラメータエラー E_PAR になる。
既に待ちタスクの存在する TA_WSGL 属性のイベントフラグに対して、別のタスクが tk_wai_flg を実行することはできない。この場合は、後から tk_wai_flg を実行したタスクが待ち状態に入るかどうか(待ち解除条件が満たされているかどうか)にかか
わらず、後から tk_wai_flg を実行したタスクは E_OBJ のエラーとなる。
一方、TA_WMUL の属性を持つイベントフラグに対しては、同一のイベントフラグに対して複数のタスクが同時に待つことができる。したがって、イベントフラグでもタスクが待ち行列を作ることになる。この場合、一回の tk_set_flg で複数のタスクが待ち解除となることがある。
TA_WMUL 属性を持つイベントフラグに対して複数のタスクが待ち行列を作った場合、次のような動作をする。
• 待ち行列の順番はFIFOまたはタスク優先度順である。(ただし、waiptn や wfmode との関係により、必ずしも行列先頭のタ
スクから待ち解除になるとは限らない。)• 待ち行列中にクリア指定のタスクがあれば、そのタスクが待ち解除になる時に、フラグをクリアする。
• クリア指定を行っていたタスクよりも後ろの待ち行列にあったタスクは、既にクリアされた後のイベントフラグを見ることにな
る。
tk_set_flg によって同じ優先度を持つ複数のタスクが同時に待ち解除となる場合、待ち解除後のタスクの優先順位は、元のイベントフラグの待ち行列の順序を保存する。
補足事項
tk_wai_flg の待ち解除条件として全ビットの論理和を指定すれば、(waiptn＝0xfff...ff, wfmode＝TWF_ORW)、tk_set_flg と組
み合わせることによって、1ワードのビットパターンによるメッセージ転送を行うことができる。ただし、この場合、全部のビットが0というメッセージを送ることはできない。また、前のメッセージが tk_wai_flg で読まれる前に tk_set_flg により次のメッセー
ジが送られると、前のメッセージは消えてしまう。すなわち、メッセージのキューイングはできない。

μT-Kernel 3.0仕様書

135 / 487

waiptn＝0の指定は E_PAR のエラーになるので、イベントフラグで待つタスクの waiptn は0でないことが保証されている。
したがって、tk_set_flg で全ビットをセットすれば、どのような条件でイベントフラグを待つタスクであっても、待ち行列の先頭にあるタスクは必ず待ち解除となる。
イベントフラグに対する複数タスク待ちの機能は、次のような場合に有効である。例えば、タスクAが(1)の tk_set_flg を実行するまで、タスクB、タスクCを(2), (3)の tk_wai_flg で待たせておく場合に、イベントフラグの複数待ちが可能であれば、(1)(2)(3)のどのシステムコールが先に実行されても結果は同じになる[図 4.1. 「イベントフラグに対する複数タスク待ちの機能」]。一方、イベントフラグの複数待ちができなければ、(2)→(3)→(1)の順でシステムコールが実行された場合に、(3)のtk_wai_flg が E_OBJ のエラーになる。

図 4.1: イベントフラグに対する複数タスク待ちの機能

仕様決定の理由
waiptn＝0の指定を E_PAR のエラーとしたのは、waiptn＝0の指定を許した場合に、それ以後イベントフラグがどのような値に変わっても待ち状態から抜けることができなくなるためである。
移植ガイドライン
waiptnとp_flgptnの指す先の型がUINTであり、処理系によってビット幅が異なる可能性があるため注意が必要である。

μT-Kernel 3.0仕様書

4.4.2.6

136 / 487

tk_wai_flg_u - イベントフラグ待ち(マイクロ秒単位)

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_wai_flg_u(ID flgid, UINT waiptn, UINT wfmode, UINT *p_flgptn, TMO_U tmout_u);
パラメータ
ID
UINT
UINT
UINT*

flgid
waiptnwfmodep_flgptn

EventFlag ID
Wait Bit Pattern
Wait EventFlag Mode
Pointer to EventFlag Bit Pattern

TMO_U

tmout_u

Timeout

イベントフラグID
待ちビットパターン
待ちモード
リターンパラメータ flgptn を返す領域へのポ
インタ
タイムアウト指定(マイクロ秒)

Error CodeEventFlag Bit Pattern

エラーコード待ち解除時のビットパターン

リターンパラメータ
ER
UINT

ercd
flgptnエラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_OBJ
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
不正ID番号(flgid が不正あるいは利用できない)
オブジェクトが存在していない(flgid のイベントフラグが存在しない)
パラメータエラー(waiptn＝0, wfmode が不正, tmout_u≦(-2))
オブジェクトの状態が不正(TA_WSGL 属性のイベントフラグに対する複数タスクの待ち)
待ちオブジェクトが削除された(待ちの間に対象イベントフラグが削除)待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

マイクロ秒のサポート

解説
tk_wai_flg のパラメータである tmout を64ビットマイクロ秒単位の tmout_u としたシステムコールである。
パラメータが tmout_u となった点を除き、本システムコールの仕様は tk_wai_flg と同じである。詳細は tk_wai_flg の説明を参照のこと。

μT-Kernel 3.0仕様書

137 / 487

移植ガイドライン
waiptnとp_flgptnの指す先の型がUINTであり、処理系によってビット幅が異なる可能性があるため注意が必要である。

μT-Kernel 3.0仕様書

4.4.2.7

138 / 487

tk_ref_flg - イベントフラグ状態参照

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_flg(ID flgid, T_RFLG *pk_rflg);
パラメータ
ID
flgid
T_RFLG* pk_rflg

EventFlag ID
Packet to Refer EventFlag
Status

イベントフラグID
イベントフラグ状態を返す領域へのポインタ

Error Code

エラーコードリターンパラメータER

ercd

pk_rflg の内容
void*
exinf
Extended InformationID
wtsk
Waiting Task ID
UINT
flgptnEventFlag Bit Pattern──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
待ちタスクのID
現在のイベントフラグのビットパターン

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(flgid が不正あるいは利用できない)
オブジェクトが存在していない(flgid のイベントフラグが存在しない)
パラメータエラー(pk_rflg が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
flgid で示された対象イベントフラグの各種の状態を参照し、リターンパラメータとして現在のフラグ値(flgptn)、待ちタスクのID(wtsk)、拡張情報(exinf) を返す。
wtsk は、このイベントフラグで待っているタスクのIDを示す。このイベントフラグで複数のタスクが待っている場合(TA_WMUL属
性のときのみ)には、待ち行列の先頭のタスクのIDを返す。待ちタスクが無い場合は wtsk＝0となる。
対象イベントフラグが存在しない場合には、エラー E_NOEXS となる。

μT-Kernel 3.0仕様書

139 / 487

4.4.3 メールボックス
メールボックスは、共有メモリ上に置かれたメッセージを受渡しすることにより、同期と通信を行うためのオブジェクトである。メールボックス機能には、メールボックスを生成／削除する機能、メールボックスに対してメッセージを送信／受信する機能、メールボックスの状態を参照する機能が含まれる。メールボックスはID番号で識別されるオブジェクトである。メールボックスのID番号をメールボックスIDと呼ぶ。
メールボックスは、送信されたメッセージを入れるためのメッセージキューと、メッセージの受信を待つタスクの待ち行列を持つ。メッセージを送信する側(イベントを知らせる側)では、送信したいメッセージをメッセージキューに入れる。一方、メッセージを受信する側(イベントを待つ側)では、メッセージキューに入っているメッセージを一つ取り出す。メッセージキューにメッセージが入っていない場合は、次にメッセージが送られてくるまでメールボックスからの受信待ち状態になる。メールボックスからの受信待ち状態になったタスクは、そのメールボックスの待ち行列につながれる。
メールボックスによって実際に送受信されるのは、送信側と受信側で共有しているメモリ上に置かれたメッセージの先頭番地のみである。すなわち、送受信されるメッセージの内容のコピーは行わない。カーネルは、メッセージキューに入っているメッセージを、リンクリストにより管理する。アプリケーションプログラムは、送信するメッセージの先頭に、カーネルがリンクリストに用いるための領域を確保しなければならない。この領域をメッセージヘッダと呼ぶ。また、メッセージヘッダと、それに続くアプリケーションがメッセージを入れるための領域をあわせて、メッセージパケットと呼ぶ。メールボックスへメッセージを送信するシス
テムコールは、メッセージパケットの先頭番地(pk_msg)をパラメータとする。
また、メールボックスからメッセージを受信するシステムコールは、メッセージパケットの先頭番地をリターンパラメータとして返す。
メッセージキューをメッセージの優先度順にする場合には、メッセージの優先度を入れるための領域(msgpri)も、メッセージヘ
ッダ中に持つ必要がある。(図 4.2. 「メールボックスで使用されるメッセージの形式」)
ユーザが実際にメッセージを入れることができるのは、メッセージ先頭アドレスの直後からではなく、メッセージヘッダの後の部分から(図のメッセージの内容の部分) である。

図 4.2: メールボックスで使用されるメッセージの形式
カーネルは、メッセージキューに入っている(ないしは、入れようとしている)メッセージのメッセージヘッダ(メッセージ優先度のための領域を除く)の内容を書き換える。一方、アプリケーションは、メッセージキューに入っているメッセージのメッセージヘッダ(メッセージ優先度のための領域を含む)の内容を書き換えてはならない。アプリケーションによってメッセージヘッダの内容が書き換えられた場合の振舞いは未定義である。この規定は、アプリケーションプログラムがメッセージヘッダの内容を直接書き換えた場合に加えて、メッセージヘッダの番地をカーネルに渡し、カーネルにメッセージヘッダの内容を書き換えさせた場合にも適用される。したがって、すでにメッセージキューに入っているメッセージを再度メールボックスに送信した場合の振舞
いは未定義となる。

μT-Kernel 3.0仕様書

140 / 487

補足事項
メールボックス機能では、メッセージヘッダの領域をアプリケーションプログラムで確保することとしているため、メッセージ
キューに入れることができるメッセージの数には上限がない。また、メッセージを送信するシステムコールで待ち状態になることもない。
メッセージパケットとしては、固定長メモリプールまたは可変長メモリプールから動的に確保したメモリブロックを用いること
も、静的に確保した領域を用いることも可能である。
一般的な使い方としては、送信側のタスクがメモリプールからメモリブロックを確保し、それをメッセージパケットとして送信し、受信側のタスクはメッセージの内容を取り出した後にそのメモリブロックを直接メモリプールに返却するという手順をとることが多い。
上記のような使い方をする場合のプログラム例を以下に示す。
/* メッセージの型定義 */typedef struct {T_MSG msgque ;/* メッセージヘッダ、T_MFIFO属性の場合 */UB msgcont [ MSG_SIZE ]; /* メッセージ内容 */} T_MSG_PACKET ;/* メモリブロックの獲得とメッセージの送信を行うタスクの処理 */T_MSG_PACKET...

* pk_msg ;/* 固定長メモリプールからメモリブロックを獲得 *//* 固定長メモリブロックサイズが sizeof ( T_MSG_PACKET ) 以上であること */tk_get_mpf ( mpfid , ( void **) & pk_msg , TMO_FEVR ) ;/* pk_msg -> msgcont [] 以下にメッセージを作成 */...
/* メッセージを送信 */tk_snd_mbx ( mbxid , ( T_MSG *) pk_msg );/* メッセージの受信とメモリブロックの解放を行うタスクの処理 */T_MSG_PACKET...

* pk_msg ;/* メッセージを受信 */tk_rcv_mbx ( mbxid , ( T_MSG **) & pk_msg , TMO_FEVR );/* pk_msg -> msgcont [] 以下のメッセージ内容の確認、それに応じた処理 */...
/* 固定長メモリプールにメモリブロックを返却 */tk_rel_mpf ( mpfid , ( void *) pk_msg );μT-Kernel 3.0仕様書

4.4.3.1

141 / 487

tk_cre_mbx - メールボックス生成

C言語インタフェース#include <tk/tkernel.h>
ID mbxid = tk_cre_mbx(CONST T_CMBX *pk_cmbx);
パラメータ
CONST T_CMBX*

pk_cmbx

Packet to Create Mailbox

メールボックス生成情報

pk_cmbx の内容
void*
exinf
Extended Information
ATR
mbxatrMailbox Attribute
UB
dsname[8]DS Object name──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
メールボックス属性
DSオブジェクト名称

リターンパラメータ
ID

mbxid
または

Mailbox ID
Error Code

メールボックスID
エラーコードエラーコードE_NOMEM
E_LIMITE_RSATR
E_PAR

メモリ不足(管理ブロック用の領域が確保できない)
メールボックスの数がシステムの上限を超えた
予約属性(mbxatr が不正あるいは利用できない)パラメータエラー(pk_cmbx が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

メールボックス属性としてTA_NODISWAI(待ち禁止の拒否)が指定可能
TA_DSNAMEのメールボックス属性指定が可能

解説
メールボックスを生成しメールボックスID番号を割り当てる。具体的には、生成するメールボックスに対して管理ブロックなどを割り付ける。
exinf は、 対 象 メ ー ル ボ ッ ク ス に 関 す る 情 報 を 入 れ て お く た め に ユ ー ザ が 自 由 に 利 用 で き る。 こ こ で 設 定 し た 情 報
は、tk_ref_mbx で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい場合や、途中で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf に入れる。カーネルでは
exinf の内容について関知しない。

μT-Kernel 3.0仕様書

142 / 487

mbxatr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。mbxatr のシステム属性の部分では、次のような指定を行う。
mbxatr:= (TA_TFIFO || TA_TPRI) | (TA_MFIFO || TA_MPRI) | [TA_DSNAME] | [TA_NODISWAI]
TA_TFIFO
TA_TPRI
TA_MFIFO
TA_MPRI
TA_DSNAME
TA_NODISWAI

待ちタスクのキューイングはFIFO
待ちタスクのキューイングは優先度順
メッセージのキューイングはFIFO
メッセージのキューイングは優先度順
DSオブジェクト名称を指定する
tk_dis_wai による待ち禁止を拒否する

TA_TFIFO, TA_TPRI では、メッセージを受信するタスクがメールボックスの待ち行列に並ぶ際の並び方を指定することができる。属性が TA_TFIFO であればタスクの待ち行列はFIFOとなり、属性が TA_TPRI であればタスクの待ち行列はタスクの優先度順となる。
一方、TA_MFIFO, TA_MPRI では、メッセージがメッセージキュー(受信されるのを待つメッセージの待ち行列) に入る際の並び方を指定することができる。属性が TA_MFIFO であればメッセージキューはFIFOとなり、属性が TA_MPRI であればメッセージ
キューはメッセージの優先度順となる。メッセージの優先度は、メッセージパケットの中の特定領域で指定する。メッセージ優
先度は正の値で、1が最も優先度が高く、数値が大きくなるほど優先度は低くなる。PRI型で表せる最大の正の値が最も低い
優先度となる。同一優先度の場合はFIFOとなる。
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 エラーとなる。
# define# define# define# define# define# define

TA_TFIFO
TA_TPRI
TA_MFIFO
TA_MPRI
TA_DSNAME
TA_NODISWAI

0 x00000000
0 x00000001
0 x00000000
0 x00000002
0 x00000040
0 x00000080/* 待ちタスクをFIFOで管理 *//* 待ちタスクを優先度順で管理 *//* メッセージをFIFOで管理 *//* メッセージを優先度順で管理 *//* DSオブジェクト名称を指定 *//* 待ち禁止拒否 */補足事項
メールボックスで送受信されるメッセージの本体はメモリ上に置かれており、実際に送受信されるのはその先頭アドレスのみである。

μT-Kernel 3.0仕様書

4.4.3.2

143 / 487

tk_del_mbx - メールボックス削除

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_del_mbx(ID mbxid);
パラメータ
ID

mbxid

Mailbox ID

メールボックスID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
不正ID番号(mbxid が不正あるいは利用できない)
オブジェクトが存在していない(mbxid のメールボックスが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mbxid で示されたメールボックスを削除する。
本システムコールの発行により、対象メールボックスのID番号および管理ブロック用の領域などが解放される。
対象メールボックスにおいてメッセージを待っているタスクがあった場合にも、本システムコールは正常終了するが、待ち状態にあったタスクにはエラー E_DLT が返される。また、対象メールボックスの中にメッセージが残っている場合でも、エラーとはならず、メールボックスの削除が行われる。

μT-Kernel 3.0仕様書

4.4.3.3

144 / 487

tk_snd_mbx - メールボックスへ送信

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_snd_mbx(ID mbxid, T_MSG *pk_msg);
パラメータ
ID
T_MSG*

mbxid
pk_msgMailbox ID
Packet of Message

メールボックスID
メッセージパケットの先頭アドレス

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(mbxid が不正あるいは利用できない)
オブジェクトが存在していない(mbxid のメールボックスが存在しない)
パラメータエラー(pk_msg が不正, msgpri≦0)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mbxid で示された対象メールボックスに、pk_msg を先頭アドレスとするメッセージパケットを送信する。
メッセージパケットの内容はコピーされず、受信時には先頭アドレス(pk_msg の値)のみが渡される。したがって、このメッセージを受信したタスクがメッセージパケットの内容を取り出すまで、メッセージパケットの内容を書き換えてはいけない。
対象メールボックスで既にメッセージを待っているタスクがあった場合には、待ち行列の先頭のタスクの待ち状態が解除され、tk_snd_mbx で指定した pk_msg がそのタスクに送信されて、tk_rcv_mbx のリターンパラメータとなる。一方、対象メールボックスでメッセージを待っているタスクが無ければ、送信されたメッセージは、メールボックスの中のメッセージキュー(メッセージの待ち行列)に入れられる。どちらの場合にも、tk_snd_mbx 発行タスクは待ち状態とはならない。
pk_msg は、メッセージヘッダを含めたメッセージパケットの先頭アドレスである。メッセージヘッダは次の形式となる。
typedef struct t_msg {?
?
} T_MSG ;typedef struct t_msg_pri {T_MSG
msgque ;PRI
msgpri ;/* 内容は実装依存(ただし、固定長) *//* メッセージキューのためのエリア *//* メッセージ優先度 */μT-Kernel 3.0仕様書

145 / 487

} T_MSG_PRI ;メッセージヘッダは、TA_MFIFO の場合は T_MSG、TA_MPRI の場合は T_MSG_PRI となる。いずれの場合も、メッセージヘッダのサイズは固定長で、sizeof(T_MSG)またはsizeof(T_MSG_PRI)で取得する。
実際にメッセージを格納できるのは、メッセージヘッダより後ろの領域となる。メッセージ本体部分のサイズには制限はなく、可変長でもよい。
補足事項
tk_snd_mbx によるメッセージ送信は、受信側のタスクの状態とは無関係に行われる。すなわち、非同期のメッセージ送信が行われる。待ち行列につながれるのは、そのタスクの発行したメッセージであって、タスクそのものではない。すなわち、メッセー
ジの待ち行列(メッセージキュー)や受信タスクの待ち行列は存在するが、送信タスクの待ち行列は存在しない。

μT-Kernel 3.0仕様書

4.4.3.4

146 / 487

tk_rcv_mbx - メールボックスから受信

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_rcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout);
パラメータ
ID
T_MSG**

mbxid
ppk_msg

Mailbox ID
Pointer to Packet of Message

TMO

tmout

Timeout

メールボックスID
リターンパラメータ pk_msg を返す領域へのポ
インタ
タイムアウト指定(ミリ秒)

Error Code
Packet of Message

エラーコードメッセージパケットの先頭アドレス

リターンパラメータ
ER
T_MSG*

ercd
pk_msg

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
不正ID番号(mbxid が不正あるいは利用できない)
オブジェクトが存在していない(mbxid のメールボックスが存在しない)
パラメータエラー(tmout≦(-2))
待ちオブジェクトが削除された(待ちの間に対象メールボックスが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
tk_rcv_mbx では、mbxid で示されたメールボックスからメッセージを受信する。
対象メールボックスにまだメッセージが送信されていない場合(メッセージキューが空の場合) には、本システムコールを発行したタスクは待ち状態となり、メッセージの到着を待つ待ち行列につながれる。一方、対象メールボックスに既にメッセージが入っている場合には、メッセージキューの先頭にあるメッセージを1つ取り出して、それをリターンパラメータ pk_msg とする。
tmout により待ち時間の最大値(タイムアウト値)を指定することができる。tmout の基準時間(時間の単位)はシステム時刻の基準時間(＝1ミリ秒)と同じである。タイムアウト指定が行われた場合、待ち解除の条件が満足されない(メッセージが到着しない)まま tmout の時間が経過すると、タイムアウトエラー E_TMOUT となってシステムコールが終了する。

μT-Kernel 3.0仕様書

147 / 487

tmout として TMO_POL＝0を指定した場合は、タイムアウト値として0を指定したことを示し、メッセージがない場合も待ちに入らず E_TMOUT を返す。また、tmout として TMO_FEVR＝(-1)を指定した場合は、タイムアウト値として無限大の時間を指定したことを示し、タイムアウトせずにメッセージが到着するまで待ち続ける。
補足事項
pk_msg は、メッセージヘッダを含めたメッセージパケットの先頭アドレスである。メッセージヘッダは TA_MFIFO の場合は
T_MSG、TA_MPRI の場合は T_MSG_PRI となる。

μT-Kernel 3.0仕様書

4.4.3.5

148 / 487

tk_rcv_mbx_u - メールボックスから受信(マイクロ秒単位)

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_rcv_mbx_u(ID mbxid, T_MSG **ppk_msg, TMO_U tmout_u);
パラメータ
ID
T_MSG**

mbxid
ppk_msg

Mailbox ID
Pointer to Packet of Message

TMO_U

tmout_u

Timeout

メールボックスID
リターンパラメータ pk_msg を返す領域へのポ
インタ
タイムアウト指定(マイクロ秒)

Error Code
Packet of Message

エラーコードメッセージパケットの先頭アドレス

リターンパラメータ
ER
T_MSG*

ercd
pk_msg

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
不正ID番号(mbxid が不正あるいは利用できない)
オブジェクトが存在していない(mbxid のメールボックスが存在しない)
パラメータエラー(tmout_u≦(-2))
待ちオブジェクトが削除された(待ちの間に対象メールボックスが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

マイクロ秒のサポート

解説
tk_rcv_mbx のパラメータである tmout を64ビットマイクロ秒単位の tmout_u としたシステムコールである。
パラメータが tmout_u となった点を除き、本システムコールの仕様は tk_rcv_mbx と同じである。詳細は tk_rcv_mbx の説
明を参照のこと。

μT-Kernel 3.0仕様書

4.4.3.6

149 / 487

tk_ref_mbx - メールボックス状態参照

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_mbx(ID mbxid, T_RMBX *pk_rmbx);
パラメータ
ID
mbxid
T_RMBX* pk_rmbx

Mailbox ID
Packet to Refer Mailbox Status

メールボックスID
メールボックス状態を返す領域へのポインタ

Error Code

エラーコードリターンパラメータER

ercd

pk_rmbx の内容
void*
exinf
Extended InformationID
wtsk
Waiting Task ID
T_MSG* pk_msg
Packet of Message──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
待ちタスクのID
次に受信されるメッセージ

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(mbxid が不正あるいは利用できない)
オブジェクトが存在していない(mbxid のメールボックスが存在しない)
パラメータエラー(pk_rmbx が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mbxid で示された対象メールボックスの各種の状態を参照し、リターンパラメータとして次に受信されるメッセージ(メッセージ
キューの先頭のメッセージ)、待ちタスクのID(wtsk)、拡張情報(exinf) を返す。
wtsk は、このメールボックスで待っているタスクのIDを示す。このメールボックスで複数のタスクが待っている場合には、待ち行列の先頭のタスクのIDを返す。待ちタスクが無い場合は wtsk＝0となる。
対象メールボックスが存在しない場合には、エラー E_NOEXS となる。
pk_msg は、次に tk_rcv_mbx を実行した場合に受信されるメッセージである。メッセージキューにメッセージが無い時
は、pk_msg＝NULL となる。また、どんな場合でも、pk_msg＝NULL と wtsk＝0の少なくとも一方は成り立つ。

μT-Kernel 3.0仕様書

150 / 487

4.5 拡張同期・通信機能
拡張同期・通信機能は、タスクとは独立したオブジェクトにより、タスク間の高度な同期・通信を行うための機能である。ミューテックス、メッセージバッファの各機能が含まれる。

μT-Kernel 3.0仕様書

151 / 487

4.5.1 ミューテックス
ミューテックスは、共有資源を使用する際にタスク間で排他制御を行うためのオブジェクトである。ミューテックスは、排他制御に伴う上限のない優先度逆転を防ぐための機構として、優先度継承プロトコル(priority inheritance protocol)と優先度上
限プロトコル(priority ceiling protocol)をサポートする。
ミューテックス機能には、ミューテックスを生成／削除する機能、ミューテックスをロック／ロック解除する機能、ミューテックスの状態を参照する機能が含まれる。ミューテックスはID番号で識別されるオブジェクトである。ミューテックスのID番号をミューテックスIDと呼ぶ。
ミューテックスは、ロックされているかどうかの状態と、ロックを待つタスクの待ち行列を持つ。また、カーネルは、各ミューテック
スに対してそれをロックしているタスクを、各タスクに対してそれがロックしているミューテックスの集合を管理する。タスクは、資源を使用する前に、ミューテックスをロックする。ミューテックスが他のタスクにロックされていた場合には、ミューテックスがロ
ック解除されるまで、ミューテックスのロック待ち状態となる。ミューテックスのロック待ち状態になったタスクは、そのミューテッ
クスの待ち行列につながれる。タスクは、資源の使用を終えると、ミューテックスのロックを解除する。
ミューテックスは、ミューテックス属性に TA_INHERIT(＝0x02)を指定することにより優先度継承プロトコルを、TA_CEILING(＝
0x03)を指定することにより優先度上限プロトコルをサポートする。TA_CEILING 属性のミューテックスに対しては、そのミューテックスをロックする可能性のあるタスクの中で最も高いベース優先度を持つタスクのベース優先度を、ミューテックス生成時に上限優先度として設定する。TA_CEILING 属性のミューテックスを、その上限優先度よりも高いベース優先度を持つタスクがロックしようとした場合、E_ILUSE エラーとなる。また、TA_CEILING 属性のミューテックスをロックしているかロックを待っている
タスクのベース優先度を、tk_chg_pri によってそのミューテックスの上限優先度よりも高く設定しようとした場合、tk_chg_pri
が E_ILUSE エラーを返す。
これらのプロトコルを用いた場合、上限のない優先度逆転を防ぐために、ミューテックスの操作に伴ってタスクの現在優先度が自動的に変更される。優先度継承プロトコルと優先度上限プロトコルに厳密に従うなら、タスクの現在優先度を、次に挙げる優
先度の最高値に常に一致するように変更する必要がある。これを、厳密な優先度制御規則と呼ぶ。
• タスクのベース優先度• タスクが TA_INHERIT 属性のミューテックスをロックしている場合、それらのミューテックスのロックを待っているタスクの中で、最も高い現在優先度を持つタスクの現在優先度• タスクが TA_CEILING 属性のミューテックスをロックしている場合、それらのミューテックス中で、最も高い上限優先度を持つ
ミューテックスの上限優先度
ここで、TA_INHERIT 属性のミューテックスを待っているタスクの現在優先度が、ミューテックス操作か tk_chg_pri によるベース優先度の変更に伴って変更された場合、そのミューテックスをロックしているタスクの現在優先度の変更が必要になる場合がある。これを推移的な優先度継承と呼ぶ。さらにそのタスクが、別の TA_INHERIT 属性のミューテックスを待っていた場合には、そのミューテックスをロックしているタスクに対して推移的な優先度継承の処理が必要になる場合がある。
T-Kernelでは、上述の厳密な優先度制御規則に加えて、現在優先度を変更する状況を限定した優先度制御規則(これを簡略化した優先度制御規則と呼ぶ)を規定し、どちらを採用するかは実装定義とする。具体的には、簡略化した優先度制御規則
においては、タスクの現在優先度を高くする方向の変更はすべて行うのに対して、現在優先度を低くする方向の変更は、タスクがロックしているミューテックスがなくなった時にのみ行う(この場合には、タスクの現在優先度をベース優先度に戻すことになる)。より具体的には、次の状況でのみ現在優先度を変更する処理を行えばよい。
• タスクがロックしている TA_INHERIT 属性のミューテックスを、そのタスクよりも高い現在優先度を持つタスクが待ち始めた時• タスクAによってロックされている TA_INHERIT 属性のミューテックスを待っている別のタスクBが、タスクAよりも高い現在優先度に変更された時• タスクが、そのタスクの現在優先度よりも高い上限優先度を持つ TA_CEILING 属性のミューテックスをロックした時• タスクがロックしているミューテックスがなくなった時
ミューテックスの操作に伴ってタスクの現在優先度を変更した場合には、次の処理を行う。
優先度を変更されたタスクが実行できる状態である場合、タスクの優先順位を、変更後の優先度にしたがって変化させる。変
更後の優先度と同じ優先度を持つタスクの間での優先順位は、実装依存である。優先度が変更されたタスクが何らかのタス
ク優先度順の待ち行列につながれている場合にも、その待ち行列の中での順序を、変更後の優先度にしたがって変化させる。

μT-Kernel 3.0仕様書

152 / 487

変更後の優先度と同じ優先度を持つタスクの間での順序は、実装依存である。タスクが終了する時に、そのタスクがロックしているミューテックスが残っている場合には、それらのミューテックスをすべてロック解除する。ロックしているミューテックスが複数ある場合には、それらをロック解除する順序は実装依存である。ロック解除の具体的な処理内容については、tk_unl_mtxの機能説明を参照すること。
補足事項
TA_TFIFO 属性または TA_TPRI 属性のミューテックスは、最大資源数が1のセマフォ(バイナリセマフォ)と同等の機能を持つ。ただし、ミューテックスは、ロックしたタスク以外はロック解除できない、タスク終了時に自動的にロック解除されるなどの違いがある。
ここでいう優先度上限プロトコルは、広い意味での優先度上限プロトコルで、最初に優先度上限プロトコルとして提案されたアルゴリズムではない。厳密には、highest locker protocolなどと呼ばれているアルゴリズムである。
ミューテックスの操作に伴ってタスクの現在優先度を変更した結果、優先度を変更されたタスクのタスク優先度順の待ち行列の中での順序が変化した場合、優先度を変更されたタスクないしはその待ち行列で待っている他のタスクの待ち解除が必要になる場合がある。

仕様決定の理由
ミューテックスの操作に伴ってタスクの現在優先度を変更した場合に、変更後の優先度と同じ優先度を持つタスクの間での優先順位を実装依存としたのは、次の理由による。アプリケーションによっては、ミューテックス機能による現在優先度の変更が頻繁に発生する可能性があり、それに伴ってタスク切替えが多発するのは望ましくない(同じ優先度を持つタスクの間での優先順位を最低とすると、不必要なタスク切替えが起こる)。理想的には、タスクの優先度ではなく優先順位を継承するのが望ましいが、このような仕様にすると実装上のオーバヘッドが大きくなるため、実装依存とすることにした。

μT-Kernel 3.0仕様書

4.5.1.1

153 / 487

tk_cre_mtx - ミューテックス生成

C言語インタフェース#include <tk/tkernel.h>
ID mtxid = tk_cre_mtx(CONST T_CMTX *pk_cmtx);
パラメータ
CONST T_CMTX*

pk_cmtx

Packet to Create Mutex

ミューテックス生成情報

pk_cmtx の内容
void*
exinf
Extended Information
ATR
mtxatrMutex Attribute
PRI
ceilpriCeiling Priority of Mutex
UB
dsname[8]DS Object name──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
ミューテックス属性
ミューテックスの上限優先度
DSオブジェクト名称

リターンパラメータ
ID

mtxid
または

Mutex ID
Error CodeミューテックスID
エラーコードエラーコードE_NOMEM
E_LIMITE_RSATR
E_PAR

メモリ不足(管理ブロック用の領域が確保できない)
ミューテックスの数がシステムの上限を超えた
予約属性(mtxatr が不正あるいは利用できない)パラメータエラー(pk_cmtx, ceilpri が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

ミューテックス属性としてTA_NODISWAI(待ち禁止の拒否)が指定可能
TA_DSNAMEのミューテックス属性指定が可能

解説
ミューテックスを生成しミューテックスID番号を割り当てる。具体的には、生成するミューテックスに対して管理ブロックなどを割り付ける。
exinf は、 対 象 ミ ュ ー テ ッ ク ス に 関 す る 情 報 を 入 れ て お く た め に ユ ー ザ が 自 由 に 利 用 で き る。 こ こ で 設 定 し た 情 報
は、tk_ref_mtx で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい場合や、途中で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf に入れる。カーネルでは
exinf の内容について関知しない。

μT-Kernel 3.0仕様書

154 / 487

mtxatr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。mtxatr のシステム属性の部分では、次のような指定を行う。
mtxatr:= (TA_TFIFO || TA_TPRI || TA_INHERIT || TA_CEILING) | [TA_DSNAME] | [TA_NODISWAI]
TA_TFIFO
TA_TPRI
TA_INHERITTA_CEILING
TA_DSNAME
TA_NODISWAI

待ちタスクのキューイングはFIFO
待ちタスクのキューイングは優先度順
優先度継承プロトコル
優先度上限プロトコル
DSオブジェクト名称を指定する
tk_dis_wai による待ち禁止を拒否する

TA_TFIFO の場合、ミューテックスのタスクの待ち行列はFIFOとなる。TA_TPRI, TA_INHERIT, TA_CEILING では、タスクの優先度順となる。TA_INHERIT では優先度継承プロトコル、TA_CEILING では優先度上限プロトコルが適用される。
TA_CEILING の場合のみ ceilpri が有効となり、ミューテックスの上限優先度を設定する。
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 エラーとなる。
# define# define# define# define# define# define

TA_TFIFO
TA_TPRI
TA_INHERITTA_CEILING
TA_DSNAME
TA_NODISWAI

0 x00000000
0 x00000001
0 x00000002
0 x00000003
0 x00000040
0 x00000080/* 待ちタスクをFIFOで管理 *//* 待ちタスクを優先度順で管理 *//* 優先度継承プロトコル *//* 優先度上限プロトコル *//* DSオブジェクト名称を指定 *//* 待ち禁止拒否 */μT-Kernel 3.0仕様書

4.5.1.2

155 / 487

tk_del_mtx - ミューテックス削除

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_del_mtx(ID mtxid);
パラメータ
ID

mtxid

Mutex ID

ミューテックスID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
不正ID番号(mtxid が不正あるいは利用できない)
オブジェクトが存在していない(mtxid のミューテックスが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mtxid で示されたミューテックスを削除する。
本システムコールの発行により、対象ミューテックスのID番号および管理ブロック用の領域は解放される。
対象ミューテックスにおいてロック待ちしているタスクがあった場合にも、本システムコールは正常終了するが、待ち状態にあったタスクにはエラー E_DLT が返される。
ミューテックスが削除されると、そのミューテックスをロックしているタスクにとっては、ロックしているミューテックスが減ることになる。したがって、削除されるミューテックスが TA_INHERIT または TA_CEILING 属性の場合には、ロックしていたタスクの優先度が変更される場合がある。

μT-Kernel 3.0仕様書

4.5.1.3

156 / 487

tk_loc_mtx - ミューテックスのロック

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_loc_mtx(ID mtxid, TMO tmout);
パラメータ
ID
TMO

mtxid
tmout

Mutex ID
Timeout

ミューテックスID
タイムアウト指定(ミリ秒)

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX
E_ILUSE

正常終了
不正ID番号(mtxid が不正あるいは利用できない)
オブジェクトが存在していない(mtxid のミューテックスが存在しない)
パラメータエラー(tmout≦(-2))
待ちオブジェクトが削除された(待ちの間に対象ミューテックスが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)
不正使用(多重ロック、上限優先度違反)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mtxid のミューテックスをロックする。ミューテックスがロックできれば、本システムコールの発行タスクは待ち状態に入らず、実行を継続する。この場合、そのミューテックスはロック状態になる。ロックできなければ、本システムコールを発行したタスクは待ち状態に入る。すなわち、そのミューテックスに対する待ち行列につながれる。
tmout により待ち時間の最大値(タイムアウト値)を指定することができる。tmout の基準時間(時間の単位)はシステム時刻の基準時間(＝1ミリ秒)と同じである。待ち解除の条件が満足されない(ロックが解除されない)まま tmout の時間が経過すると、タイムアウトエラー E_TMOUT となってシステムコールが終了する。
tmout として TMO_POL＝0を指定した場合は、タイムアウト値として0を指定したことを示し、ロックできなくても待ちに入らず
E_TMOUT を返す。また、tmout として TMO_FEVR＝(-1)を指定した場合は、タイムアウト値として無限大の時間を指定したことを示し、タイムアウトせずにロックできるまで待ち続ける。

μT-Kernel 3.0仕様書

157 / 487

自タスクがすでに対象ミューテックスをロックしていた場合には、E_ILUSE(多重ロック)を返す。
対象ミューテックスが TA_CEILING 属性の場合、自タスクのベース優先度1 が対象ミューテックスの上限優先度より高い場合には E_ILUSE(上限優先度違反)を返す。
補足事項• TA_INHERIT 属性のミューテックスの場合
自タスクがロック待ち状態になる場合、そのミューテックスをロックしているタスクの現在優先度が自タスクより低ければ、ロックしているタスクの優先度を自タスクと同じ優先度まで引き上げる。ロックを待っているタスクがロックを獲得せずに待ちを終了した場合(タイムアウトなど)、そのミューテックスをロック中のタスクの優先度を、次の内の最も高い優先度まで引き下げる。ただし、この優先度の引き下げを行うか否かは実装依存である。
a. そのミューテックスでロック待ちしているタスクの現在優先度の内の最も高い優先度。
b. そのミューテックスをロック中のタスクがロックしている他のすべてのミューテックスの内の最も高い優先度。
c. ロック中のタスクのベース優先度。
• TA_CEILING 属性のミューテックスの場合
自タスクがロックを獲得した場合、自タスクの現在優先度がミューテックスの上限優先度より低ければ、自タスクの優先度をミューテックスの上限優先度まで引き上げる。

1 ベース優先度：ミューテックスによって自動的に引き上げられる前のタスクの優先度を示す。最後(ミューテックスのロック中も含む)に tk_chg_pri によって設定された優先度、または tk_chg_pri を一度も発行していない場合はタスク生成時に指定したタスク優先度が、ベース優先度である。

μT-Kernel 3.0仕様書

4.5.1.4

158 / 487

tk_loc_mtx_u - ミューテックスのロック(マイクロ秒単位)

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_loc_mtx_u(ID mtxid, TMO_U tmout_u);
パラメータ
ID
TMO_U

mtxid
tmout_u

Mutex ID
Timeout

ミューテックスID
タイムアウト指定(マイクロ秒)

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX
E_ILUSE

正常終了
不正ID番号(mtxid が不正あるいは利用できない)
オブジェクトが存在していない(mtxid のミューテックスが存在しない)
パラメータエラー(tmout_u≦(-2))
待ちオブジェクトが削除された(待ちの間に対象ミューテックスが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)
不正使用(多重ロック、上限優先度違反)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

マイクロ秒のサポート

解説
tk_loc_mtx のパラメータである tmout を64ビットマイクロ秒単位の tmout_u としたシステムコールである。
パラメータが tmout_u となった点を除き、本システムコールの仕様は tk_loc_mtx と同じである。詳細は tk_loc_mtx の説明を参照のこと。

μT-Kernel 3.0仕様書

4.5.1.5

159 / 487

tk_unl_mtx - ミューテックスのアンロック

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_unl_mtx(ID mtxid);
パラメータ
ID

mtxid

Mutex ID

ミューテックスID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_ILUSE

正常終了
不正ID番号(mtxid が不正あるいは利用できない)
オブジェクトが存在していない(mtxid のミューテックスが存在しない)
不正使用(自タスクがロックしたミューテックスではない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mtxid のミューテックスのロックを解除する。
ロック待ちしているタスクがあれば、待ち行列の先頭のタスクの待ちを解除し、そのタスクをロック獲得状態にする。
自タスクがロックしていないミューテックスを指定した場合、E_ILUSE を返す。
補足事項
ロック解除したミューテックスが TA_INHERIT または TA_CEILING 属性の場合、次のようにタスク優先度を引き下げる必要がある。
ロックを解除することにより、自タスクがロックしているミューテックスがすべてなくなった場合は、自タスクの優先度をベース優
先度まで引き下げる。
自タスクがロック中のミューテックスが残っている場合、自タスクの優先度を次の内の最も高い優先度まで引き下げる。
a. 自タスクがロックしている TA_INHERIT 属性を持つミューテックスの待ち行列につながれているタスクの現在優先度の中で最も高い優先度

μT-Kernel 3.0仕様書

160 / 487

b. 自タスクがロックしている TA_CEILING 属性を持つミューテックスに設定されている上限優先度の中で最も高い優先度
c. 自タスクのベース優先度
ただし、ロック中のミューテックスが残っている場合の優先度の引き下げを行うか否かは実装依存である。
ミューテックスをロックした状態でタスクを終了した(休止状態(DORMANT)または未登録状態(NON-EXISTENT)になった)
場合、当該タスクがロックしているすべてのミューテックスは自動的にロック解除される。

μT-Kernel 3.0仕様書

4.5.1.6

161 / 487

tk_ref_mtx - ミューテックス状態参照

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_mtx(ID mtxid, T_RMTX *pk_rmtx);
パラメータ
ID
mtxid
T_RMTX* pk_rmtx

Mutex ID
Packet to Refer Mutex Status

ミューテックスID
ミューテックス状態を返す領域へのポインタ

Error Code

エラーコードリターンパラメータER

ercd

pk_rmtx の内容
void*
exinf
Extended InformationID
htsk
Locking Task ID
ID
wtsk
Lock Waiting Task ID
──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
ロックしているタスクのID
ロック待ちタスクのID

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(mtxid が不正あるいは利用できない)
オブジェクトが存在していない(mtxid のミューテックスが存在しない)
パラメータエラー(pk_rmtx が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mtxid で示された対象ミューテックスの各種の状態を参照し、リターンパラメータとしてロック中のタスク(htsk)、ロック待ちタスク(wtsk)、拡張情報(exinf) を返す。
htsk は、このミューテックスをロックしているタスクのIDを示す。ロックしているタスクがない場合は htsk＝0となる。
wtsk は、このミューテックスで待っているタスクのIDを示す。複数のタスクが待っている場合には、待ち行列の先頭のタスクのIDを返す。待ちタスクが無い場合は wtsk＝0となる。
対象ミューテックスが存在しない場合には、エラー E_NOEXS となる。

μT-Kernel 3.0仕様書

162 / 487

4.5.2 メッセージバッファ
メッセージバッファは、可変長のメッセージを受渡しすることにより、同期と通信を行うためのオブジェクトである。メッセージバ
ッファ機能には、メッセージバッファを生成／削除する機能、メッセージバッファに対してメッセージを送信／受信する機能、メッセージバッファの状態を参照する機能が含まれる。メッセージバッファはID番号で識別されるオブジェクトである。メッセージ
バッファのID番号をメッセージバッファIDと呼ぶ。
メッセージバッファは、メッセージの送信を待つタスクの待ち行列(送信待ち行列)とメッセージの受信を待つタスクの待ち行列(受信待ち行列)を持つ。また、送信されたメッセージを格納するためのメッセージバッファ領域を持つ。メッセージを送信する側(イベントを知らせる側)では、送信したいメッセージをメッセージバッファにコピーする。メッセージバッファ領域の空き領域が足りなくなった場合、メッセージバッファ領域に十分な空きができるまでメッセージバッファへの送信待ち状態になる。
メッセージバッファへの送信待ち状態になったタスクは、そのメッセージバッファの送信待ち行列につながれる。一方、メッセー
ジを受信する側(イベントを待つ側)では、メッセージバッファに入っているメッセージを一つ取り出す。メッセージバッファにメッセージが入っていない場合は、次にメッセージが送られてくるまでメッセージバッファからの受信待ち状態になる。メッセージバ
ッファからの受信待ち状態になったタスクは、そのメッセージバッファの受信待ち行列につながれる。
メッセージバッファ領域のサイズを0にすることで、同期メッセージ機能を実現することができる。すなわち、送信側のタスクと受信側のタスクが、それぞれ相手のタスクがシステムコールを呼び出すのを待ち合わせ、両者がシステムコールを呼び出した時
点で、メッセージの受渡しが行われる。
補足事項
メッセージバッファ領域のサイズを0にした場合の、メッセージバッファの動作を図 4.3. 「メッセージバッファによる同期通信」の例を用いて説明する。この図で、タスクAとタスクBは非同期に実行しているものとする。
• もしタスクAが先に tk_snd_mbf を呼び出した場合には、タスクBが tk_rcv_mbf を呼び出すまでタスクAは待ち状態となる。この時タスクAは、メッセージバッファへの送信待ち状態になっている(図 4.3. 「メッセージバッファによる同期通信」(a))。
• 逆にタスクBが先に tk_rcv_mbf を呼び出した場合には、タスクAが tk_snd_mbf を呼び出すまでタスクBは待ち状態となる。この時タスクBは、メッセージバッファからの受信待ち状態になっている(図 4.3. 「メッセージバッファによる同期通信」(b))。
• タスクAが tk_snd_mbf を呼び出し、タスクBが tk_rcv_mbf を呼び出した時点で、タスクAからタスクBへメッセージの受渡しが行われる。その後は、両タスクとも実行できる状態となる。
メッセージバッファへの送信を待っているタスクは、待ち行列につながれている順序でメッセージを送信する。例えば、あるメ
ッセージバッファに対して40バイトのメッセージを送信しようとしているタスクAと、10バイトのメッセージを送信しようとしているタスクBが、この順で待ち行列につながれている時に、別のタスクによるメッセージの受信により20バイトの空き領域ができたとする。このような場合でも、タスクAがメッセージを送信するまで、タスクBはメッセージを送信できない。
メッセージバッファは、可変長のメッセージをコピーして受渡しする。メールボックスとの違いは、メッセージをコピーすることである。
メッセージバッファは、リングバッファで実装することを想定している。

μT-Kernel 3.0仕様書

163 / 487

図 4.3: メッセージバッファによる同期通信

μT-Kernel 3.0仕様書

4.5.2.1

164 / 487

tk_cre_mbf - メッセージバッファ生成

C言語インタフェース#include <tk/tkernel.h>
ID mbfid = tk_cre_mbf(CONST T_CMBF *pk_cmbf);
パラメータ
CONST T_CMBF*

pk_cmbf

Packet to Create Message
Buffer

メッセージバッファ生成情報

pk_cmbf の内容
void*
exinf
Extended Information
ATR
mbfatrMessage Buffer Attribute
SZ
bufsz
Buffer Size
INT
Max Message SizemaxmszUB
dsname[8]DS Object namevoid*
bufptrBuffer Pointer──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
メッセージバッファ属性
メッセージバッファのサイズ(バイト数)
メッセージの最大長(バイト数)
DSオブジェクト名称
ユーザバッファポインタ

リターンパラメータ
ID

mbfid
または

Message Buffer ID
Error Code

メッセージバッファID
エラーコードエラーコードE_NOMEM
E_LIMITE_RSATR
E_PAR

メモリ不足(管理ブロックやリングバッファ用の領域が確保できない)メッセージバッファの数がシステムの上限を超えた
予約属性(mbfatr が不正あるいは利用できない)パラメータエラー(pk_cmbf が不正, bufsz, maxmsz が負または不正, bufptr が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

TA_USERBUFのメッセージバッファ属性指定が可能
自動バッファ割当て(TA_USERBUFのメッセージバッファ属性指定なし)が可能
メッセージバッファ属性としてTA_NODISWAI(待ち禁止の拒否)が指定可
能
TA_DSNAMEのメッセージバッファ属性指定が可能

μT-Kernel 3.0仕様書

165 / 487

解説
メッセージバッファを生成しメッセージバッファID番号を割り当てる。具体的には、生成するメッセージバッファに対して管理ブ
ロックを割り付ける。また、bufsz の情報を元に、メッセージキュー(受信されるのを待つメッセージの待ち行列) として利用するためのリングバッファの領域を確保する。
メッセージバッファは、可変長メッセージの送受信の管理を行うオブジェクトである。メールボックス(mbx)との違いは、送信時と受信時に可変長のメッセージ内容がコピーされるということである。また、バッファが一杯の場合に、メッセージ送信側も待ち状態に入る機能がある。
exinf は、対象メッセージバッファに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した情報
は、tk_ref_mbf で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい場合や、途中で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf に入れる。カーネルでは exinfの内容について関知しない。
mbfatr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。mbfatr のシステム属性の部分では、次のような指定を行う。
mbfatr := (TA_TFIFO || TA_TPRI) | [TA_DSNAME] | [TA_USERBUF] | [TA_NODISWAI]
TA_TFIFO
TA_TPRI
TA_DSNAME
TA_USERBUF
TA_NODISWAI

送信待ちタスクのキューイングはFIFO
送信待ちタスクのキューイングは優先度順
DSオブジェクト名称を指定する
メッセージバッファ領域としてユーザが指定した領域を利用する
tk_dis_wai による待ち禁止を拒否する

TA_TFIFO, TA_TPRI では、バッファが一杯の場合にメッセージを送信するタスクがメッセージバッファの待ち行列に並ぶ際の並び方を指定することができる。属性が TA_TFIFO であればタスクの待ち行列はFIFOとなり、属性が TA_TPRI であればタスクの待ち行列はタスクの優先度順となる。なお、メッセージキューの順序はFIFOのみである。
メッセージ受信待ちのタスクの待ち行列の順序はFIFOのみである。
TA_USERBUFを指定した場合にbufptrが有効になり、bufptrを先頭とするbufszバイトのメモリ領域をメッセージバッファ領域として使用する。この場合、メッセージバッファ領域はカーネルで用意しない。TA_USERBUFを指定しなかった場合はbufptrは無視され、メッセージバッファ領域はカーネルが確保する
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 エラーとなる。
# define# define# define# define# define

TA_TFIFO
TA_TPRI
TA_USERBUF
TA_DSNAME
TA_NODISWAI

0 x00000000
0 x00000001
0 x00000020
0 x00000040
0 x00000080/* 送信待ちタスクをFIFOで管理 *//* 送信待ちタスクを優先度順で管理 *//* ユーザバッファポインタを指定 *//* DSオブジェクト名称を指定 *//* 待ち禁止拒否 */

補足事項
送信待ちのタスクが複数あった場合、バッファの空きができて送信待ちが解除されるのは常に待ち行列の順となる。
例えば、30バイトのメッセージを送信しようとしているタスクAと、10バイトのメッセージを送信しようとしているタスクBがA-Bの順で待っていた場合、メッセージバッファに20バイトの空きができてもAのタスクを追い越してBのタスクが先に送信することはない。
メッセージキューを入れるリングバッファの中には、一つ一つのメッセージを管理する情報も入るため、bufsz で指定されたリン
グバッファのサイズとキューに入るメッセージのサイズの合計とは、一般には一致しない。後者の方が小さい値をとるのが普通である。その意味で、bufsz の情報は厳密な意味をもつものではない。

μT-Kernel 3.0仕様書

166 / 487

bufsz＝0のメッセージバッファを生成することは可能である。この場合、このメッセージバッファでは送受信側が完全に同期した通信を行うことになる。すなわち、tk_snd_mbf と tk_rcv_mbf の一方のシステムコールが先に実行されると、それを実行したタスクは待ち状態となる。もう一方のシステムコールが実行された段階で、メッセージの受け渡し(コピー)が行われ、その後双方のタスクが実行を再開する。
bufsz＝0のメッセージバッファの場合、具体的な動作は次のようになる。
1. [図 4.4. 「bufsz＝0のメッセージバッファを使った同期式通信」]で、タスクAとタスクBは非同期に動いている。もし、タス
クAが先に(1)に到達し、tk_snd_mbf(mbfid) を実行した場合には、タスクBが(2)に到達するまでタスクAはメッセージ
送信待ち状態になる。この状態のタスクAを対象として tk_ref_tsk を発行すると、tskwait＝TTW_SMBF となる。逆に、タスクBが先に(2)に到達し、tk_rcv_mbf(mbfid) を実行した場合には、タスクAが(1)に到達するまでタスクBはメッセージ
受信待ち状態になる。この状態のタスクBを対象として tk_ref_tsk を発行すると、tskwait＝TTW_RMBF となる。
2. タスクAが tk_snd_mbf(mbfid) を実行し、かつタスクBが tk_rcv_mbf(mbfid) を実行した時点でタスクAからタスクBにメッセージが送信され、どちらのタスクも待ち解除となって実行を再開する。

図 4.4: bufsz＝0のメッセージバッファを使った同期式通信

移植ガイドライン
T_CMBFのメンバmaxmszがINT型であり、処理系によってとれる値の範囲に異なる可能性があるため注意が必要である。
T-Kernel 2.0にはTA_USERBUFとbufptrが存在しない。そのため、この機能を使っている場合はT-Kernel 2.0への移植の際に修正が必要となるが、正しくbufszを設定してあれば、TA_USERBUFとbufptrを削除するだけで移植できる。

μT-Kernel 3.0仕様書

4.5.2.2

167 / 487

tk_del_mbf - メッセージバッファ削除

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_del_mbf(ID mbfid);
パラメータ
ID

mbfid

Message Buffer ID

メッセージバッファID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
不正ID番号(mbfid が不正あるいは利用できない)
オブジェクトが存在していない(mbfid のメッセージバッファが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mbfid で示されたメッセージバッファを削除する。
本システムコールの発行により、対象メッセージバッファのID番号および管理ブロック用の領域およびメッセージを入れるバッ
ファ領域は解放される。
対象メッセージバッファにおいてメッセージ受信またはメッセージ送信を待っているタスクがあった場合にも、本システムコール
は正常終了するが、待ち状態にあったタスクにはエラー E_DLT が返される。また、対象メッセージバッファの中にメッセージが残っている場合でも、エラーとはならず、メッセージバッファの削除が行われ、中にあったメッセージは消滅する。

μT-Kernel 3.0仕様書

4.5.2.3

168 / 487

tk_snd_mbf - メッセージバッファへ送信

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_snd_mbf(ID mbfid, CONST void *msg, INT msgsz, TMO tmout);
パラメータ
ID
CONST void*
INT
TMO

mbfid
msg
msgsz
tmout

Message Buffer ID
Send Message
Send Message Size
Timeout

メッセージバッファID
送信メッセージの先頭アドレス
送信メッセージのサイズ(バイト数)
タイムアウト指定(ミリ秒)

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
不正ID番号(mbfid が不正あるいは利用できない)
オブジェクトが存在していない(mbfid のメッセージバッファが存在しない)
パラメータエラー(msgsz≦0, msgsz＞maxmsz, msg が不正, tmout≦(-2))
待ちオブジェクトが削除された(待ちの間に対象メッセージバッファが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部
×(※条件により可能)

関連するサービスプロファイルなし
解説
tk_snd_mbf では、mbfid で示されたメッセージバッファに対して、msg のアドレスに入っているメッセージを送信する。メッセー
ジのサイズは msgsz で指定される。すなわち、msg 以下の msgsz バイトが、mbfid で指定されたメッセージバッファのメッセー
ジキューにコピーされる。メッセージキューは、リングバッファによって実現されることを想定している。
msgsz が、tk_cre_mbf で指定した maxmsz よりも大きい場合は、エラー E_PAR となる。
バッファの空き領域が少なく、msg のメッセージをメッセージキューに入れられない場合、本システムコールを発行したタスク
はメッセージ送信待ち状態となり、バッファの空きを待つための待ち行列(送信待ち行列)につながれる。待ち行列の順序は
tk_cre_mbf 時の指定によりFIFOまたはタスク優先度順となる。

μT-Kernel 3.0仕様書

169 / 487

tmout により待ち時間の最大値(タイムアウト値)を指定することができる。tmout の基準時間(時間の単位)はシステム時刻の基準時間(＝1ミリ秒)と同じである。タイムアウト指定が行われた場合、待ち解除の条件が満足されない(バッファに十分な空き領域ができない)まま tmout の時間が経過すると、タイムアウトエラー E_TMOUT となってシステムコールが終了する。
tmout として TMO_POL＝0を指定した場合は、タイムアウト値として0を指定したことを示し、バッファに十分な空きがない場合
は待ちに入らず E_TMOUT を返す。また、tmout として TMO_FEVR＝(-1)を指定した場合は、タイムアウト値として無限大の時間を指定したことを示し、タイムアウトせずにバッファに空きができるまで待ち続ける。
長さが0のメッセージは送信することができない。msgsz≦0の場合には、エラー E_PAR となる。
タスク独立部やディスパッチ禁止状態から実行した場合はエラー E_CTX となるが、tmout＝TMO_POL の場合は、実装によってはタスク独立部やディスパッチ禁止状態から実行することができる場合がある。
移植ガイドライン
msgszがINT型であり、処理系によってとれる値の範囲に異なる可能性があるため注意が必要である。例えば、16ビット環境
では一度に送れるメッセージのサイズが32767バイトまでに制限される可能性がある。

μT-Kernel 3.0仕様書

4.5.2.4

170 / 487

tk_snd_mbf_u - メッセージバッファへ送信(マイクロ秒単位)

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_snd_mbf_u(ID mbfid, CONST void *msg, INT msgsz, TMO_U tmout_u);
パラメータ
ID
CONST void*
INT
TMO_U

mbfid
msg
msgsz
tmout_u

Message Buffer ID
Send Message
Send Message Size
Timeout

メッセージバッファID
送信メッセージの先頭アドレス
送信メッセージのサイズ(バイト数)
タイムアウト指定(マイクロ秒)

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
不正ID番号(mbfid が不正あるいは利用できない)
オブジェクトが存在していない(mbfid のメッセージバッファが存在しない)
パラメータエラー(msgsz≦0, msgsz＞maxmsz, msg が不正, tmout_u≦(-2))
待ちオブジェクトが削除された(待ちの間に対象メッセージバッファが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部
×(※条件により可能)

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

マイクロ秒のサポート

解説
tk_snd_mbf のパラメータである tmout を64ビットマイクロ秒単位の tmout_u としたシステムコールである。
パラメータが tmout_u となった点を除き、本システムコールの仕様は tk_snd_mbf と同じである。詳細は tk_snd_mbf の説
明を参照のこと。

μT-Kernel 3.0仕様書

171 / 487

移植ガイドライン
msgszがINT型であり、処理系によってとれる値の範囲に異なる可能性があるため注意が必要である。例えば、16ビット環境
では一度に送れるメッセージのサイズが32767バイトまでに制限される可能性がある。

μT-Kernel 3.0仕様書

4.5.2.5

172 / 487

tk_rcv_mbf - メッセージバッファから受信

C言語インタフェース#include <tk/tkernel.h>
INT msgsz = tk_rcv_mbf(ID mbfid, void *msg, TMO tmout);
パラメータ
ID
void*
TMO

mbfid
msg
tmout

Message Buffer ID
Receive Message
Timeout

メッセージバッファID
受信メッセージを入れるアドレス
タイムアウト指定(ミリ秒)Receive Message Size
Error Code

受信したメッセージのサイズ(バイト数)
エラーコードリターンパラメータ
INT

msgsz
または

エラーコード
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

不正ID番号(mbfid が不正あるいは利用できない)
オブジェクトが存在していない(mbfid のメッセージバッファが存在しない)
パラメータエラー(msg が不正, tmout≦(-2))
待ちオブジェクトが削除された(待ちの間に対象メッセージバッファが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
tk_rcv_mbf では、mbfid で示されたメッセージバッファからメッセージを受信し、msg で指定した領域に入れる。すなわち、mbfid で指定されたメッセージバッファのメッセージキューの先頭のメッセージの内容を、msg 以下の msgsz バイトにコピーする。
mbfid で示されたメッセージバッファにまだメッセージが送信されていない場合(メッセージキューが空の場合) には、本システ
ムコールを発行したタスクは待ち状態となり、メッセージの到着を待つ待ち行列(受信待ち行列)につながれる。受信待ちタスクの待ち行列はFIFOのみである。
tmout により待ち時間の最大値(タイムアウト値)を指定することができる。tmout の基準時間(時間の単位)はシステム時刻の基準時間(＝1ミリ秒)と同じである。タイムアウト指定が行われた場合、待ち解除の条件が満足されない(メッセージが到着しない)まま tmout の時間が経過すると、タイムアウトエラー E_TMOUT となってシステムコールが終了する。

μT-Kernel 3.0仕様書

173 / 487

tmout として TMO_POL＝0を指定した場合は、タイムアウト値として0を指定したことを示し、メッセージがない場合にも待ちに入らず E_TMOUT を返す。また、tmout として TMO_FEVR＝(-1)を指定した場合は、タイムアウト値として無限大の時間を指定したことを示し、タイムアウトせずにメッセージが到着するまで待ち続ける。

μT-Kernel 3.0仕様書

4.5.2.6

174 / 487

tk_rcv_mbf_u - メッセージバッファから受信(マイクロ秒単位)

C言語インタフェース#include <tk/tkernel.h>
INT msgsz = tk_rcv_mbf_u(ID mbfid, void *msg, TMO_U tmout_u);
パラメータ
ID
void*
TMO_U

mbfid
msg
tmout_u

Message Buffer ID
Receive Message
Timeout

メッセージバッファID
受信メッセージを入れるアドレス
タイムアウト指定(マイクロ秒)

Receive Message Size
Error Code

受信したメッセージのサイズ(バイト数)
エラーコードリターンパラメータ
INT

msgsz
または

エラーコード
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

不正ID番号(mbfid が不正あるいは利用できない)
オブジェクトが存在していない(mbfid のメッセージバッファが存在しない)
パラメータエラー(msg が不正, tmout_u≦(-2))
待ちオブジェクトが削除された(待ちの間に対象メッセージバッファが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

マイクロ秒のサポート

解説
tk_rcv_mbf のパラメータである tmout を64ビットマイクロ秒単位の tmout_u としたシステムコールである。
パラメータが tmout_u となった点を除き、本システムコールの仕様は tk_rcv_mbf と同じである。詳細は tk_rcv_mbf の説明を参照のこと。

μT-Kernel 3.0仕様書

4.5.2.7

175 / 487

tk_ref_mbf - メッセージバッファ状態参照

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_mbf(ID mbfid, T_RMBF *pk_rmbf);
パラメータ
ID
mbfid
T_RMBF* pk_rmbf

Message Buffer ID
Packet to Refer Message Buffer
Status

メッセージバッファID
メッセージバッファ状態を返す領域へのポインタ

Error Code

エラーコードExtended Information
Waiting Task ID
Send Waiting Task ID
Message Size

拡張情報
受信待ちタスクのID
送信待ちタスクのID
次に受信されるメッセージのサイズ(バイト数)空きバッファのサイズ(バイト数)
メッセージの最大長(バイト数)

リターンパラメータER

ercd

pk_rmbf の内容
void*
ID
ID
INT

exinf
wtsk
stsk
msgsz

SZ
frbufsz
Free Buffer SizeINT
maxmszMaximum Message Size──(以下に実装独自に他の情報を追加してもよい)──

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(mbfid が不正あるいは利用できない)
オブジェクトが存在していない(mbfid のメッセージバッファが存在しない)
パラメータエラー(pk_rmbf が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mbfid で示された対象メッセージバッファの各種の状態を参照し、リターンパラメータとして送信待ちタスクのID(stsk)、次に受信されるメッセージのサイズ(msgsz)、空きバッファのサイズ(frbufsz)、メッセージの最大長(maxmsz)、受信待ちタスクのID(wtsk)、拡張情報(exinf) を返す。

μT-Kernel 3.0仕様書

176 / 487

wtsk は、このメッセージバッファで受信待ちしているタスクのIDを示す。また、stsk は送信待ちしているタスクのIDを示す。このメッセージバッファで複数のタスクが待っている場合には、待ち行列の先頭のタスクのIDを返す。待ちタスクが無い場合は0となる。
対象メッセージバッファが存在しない場合には、エラー E_NOEXS となる。
msgsz には、メッセージキューの先頭のメッセージ(次に受信されるメッセージ)のサイズが返る。メッセージキューにメッセージが無い場合には、msgsz＝0となる。なお、サイズが0のメッセージを送ることはできない。
どんな場合でも、msgsz＝0とwtsk＝0の少なくとも一方は成り立つ。
frbufsz は、メッセージキューを構成するリングバッファの空き領域のサイズを示すものである。この値は、あとどの程度の量のメッセージを送信できるかを知る手掛かりになる。
maxmsz には、tk_cre_mbf で指定したメッセージの最大長が返される。

μT-Kernel 3.0仕様書

177 / 487

4.6 メモリプール管理機能
メモリプール管理機能は、ソフトウェアによってメモリプールの管理やメモリブロックの割当てを行うための機能である。
メモリプールには、固定長メモリプールと可変長メモリプールがある。両者は別のオブジェクトであり、操作のためのシステムコールが異なっている。固定長メモリプールから獲得されるメモリブロックはサイズが固定されているのに対して、可変長メモリ
プールから獲得されるメモリブロックでは、任意のブロックサイズを指定することができる。

μT-Kernel 3.0仕様書

178 / 487

4.6.1 固定長メモリプール
固定長メモリプールは、固定されたサイズのメモリブロックを動的に管理するためのオブジェクトである。固定長メモリプール
機能には、固定長メモリプールを生成／削除する機能、固定長メモリプールに対してメモリブロックを獲得／返却する機能、固定長メモリプールの状態を参照する機能が含まれる。固定長メモリプールはID番号で識別されるオブジェクトである。固定長
メモリプールのID番号を固定長メモリプールIDと呼ぶ。
固定長メモリプールは、固定長メモリプールとして利用するメモリ領域(これを固定長メモリプール領域、または単にメモリプー
ル領域と呼ぶ)と、メモリブロックの獲得を待つタスクの待ち行列を持つ。固定長メモリプールからメモリブロックを獲得するタス
クは、メモリプール領域に空きがなくなった場合、次にメモリブロックが返却されるまで固定長メモリブロックの獲得待ち状態となる。固定長メモリブロックの獲得待ち状態になったタスクは、その固定長メモリプールの待ち行列につながれる。
補足事項
固定長メモリプールの場合、何種類かのサイズのメモリブロックが必要となる場合には、サイズ毎に複数のメモリプールを用意する必要がある。

μT-Kernel 3.0仕様書

4.6.1.1

179 / 487

tk_cre_mpf - 固定長メモリプール生成

C言語インタフェース#include <tk/tkernel.h>
ID mpfid = tk_cre_mpf(CONST T_CMPF *pk_cmpf);
パラメータ
CONST T_CMPF*

pk_cmpf

Packet to Create Memory
Pool

固定長メモリプール生成情報

pk_cmpf の内容
void*
exinf
Extended Information
ATR
mpfatr
Memory Pool Attribute
SZ
mpfcntMemory Pool Block Count
SZ
blfsz
Memory Block Size
UB
dsname[8]DS Object namevoid*
bufptrBuffer Pointer──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
メモリプール属性
メモリプール全体のブロック数
固定長メモリブロックサイズ(バイト数)
DSオブジェクト名称
ユーザバッファポインタ

リターンパラメータ
ID

mpfid
または

Memory Pool ID
Error Code

固定長メモリプールID
エラーコードエラーコードE_NOMEM
E_LIMITE_RSATR
E_PAR

メモリ不足(管理ブロックやメモリプール用の領域が確保できない)
固定長メモリプールの数がシステムの上限を超えた
予約属性(mpfatr が不正あるいは利用できない)パラメータエラー(pk_cmpf が不正, mpfcnt, blfsz が負または不正, bufptr が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

TA_USERBUFの固定長メモリプール属性指定が可能
自動バッファ割当て(TA_USERBUFの固定長メモリプール属性指定なし)が可能
固定長メモリプール属性としてTA_NODISWAI(待ち禁止の拒否)が指定可
能
TA_DSNAMEの固定長メモリプール属性指定が可能

μT-Kernel 3.0仕様書

180 / 487

解説
固定長メモリプールを生成し固定長メモリプールIDを割り当てる。具体的には、mpfcnt, blfsz の情報を元に、メモリプールとして利用するメモリ領域を確保する。また、生成したメモリプールに対して管理ブロックを割り付ける。ここで生成されたメモリプールに対して tk_get_mpf システムコールを発行することにより、blfsz のサイズ(バイト数)をもつメモリブロックを獲得することができる。
exinf は、対象メモリプールに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した情報は、tk_ref_mpf
で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい場合や、途中で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf に入れる。カーネルでは exinf の内容について関知しない。
mpfatr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。mpfatr のシステム属性の部分では、次のような指定を行う。
mbxatr:= (TA_TFIFO || TA_TPRI) | [TA_DSNAME] | [TA_USERBUF] | [TA_NODISWAI]| (TA_RNG0 || TA_RNG1 || TA_RNG2 || TA_RNG3)
TA_TFIFO
TA_TPRI
TA_RNGn
TA_DSNAME
TA_USERBUF
TA_NODISWAI# define# define# define# define# define# define# define# define# define

TA_TFIFO
TA_TPRI
TA_USERBUF
TA_DSNAME
TA_NODISWAITA_RNG0
TA_RNG1
TA_RNG2
TA_RNG3

メモリ獲得待ちタスクのキューイングはFIFO
メモリ獲得待ちタスクのキューイングは優先度順
メモリのアクセス制限を保護レベルnとする
DSオブジェクト名称を指定する
メモリプール領域としてユーザが指定した領域を利用する
tk_dis_wai による待ち禁止を拒否する
0 x00000000
0 x00000001
0 x00000020
0 x00000040
0 x00000080
0 x00000000
0 x00000100
0 x00000200
0 x00000300/* 待ちタスクをFIFOで管理 *//* 待ちタスクを優先度順で管理 *//* ユーザバッファポインタを指定 *//* DSオブジェクト名称を指定 *//* 待ち禁止拒否 *//* 保護レベル0 *//* 保護レベル1 *//* 保護レベル2 *//* 保護レベル3 */TA_TFIFO, TA_TPRI では、タスクがメモリ獲得のためにメモリプールの待ち行列に並ぶ際の並び方を指定することができる。属性が TA_TFIFO であればタスクの待ち行列はFIFOとなり、属性が TA_TPRI であればタスクの待ち行列はタスクの優先度順となる。
TA_RNGn では、メモリのアクセスを制限する保護レベルを指定する。指定された保護レベルと同じかより高い保護レベルで実行しているタスクからのみアクセス可能である。低いレベルで実行しているタスクがアクセスするとCPUの保護違反の例外が発生する。例えば、TA_RNG1 を指定して作成したメモリプールから獲得したメモリは、TA_RNG0 や TA_RNG1 で動作しているタス
クからはアクセス可能だが、TA_RNG2 や TA_RNG3 で動作しているタスクからはアクセスできない。
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 エラーとなる。
補足事項
固定長メモリプールの場合、ブロックサイズを変えるためには別のメモリプールを用意しなければならない。すなわち、何種類かのメモリブロックサイズが必要となる場合は、サイズごとに複数のメモリプールを設ける必要がある。
CPUの実行モードがないシステムにおいても、移植性確保のために TA_RNGn 属性を受け付けなければならない。例えば、TA_RNGn の指定はすべて TA_RNG0 相当として処理してもよいが、エラーとはしない。

μT-Kernel 3.0仕様書

181 / 487

移植ガイドライン
T-Kernel 2.0にはTA_USERBUFとbufptrが存在しない。そのため、この機能を使っている場合はT-Kernel 2.0への移植の際に修正が必要となるが、正しくmpfcntとblfszを設定してあれば、TA_USERBUFとbufptrを削除するだけで移植ができる。

μT-Kernel 3.0仕様書

4.6.1.2

182 / 487

tk_del_mpf - 固定長メモリプール削除

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_del_mpf(ID mpfid);
パラメータ
ID

mpfid

Memory Pool ID

固定長メモリプールID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
不正ID番号(mpfid が不正あるいは利用できない)
オブジェクトが存在していない(mpfid の固定長メモリプールが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mpfid で示される固定長メモリプールを削除する。
このメモリプールからメモリを獲得しているタスクが存在しても、そのチェックや通知は行われない。すべてのメモリブロックが返却されていなくても、このシステムコールは正常終了する。
本システムコールの発行により、対象メモリプールのID番号および管理ブロック用の領域やメモリプール本体の領域は解放される。
対象メモリプールにおいてメモリ獲得を待っているタスクがあった場合にも、本システムコールは正常終了するが、待ち状態にあったタスクにはエラー E_DLT が返される。

μT-Kernel 3.0仕様書

4.6.1.3

183 / 487

tk_get_mpf - 固定長メモリブロック獲得

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_get_mpf(ID mpfid, void **p_blf, TMO tmout);
パラメータID
void**

mpfid
p_blf

Memory Pool ID
Pointer to Block Start Address

TMO

tmout

Timeout

固定長メモリプールID
リターンパラメータ blf を返す領域へのポイ
ンタ
タイムアウト指定(ミリ秒)

Error CodeBlock Start Address

エラーコードメモリブロックの先頭アドレス

リターンパラメータ
ER
void*

ercd
blf

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
不正ID番号(mpfid が不正あるいは利用できない)
オブジェクトが存在していない(mpfid の固定長メモリプールが存在しない)
パラメータエラー(tmout≦(-2))
待ちオブジェクトが削除された(待ちの間に対象メモリプールが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mpfid で示される固定長メモリプールからメモリブロックを獲得する。獲得したメモリブロックの先頭アドレスが blf に返される。獲得されるメモリブロックのサイズは、固定長メモリプール生成時に blfsz パラメータで指定された値となる。
獲得したメモリのゼロクリアは行われず、獲得されたメモリブロックの内容は不定となる。
指定したメモリプールからメモリブロックが獲得できなければ、tk_get_mpf 発行タスクがそのメモリプールのメモリ獲得待ち
行列につながれ、メモリを獲得できるようになるまで待つ。
tmout により待ち時間の最大値(タイムアウト値)を指定することができる。tmout の基準時間(時間の単位)はシステム時刻の基準時間(＝1ミリ秒)と同じである。タイムアウト指定が行われた場合、待ち解除の条件が満足されない(空きメモリができな
い)まま tmout の時間が経過すると、タイムアウトエラー E_TMOUT となってシステムコールが終了する。

μT-Kernel 3.0仕様書

184 / 487

tmout として TMO_POL＝0を指定した場合は、タイムアウト値として0を指定したことを示し、メモリが獲得できなかった場合も待ちに入ることなく E_TMOUT を返す。
tmout として TMO_FEVR＝(-1)を指定した場合は、タイムアウト値として無限大の時間を指定したことを示し、タイムアウトせずにメモリが獲得できるまで待ち続ける。
メモリブロック獲得待ちを行う場合の待ち行列の順序は、メモリプールの属性によって、FIFOまたはタスク優先度順のいずれかとなる。

μT-Kernel 3.0仕様書

4.6.1.4

185 / 487

tk_get_mpf_u - 固定長メモリブロック獲得(マイクロ秒単位)

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_get_mpf_u(ID mpfid, void **p_blf, TMO_U tmout_u);
パラメータID
void**

mpfid
p_blf

Memory Pool ID
Pointer to Block Start Address

TMO_U

tmout_u

Timeout

固定長メモリプールID
リターンパラメータ blf を返す領域へのポイ
ンタ
タイムアウト指定(マイクロ秒)

Error CodeBlock Start Address

エラーコードメモリブロックの先頭アドレス

リターンパラメータ
ER
void*

ercd
blf

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
不正ID番号(mpfid が不正あるいは利用できない)
オブジェクトが存在していない(mpfid の固定長メモリプールが存在しない)
パラメータエラー(tmout_u≦(-2))
待ちオブジェクトが削除された(待ちの間に対象メモリプールが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

マイクロ秒のサポート

解説
tk_get_mpf のパラメータである tmout を64ビットマイクロ秒単位の tmout_u としたシステムコールである。
パラメータが tmout_u となった点を除き、本システムコールの仕様は tk_get_mpf と同じである。詳細は tk_get_mpf の説明を参照のこと。

μT-Kernel 3.0仕様書

4.6.1.5

186 / 487

tk_rel_mpf - 固定長メモリブロック返却

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_rel_mpf(ID mpfid, void *blf);
パラメータ
ID
void*

mpfid
blf

Memory Pool ID
Block Start Address

固定長メモリプールID
メモリブロックの先頭アドレス

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(mpfid が不正あるいは利用できない)
オブジェクトが存在していない(mpfid の固定長メモリプールが存在しない)
パラメータエラー(blf が不正, 異なるメモリプールへの返却)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
blf で示されるメモリブロックを、mpfid で示される固定長メモリプールへ返却する。
tk_rel_mpf の実行により、mpfid のメモリプールでメモリを待っていた別のタスクがメモリを獲得し、そのタスクの待ち状態が解除される場合がある。
メモリブロックの返却を行う固定長メモリプールは、メモリブロックの獲得を行った固定長メモリプールと同じものでなければならない。メモリブロックの返却を行うメモリプールが、メモリブロックの獲得を行ったメモリプールと異なっていることが検出された場合には、E_PAR のエラーとなる。ただし、エラーを検出するか否かは実装依存である。

μT-Kernel 3.0仕様書

4.6.1.6

187 / 487

tk_ref_mpf - 固定長メモリプール状態参照

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_mpf(ID mpfid, T_RMPF *pk_rmpf);
パラメータ
ID
mpfid
T_RMPF* pk_rmpf

Memory Pool ID
Packet to Refer Memory Pool
Status

固定長メモリプールID
メモリプール状態を返す領域へのポインタ

Error Code

エラーコードリターンパラメータER

ercd

pk_rmpf の内容
void*
exinf
Extended InformationID
wtsk
Waiting Task ID
SZ
frbcntFree Block Count──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
待ちタスクのID
空き領域のブロック数

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(mpfid が不正あるいは利用できない)
オブジェクトが存在していない(mpfid の固定長メモリプールが存在しない)
パラメータエラー(pk_rmpf が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mpfid で示された対象固定長メモリプールの各種の状態を参照し、リターンパラメータとして現在の空きブロック数(frbcnt)、
待ちタスクのID(wtsk)、拡張情報(exinf) を返す。
wtsk は、この固定長メモリプールで待っているタスクのIDを示す。この固定長メモリプールで複数のタスクが待っている場合には、待ち行列の先頭のタスクのIDを返す。待ちタスクが無い場合は wtsk＝0となる。
tk_ref_mpf で、対象固定長メモリプールが存在しない場合には、エラー E_NOEXS となる。
どんな場合でも、frbcnt＝0とwtsk＝0の少なくとも一方は成り立つ。

μT-Kernel 3.0仕様書

188 / 487

補足事項
tk_ref_mpl の frsz ではメモリの空き領域の合計サイズがバイト数で返るのに対して、tk_ref_mpf の frbcnt では空きブロ
ックの数が返る。

μT-Kernel 3.0仕様書

189 / 487

4.6.2 可変長メモリプール
可変長メモリプールは、任意のサイズのメモリブロックを動的に管理するためのオブジェクトである。可変長メモリプール機能には、可変長メモリプールを生成／削除する機能、可変長メモリプールに対してメモリブロックを獲得／返却する機能、可変長
メモリプールの状態を参照する機能が含まれる。可変長メモリプールはID番号で識別されるオブジェクトである。可変長メモ
リプールのID番号を可変長メモリプールIDと呼ぶ。
可変長メモリプールは、可変長メモリプールとして利用するメモリ領域(これを可変長メモリプール領域、または単にメモリプー
ル領域と呼ぶ)と、メモリブロックの獲得を待つタスクの待ち行列を持つ。可変長メモリプールからメモリブロックを獲得するタス
クは、メモリプール領域の空き領域が足りなくなった場合、十分なサイズのメモリブロックが返却されるまで可変長メモリブロックの獲得待ち状態となる。可変長メモリブロックの獲得待ち状態になったタスクは、その可変長メモリプールの待ち行列につな
がれる。
補足事項
可変長メモリプールでメモリブロックの獲得を待っているタスクは、待ち行列につながれている順序でメモリブロックを獲得する。例えば、ある可変長メモリプールに対して400バイトのメモリブロックを獲得しようとしているタスクAと、100バイトのメ
モリブロックを獲得しようとしているタスクBが、この順で待ち行列につながれている時に、別のタスクからのメモリブロックの返却により200バイトの連続空きメモリ領域ができたとする。このような場合でも、タスクAがメモリブロックを獲得するまで、タスクBはメモリブロックを獲得できない。

μT-Kernel 3.0仕様書

4.6.2.1

190 / 487

tk_cre_mpl - 可変長メモリプール生成

C言語インタフェース#include <tk/tkernel.h>
ID mplid = tk_cre_mpl(CONST T_CMPL *pk_cmpl);
パラメータ
CONST T_CMPL*

pk_cmplPacket to Create Memory
Pool

可変長メモリプール生成情報

pk_cmpl の内容
void*
exinf
Extended Information
ATR
mplatr
Memory Pool Attribute
SZ
mplsz
Memory Pool Size
UB
dsname[8]DS Object namevoid*
bufptrBuffer Pointer──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
メモリプール属性
メモリプール全体のサイズ(バイト数)
DSオブジェクト名称
ユーザバッファポインタ

リターンパラメータ
ID

mplid
または

Memory Pool ID
Error Code

可変長メモリプールID
エラーコードエラーコードE_NOMEM
E_LIMITE_RSATR
E_PAR

メモリ不足(管理ブロックやメモリプール用の領域が確保できない)
可変長メモリプールの数がシステムの上限を超えた
予約属性(mplatr が不正あるいは利用できない)パラメータエラー(pk_cmpl が不正, mplsz が負または不正, bufptr が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

TA_USERBUFの可変長メモリプール属性指定が可能
自動バッファ割当て(TA_USERBUFの可変長メモリプール属性指定なし)が可能
可変長メモリプール属性としてTA_NODISWAI(待ち禁止の拒否)が指定可
能
TA_DSNAMEの可変長メモリプール属性指定が可能

μT-Kernel 3.0仕様書

191 / 487

解説
可変長メモリプールを生成し可変長メモリプールIDを割り当てる。具体的には、mplsz の情報を元に、メモリプールとして利用するメモリ領域を確保する。また、生成したメモリプールに対して管理ブロックを割り付ける。
exinf は、対象メモリプールに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した情報は、tk_ref_mpl
で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい場合や、途中で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf に入れる。カーネルでは exinf の内容について関知しない。
mplatr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。mplatr のシステム属性の部分では、次のような指定を行う。
mplatr := (TA_TFIFO || TA_TPRI) | [TA_DSNAME] | [TA_USERBUF] | [TA_NODISWAI]| (TA_RNG0 || TA_RNG1 || TA_RNG2 || TA_RNG3)
TA_TFIFO
TA_TPRI
TA_RNGn
TA_DSNAME
TA_USERBUF
TA_NODISWAI# define# define# define# define# define# define# define# define# define

TA_TFIFO
TA_TPRI
TA_USERBUF
TA_DSNAME
TA_NODISWAITA_RNG0
TA_RNG1
TA_RNG2
TA_RNG3

メモリ獲得待ちタスクのキューイングはFIFO
メモリ獲得待ちタスクのキューイングは優先度順
メモリのアクセス制限を保護レベルnとする
DSオブジェクト名称を指定する
メモリプール領域としてユーザが指定した領域を利用する
tk_dis_wai による待ち禁止を拒否する
0 x00000000
0 x00000001
0 x00000020
0 x00000040
0 x00000080
0 x00000000
0 x00000100
0 x00000200
0 x00000300/* 待ちタスクをFIFOで管理 *//* 待ちタスクを優先度順で管理 *//* ユーザバッファポインタを指定 *//* DSオブジェクト名称を指定 *//* 待ち禁止拒否 *//* 保護レベル0 *//* 保護レベル1 *//* 保護レベル2 *//* 保護レベル3 */TA_TFIFO, TA_TPRI では、タスクがメモリ獲得のためにメモリプールの待ち行列に並ぶ際の並び方を指定することができる。属性が TA_TFIFO であればタスクの待ち行列はFIFOとなり、属性が TA_TPRI であればタスクの待ち行列はタスクの優先度順となる。
タスクがメモリ獲得待ちの行列を作った場合は、待ち行列先頭のタスクに優先してメモリを割り当てる。待ち行列の２番目以降
により少ないメモリサイズを要求しているタスクがあった場合も、そのタスクが先にメモリを獲得することはない。例えば、ある可変長メモリプールに対して 要求メモリサイズ＝400のタスクAと要求メモリサイズ＝100のタスクBがこの順で待っており、別のタスクの tk_rel_mpl により メモリサイズ＝200の連続空きメモリ領域ができたとする。このとき、行列の先頭ではないが要求サイズの少ないタスクBが先にメモリを獲得することはない。
TA_RNGn では、メモリのアクセスを制限する保護レベルを指定する。指定された保護レベルと同じかより高い保護レベルで実行しているタスクからのみアクセス可能である。低いレベルで実行しているタスクがアクセスするとCPUの保護違反の例外が発生する。例えば、TA_RNG1 を指定して作成したメモリプールから獲得したメモリは、TA_RNG0 や TA_RNG1 で動作しているタス
クからはアクセス可能だが、TA_RNG2 や TA_RNG3 で動作しているタスクからはアクセスできない。
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 エラーとなる。
補足事項
メモリ獲得待ち行列の先頭のタスクの待ちが強制解除されたり、タスク優先度が変更されるなどで待ち行列の順序が変化した場合は、新たに待ち行列の先頭になったタスクに対してメモリ割当てが試みられる。メモリを割り当てることができれば、その

μT-Kernel 3.0仕様書

192 / 487

タスクの待ちは解除される。したがって、tk_rel_mpl によるメモリの解放がなくても、状況によってはメモリの獲得が行われ、待ちが解除される場合がある。
CPUの実行モードがないシステムにおいても、移植性確保のために TA_RNGn 属性を受け付けなければならない。例えば、TA_RNGn の指定はすべて TA_RNG0 相当として処理してもよいが、エラーとはしない。
仕様決定の理由
複数個の可変長メモリプールを設ける機能は、エラー処理時や緊急時などにメモリを確保するためのメモリプールを分離しておくために利用できる。
移植ガイドライン
T-Kernel 2.0にはTA_USERBUFとbufptrが存在しない。そのため、この機能を使っている場合はT-Kernel 2.0への移植の際に修正が必要となるが、正しくmplszを設定してあれば、TA_USERBUFとbufptrを削除するだけで移植ができる。

μT-Kernel 3.0仕様書

4.6.2.2

193 / 487

tk_del_mpl - 可変長メモリプール削除

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_del_mpl(ID mplid);
パラメータ
ID

mplid

Memory Pool ID

可変長メモリプールID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
不正ID番号(mplid が不正あるいは利用できない)
オブジェクトが存在していない(mplid の可変長メモリプールが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mplid で示される可変長メモリプールを削除する。
このメモリプールからメモリを獲得しているタスクが存在しても、そのチェックや通知は行われない。すべてのメモリブロックが返却されていなくても、このシステムコールは正常終了する。
本システムコールの発行により、対象メモリプールのID番号および管理ブロック用の領域やメモリプール本体の領域は解放される。
対象メモリプールにおいてメモリ獲得を待っているタスクがあった場合にも、本システムコールは正常終了するが、待ち状態にあったタスクにはエラー E_DLT が返される。

μT-Kernel 3.0仕様書

4.6.2.3

194 / 487

tk_get_mpl - 可変長メモリブロック獲得

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_get_mpl(ID mplid, SZ blksz, void **p_blk, TMO tmout);
パラメータ
ID
SZ
void**

mplid
blksz
p_blk

Memory Pool ID
Memory Block Size
Pointer to Block Start Address

TMO

tmout

Timeout

可変長メモリプールID
メモリブロックサイズ(バイト数)
リターンパラメータ blk を返す領域へのポイ
ンタ
タイムアウト指定(ミリ秒)

Error CodeBlock Start Address

エラーコードメモリブロックの先頭アドレス

リターンパラメータ
ER
void*

ercd
blk

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
不正ID番号(mplid が不正あるいは利用できない)
オブジェクトが存在していない(mplid の可変長メモリプールが存在しない)
パラメータエラー(tmout≦(-2))
待ちオブジェクトが削除された(待ちの間に対象メモリプールが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mplid で示される可変長メモリプールから、blksz で指定されるサイズ(バイト数)のメモリブロックを獲得する。獲得したメモリ
ブロックの先頭アドレスが blk に返される。
獲得したメモリのゼロクリアは行われず、獲得されたメモリブロックの内容は不定となる。
メモリが獲得できなければ、本システムコールを発行したタスクは待ち状態に入る。

μT-Kernel 3.0仕様書

195 / 487

tmout により待ち時間の最大値(タイムアウト値)を指定することができる。tmout の基準時間(時間の単位)はシステム時刻の基準時間(＝1ミリ秒)と同じである。タイムアウト指定が行われた場合、待ち解除の条件が満足されない(空きメモリができな
い)まま tmout の時間が経過すると、タイムアウトエラー E_TMOUT となってシステムコールが終了する。
tmout として TMO_POL＝0を指定した場合は、タイムアウト値として0を指定したことを示し、メモリが獲得できなかった場合も待ちに入ることなく E_TMOUT を返す。
tmout として TMO_FEVR＝(-1)を指定した場合は、タイムアウト値として無限大の時間を指定したことを示し、タイムアウトせずにメモリが獲得できるまで待ち続ける。
メモリブロック獲得待ちを行う場合の待ち行列の順序は、メモリプールの属性によって、FIFOまたはタスク優先度順のいずれかとなる。

μT-Kernel 3.0仕様書

4.6.2.4

196 / 487

tk_get_mpl_u - 可変長メモリブロック獲得(マイクロ秒単位)

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_get_mpl_u(ID mplid, SZ blksz, void **p_blk, TMO_U tmout_u);
パラメータ
ID
SZ
void**

mplid
blksz
p_blk

Memory Pool ID
Memory Block Size
Pointer to Block Start Address

TMO_U

tmout_u

Timeout

可変長メモリプールID
メモリブロックサイズ(バイト数)
リターンパラメータ blk を返す領域へのポイ
ンタ
タイムアウト指定(マイクロ秒)

Error CodeBlock Start Address

エラーコードメモリブロックの先頭アドレス

リターンパラメータ
ER
void*

ercd
blk

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR
E_DLT
E_RLWAIE_DISWAI
E_TMOUT
E_CTX

正常終了
不正ID番号(mplid が不正あるいは利用できない)
オブジェクトが存在していない(mplid の可変長メモリプールが存在しない)
パラメータエラー(tmout_u≦(-2))
待ちオブジェクトが削除された(待ちの間に対象メモリプールが削除)
待ち状態強制解除(待ちの間に tk_rel_wai を受け付け)
待ち禁止による待ち解除
ポーリング失敗またはタイムアウト
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

マイクロ秒のサポート

解説
tk_get_mpl のパラメータである tmout を64ビットマイクロ秒単位の tmout_u としたシステムコールである。
パラメータが tmout_u となった点を除き、本システムコールの仕様は tk_get_mpl と同じである。詳細は tk_get_mpl の説明を参照のこと。

μT-Kernel 3.0仕様書

4.6.2.5

197 / 487

tk_rel_mpl - 可変長メモリブロック返却

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_rel_mpl(ID mplid, void *blk);
パラメータ
ID
void*

mplid
blk

Memory Pool ID
Block Start Address

可変長メモリプールID
メモリブロックの先頭アドレス

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(mplid が不正あるいは利用できない)
オブジェクトが存在していない(mplid の可変長メモリプールが存在しない)
パラメータエラー(blk が不正, 異なるメモリプールへの返却)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
blk で示されるメモリブロックを、mplid で示される可変長メモリプールへ返却する。
tk_rel_mpl の実行により、mplid のメモリプールでメモリを待っていた別のタスクがメモリを獲得し、そのタスクの待ち状態が解除される場合がある。
メモリブロックの返却を行う可変長メモリプールは、メモリブロックの獲得を行った可変長メモリプールと同じものでなければならない。メモリブロックの返却を行うメモリプールが、メモリブロックの獲得を行ったメモリプールと異なっていることが検出された場合には、E_PAR のエラーとなる。ただし、エラーを検出するか否かは実装依存である。
補足事項
複数のタスクが待っている可変長メモリプールに対してメモリを返却する場合は、要求メモリ数との関係により、複数のタスクが同時に待ち解除となることがある。この場合の待ち解除後のタスクの優先順位は、同じ優先度を持つタスクの間では待ち行列に並んでいたときと同じ順序となる。

μT-Kernel 3.0仕様書

4.6.2.6

198 / 487

tk_ref_mpl - 可変長メモリプール状態参照

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_mpl(ID mplid, T_RMPL *pk_rmpl);
パラメータ
ID
mplid
T_RMPL* pk_rmpl

Memory Pool ID
Packet to Refer Memory Pool
Status可変長メモリプールID
メモリプール状態を返す領域へのポインタ

Error Code

エラーコードリターンパラメータER

ercd

pk_rmpl の内容
void*
exinf
Extended InformationID
wtsk
Waiting Task ID
SZ
frsz
Free Memory Size
SZ
maxsz
Max Memory Size──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
待ちタスクのID
空き領域の合計サイズ(バイト数)
最大の空き領域のサイズ(バイト数)

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(mplid が不正あるいは利用できない)
オブジェクトが存在していない(mplid の可変長メモリプールが存在しない)
パラメータエラー(pk_rmpl が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
mplid で示された対象可変長メモリプールの各種の状態を参照し、リターンパラメータとして現在の空き領域の合計サイズ(frsz)、すぐに獲得可能な最大の空き領域のサイズ(maxsz)、待ちタスクのID(wtsk)、拡張情報(exinf) を返す。
wtsk は、この可変長メモリプールで待っているタスクのIDを示す。この可変長メモリプールで複数のタスクが待っている場合には、待ち行列の先頭のタスクのIDを返す。待ちタスクが無い場合は wtsk＝0となる。
tk_ref_mpl で、対象可変長メモリプールが存在しない場合には、エラー E_NOEXS となる。

μT-Kernel 3.0仕様書

199 / 487

4.7 時間管理機能
時間管理機能は、時間に依存した処理を行うための機能である。システム時刻管理、周期ハンドラ、アラームハンドラの各機能が含まれる。
周期ハンドラとアラームハンドラを総称して、タイムイベントハンドラと呼ぶ。

μT-Kernel 3.0仕様書

200 / 487

4.7.1 システム時刻管理
システム時刻とは、μ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と共通である。

μT-Kernel 3.0仕様書

4.7.1.1

201 / 487

tk_set_utc - システム時刻設定

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_set_utc(CONST SYSTIM *pk_tim);
パラメータ
CONST SYSTIM*

pk_timPacket of Current Time

現在時刻(ミリ秒)を示すパケット

W

hiHigh 32bits

UW

lo

Low 32bits

システム時刻設定用現在時刻の上位32ビット
システム時刻設定用現在時刻の
下位32ビット

ercd

Error Codepk_tim の内容

リターンパラメータ
ER

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

E_OK
E_PAR
利用可能なコンテキスト

タスク部
○

準タスク部
○

タスク独立部×

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

UNIX表現のシステム時刻のサポート

解説
システム時刻の値を pk_tim で示される値に設定する。
システム時刻は、1970年1月1日0時0分0秒(UTC)からの通算のミリ秒数として表現される。
補足事項
システムの動作中に tk_set_utc を使ってシステム時刻を変更した場合にも、RELTIMやTMOで指定された相対時間は変化しない。たとえば、60秒後にタイムアウトするように指定し、タイムアウト待ちの間に tk_set_utc を実行してシステム時刻を60秒進めたとしても、その時点で即座にタイムアウトすることはない。tk_set_utc を実行しなかった場合と同じく、タイムアウト

μT-Kernel 3.0仕様書

202 / 487

待ちを始めてから60秒後にタイムアウトする。一方、タイムアウトした時点でのシステム時刻を参照すると、tk_set_utc を実行した場合と実行しなかった場合では異なっている。
tk_set_utc の pk_tim により設定される時刻が、タイマ割込み周期の時間によって制約を受けることはないが、その後の
tk_get_utc で読み出される時刻は、タイマ割込み周期の時間分解能で変化する。たとえば、タイマ割込み周期が10ミリ秒のシステムにおいて、tk_set_utc で10005(ミリ秒)の時刻を設定した場合に、その後の tk_get_utc で得られる時刻は、
10005(ミリ秒)→10015(ミリ秒)→10025(ミリ秒)のように変化する。

μT-Kernel 3.0仕様書

4.7.1.2

203 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_set_utc_u(SYSTIM_U tim_u);
パラメータ
SYSTIM_U

tim_u

Current Time

現在時刻(マイクロ秒)

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(tim_u が不正, 設定時間が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

UNIX表現のシステム時刻のサポート
マイクロ秒のサポート

解説
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 の説明を参照のこと。

μT-Kernel 3.0仕様書

4.7.1.3

204 / 487

tk_set_tim - システム時刻設定(TRON表現)

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_set_tim(CONST SYSTIM *pk_tim);
パラメータ
CONST SYSTIM*

pk_timPacket of Current Time

現在時刻(ミリ秒)を示すパケット

W

hiHigh 32bits

UW

lo

Low 32bits

システム時刻設定用現在時刻の上位32ビット
システム時刻設定用現在時刻の
下位32ビット

ercd

Error Codepk_tim の内容

リターンパラメータ
ER

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

E_OK
E_PAR
利用可能なコンテキスト

タスク部
○

準タスク部
○

タスク独立部×

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

TRON表現のシステム時刻のサポート

解説
システム時刻の値を 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である。

μT-Kernel 3.0仕様書

4.7.1.4

205 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_set_tim_u(SYSTIM_U tim_u);
パラメータ
SYSTIM_U

tim_u

Current Time

現在時刻(マイクロ秒)

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(tim_u が不正, 設定時間が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

TRON表現のシステム時刻のサポート
マイクロ秒のサポート

解説
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である。

μT-Kernel 3.0仕様書

4.7.1.5

206 / 487

tk_get_utc - システム時刻参照

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_get_utc(SYSTIM *pk_tim);
パラメータ
SYSTIM* pk_tim

Packet of Current Time

現在時刻(ミリ秒)を返す領域へのポインタ

Error Code

エラーコードHigh 32bits
Low 32bits

システムの現在時刻の上位32ビットシステムの現在時刻の下位32ビット

リターンパラメータ
ER

ercd

pk_tim の内容
W
UW

hi
lo

エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(pk_tim が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

UNIX表現のシステム時刻のサポート

解説
システム時刻の現在の値を読み出し、リターンパラメータ pk_tim に返す。
システム時刻は、1970年1月1日0時0分0秒(UTC)からの通算のミリ秒数として表現される。
補足事項
一般に、本APIで読み出されるシステム時刻は、タイマ割込み間隔(周期)ごとに変化する。そのため、タイマ割込み間隔(周期)より短い時間経過を知ることはできない。詳細は tk_set_utc の補足事項を参照。タイマ割込み間隔(周期)よりも短い時間経
過を知る必要がある場合は、tk_get_utc_u または td_get_utc の ofs を利用する。

μT-Kernel 3.0仕様書

4.7.1.6

207 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_get_utc_u(SYSTIM_U *tim_u, UW *ofs);
パラメータ
SYSTIM_U*

tim_u

Time

UW*

ofs

Offset

ercd
tim_u
ofs

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

リターンパラメータ
ER
SYSTIM_U
UW

エラーコード
現在時刻(マイクロ秒)
tim_u からの相対的な経過時間(ナノ秒)

エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(tim_u, ofs が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

UNIX表現のシステム時刻のサポート
マイクロ秒のサポート

解説
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 の説明を参照のこと。

μT-Kernel 3.0仕様書

4.7.1.7

208 / 487

tk_get_tim - システム時刻参照(TRON表現)

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_get_tim(SYSTIM *pk_tim);
パラメータ
SYSTIM* pk_tim

Packet of Current Time

現在時刻(ミリ秒)を返す領域へのポインタ

Error Code

エラーコードHigh 32bits
Low 32bits

システムの現在時刻の上位32ビットシステムの現在時刻の下位32ビット

リターンパラメータ
ER

ercd

pk_tim の内容
W
UW

hi
lo

エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(pk_tim が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

TRON表現のシステム時刻のサポート

解説
システム時刻の現在の値を読み出し、リターンパラメータ 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である。

μT-Kernel 3.0仕様書

4.7.1.8

209 / 487

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

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

ercd
tim_u
ofs

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

リターンパラメータ
ER
SYSTIM_U
UW

エラーコード
現在時刻(マイクロ秒)
tim_u からの相対的な経過時間(ナノ秒)

エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(tim_u, ofs が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

TRON表現のシステム時刻のサポート
マイクロ秒のサポート

解説
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 の説明を参照のこと。

μT-Kernel 3.0仕様書

210 / 487

補足事項
tk_get_tim_u は tk_get_utc_u と同等の機能を持つAPIであるが、システム時刻の起点とする日時のみが異なっている。tk_get_tim_u は、旧バージョンのμT-KernelやT-Kernelとの互換性を維持するためのAPIである。

μT-Kernel 3.0仕様書

4.7.1.9

211 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_get_otm(SYSTIM *pk_tim);
パラメータ
SYSTIM* pk_tim

Packet of Operating Time

稼働時間(ミリ秒)を返す領域へのポインタ

Error Code

エラーコードHigh 32bits
Low 32bits

システム稼働時間の上位32ビット
システム稼働時間の下位32ビット

リターンパラメータ
ER

ercd

pk_tim の内容
W
UW

hi
lo

エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(pk_tim が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
システム稼働時間を取得する。
システム稼働時間はシステム時刻(時刻)と異なり、システム起動時からの単純増加する稼働時間を表す。tk_set_utc や
tk_set_tim による時刻設定に影響されない。
システム稼働時間はシステム時刻と同じ精度でなければならない。

μT-Kernel 3.0仕様書

212 / 487

4.7.1.10 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

ercd
tim_u
ofs

Error CodeTime
Offset

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

リターンパラメータ
ER
SYSTIM_U
UW

エラーコード稼働時間(マイクロ秒)
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 の分解能は実装依存であるが、一般にはハードウェアタイマの分解能となる。
ofs＝NULL とした場合には、ofs の情報は格納されない。
上記の点を除き、本システムコールの仕様は tk_get_otm と同じである。また、tim_u のデータタイプがSYSTIM_Uとなっている点を除き、本システムコールの仕様は td_get_otm と同じである。詳細は tk_get_otm および td_get_otm の説明を参照のこと。

μT-Kernel 3.0仕様書

213 / 487

4.7.2 周期ハンドラ
周期ハンドラは、一定周期で起動されるタイムイベントハンドラである。周期ハンドラ機能には、周期ハンドラを生成／削除する
機能、周期ハンドラの動作を開始／停止する機能、周期ハンドラの状態を参照する機能が含まれる。周期ハンドラはID番号で識別されるオブジェクトである。周期ハンドラのID番号を周期ハンドラIDと呼ぶ。
周期ハンドラの起動周期と起動位相は、周期ハンドラの生成時に、周期ハンドラ毎に設定することができる。カーネルは、周期ハンドラの操作時に、設定された起動周期と起動位相から、周期ハンドラを次に起動すべき時刻を決定する。周期ハンドラの生成時には、周期ハンドラを生成した時刻に起動位相を加えた時刻を、次に起動すべき時刻とする。周期ハンドラを起動すべ
き時刻になると、その周期ハンドラの拡張情報(exinf)をパラメータとして、周期ハンドラを起動する。またこの時、周期ハンドラの起動すべき時刻に起動周期を加えた時刻を、次に起動すべき時刻とする。また、周期ハンドラの動作を開始する時に、次に起動すべき時刻を決定しなおす場合がある。
周期ハンドラの起動位相は、起動周期以下であることを原則とする。起動位相に、起動周期よりも長い時間が指定された場合の振舞いは、実装依存とする。
周期ハンドラは、動作している状態か動作していない状態かのいずれかの状態をとる。周期ハンドラが動作していない状態の時には、周期ハンドラを起動すべき時刻となっても周期ハンドラを起動せず、次に起動すべき時刻の決定のみを行う。周期ハンドラの動作を開始するシステムコール(tk_sta_cyc)が呼び出されると、周期ハンドラを動作している状態に移行させ、必要なら周期ハンドラを次に起動すべき時刻を決定しなおす。周期ハンドラの動作を停止するシステムコール(tk_stp_cyc)が呼び出されると、周期ハンドラを動作していない状態に移行させる。周期ハンドラを生成した後にどちらの状態になるかは、周期ハンドラ
属性によって決めることができる。
周期ハンドラの起動位相は、周期ハンドラを生成するシステムコールが呼び出された時刻を基準に、周期ハンドラを最初に起動する時刻を指定する相対時間と解釈する。周期ハンドラの起動周期は、周期ハンドラを(起動した時刻ではなく)起動すべきであった時刻を基準に、周期ハンドラを次に起動する時刻を指定する相対時間と解釈する。そのため、周期ハンドラが起動される時刻の間隔は、個々には起動周期よりも短くなる場合があるが、長い期間で平均すると起動周期に一致する。
補足事項
μT-Kernelの時間管理機能の処理における実際の時間分解能は、項5.6.2. 「標準システム構成情報」の「タイマ割込み
間隔」(TTimPeriod)によって指定されたものとなる。すなわち、周期ハンドラやアラームハンドラが実際に起動される時刻
も、タイマ割込み間隔(TTimPeriod)の分解能にしたがったものとなる。このため、周期ハンドラが実際に起動されるのは、周期ハンドラを起動すべき時刻の直後のタイマ割込みの時点である。μT-Kernelの一般的な実装においては、タイマ割込みの処理の中で起動すべき周期ハンドラやアラームハンドラの有無を検出し、必要に応じてそれらのハンドラを起動する。

μT-Kernel 3.0仕様書

4.7.2.1

214 / 487

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
cycatrCyclic Handler AttributeFP
cychdrCyclic Handler Address
RELTIM
cyctimCycle TimeRELTIM
cycphsCycle Phase
UB
dsname[8]DS Object name──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
周期ハンドラ属性
周期ハンドラアドレス
周期起動時間間隔(ミリ秒)
周期起動位相(ミリ秒)DSオブジェクト名称

リターンパラメータ
ID

cycid
または

Cyclic Handler ID
Error Code

周期ハンドラID
エラーコードエラーコードE_NOMEM
E_LIMITE_RSATR
E_PAR

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

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

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

解説
周期ハンドラを生成し周期ハンドラIDを割り当てる。具体的には、生成された周期ハンドラに対して管理ブロックを割り付ける。
周期ハンドラは、指定した時間間隔で動くタスク独立部のハンドラである。

μT-Kernel 3.0仕様書

215 / 487

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# define# define# define# define# define

TA_ASM
TA_HLNG
TA_STA
TA_PHS
TA_DSNAME

対象ハンドラがアセンブリ言語で書かれている
対象ハンドラが高級言語で書かれている
周期ハンドラ生成後直ちに起動する
起動位相を保存する
DSオブジェクト名称を指定する
0 x00000000
0 x00000001
0 x00000002
0 x00000004
0 x00000040/* アセンブリ言語によるプログラム *//* 高級言語によるプログラム *//* 周期ハンドラ起動 *//* 周期ハンドラ起動位相を保存 *//* 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)となった場合でも、周期ハンドラ実行中はディスパッチ(実行タスクの切り替え)が起こらない。ディスパッチングが必要になっても、まず周期ハンドラを最後まで実行することが優先され、周期ハンドラを終了する時にはじめてディスパッチが行われる。すなわち、周期ハンドラ実行中に生じたディスパッチ要求はすぐに処理されず、周期ハンドラ終了までディスパッチが遅らされる。これを遅延ディスパッチの原則と呼ぶ。

μT-Kernel 3.0仕様書

216 / 487

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

μT-Kernel 3.0仕様書

4.7.2.2

217 / 487

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
cycatrCyclic Handler AttributeFP
cychdrCyclic Handler Address
RELTIM_U
cyctim_u
Cycle TimeRELTIM_U
cycphs_u
Cycle Phase
UB
dsname[8]DS Object name──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
周期ハンドラ属性
周期ハンドラアドレス
周期起動時間間隔(マイクロ秒)
周期起動位相(マイクロ秒)
DSオブジェクト名称

リターンパラメータ
ID

cycid
または

Cyclic Handler ID
Error Code

周期ハンドラID
エラーコードエラーコードE_NOMEM
E_LIMITE_RSATR
E_PAR

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

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

マイクロ秒のサポート

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

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

μT-Kernel 3.0仕様書

218 / 487

解説
tk_cre_cyc のパラメータである cyctim と cycphs を64ビットマイクロ秒単位の cyctim_u, cycphs_u としたシステムコール
である。
パラメータが cyctim_u, cycphs_u となった点を除き、本システムコールの仕様は tk_cre_cyc と同じである。詳細は
tk_cre_cyc の説明を参照のこと。

μT-Kernel 3.0仕様書

4.7.2.3

219 / 487

tk_del_cyc - 周期ハンドラの削除

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_del_cyc(ID cycid);
パラメータ
ID

cycid

Cyclic Handler ID

周期ハンドラID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

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

利用可能なコンテキスト
タスク部○
関連するサービスプロファイル
なし
解説
周期ハンドラを削除する。

準タスク部
○

タスク独立部×μT-Kernel 3.0仕様書

4.7.2.4

220 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_sta_cyc(ID cycid);
パラメータ
ID

cycid

Cyclic Handler ID

周期ハンドラID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

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

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
なし
解説
周期ハンドラを動作状態にする。
TA_PHS 属性を指定している場合は、周期ハンドラの起動周期はリセットされず、周期ハンドラを動作状態にする。すでに動作状態であれば何もせずに動作状態を維持する。
TA_PHS 属性を指定していない場合は、起動周期をリセットして、周期ハンドラを動作状態にする。すでに、動作状態であれば起動周期のリセットをした上で、動作状態を維持する。したがって、次に周期ハンドラが起動されるのは、cyctim 後となる。

μT-Kernel 3.0仕様書

4.7.2.5

221 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_stp_cyc(ID cycid);
パラメータ
ID

cycid

Cyclic Handler ID

周期ハンドラID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

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

利用可能なコンテキスト
タスク部
○

準タスク部
○

関連するサービスプロファイル
なし
解説
周期ハンドラを動作していない状態にする。すでに動作していない状態であれば何もしない。

タスク独立部
○

μT-Kernel 3.0仕様書

4.7.2.6

222 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_cyc(ID cycid, T_RCYC *pk_rcyc);
パラメータ
ID
cycid
T_RCYC* pk_rcyc

Cyclic Handler ID
Packet to Refer Cyclic Handler
Status

周期ハンドラID
周期ハンドラの状態を返す領域へのポインタ

Error Code

エラーコードリターンパラメータ
ERercd

pk_rcyc の内容
void*
exinf
Extended Information
RELTIM lfttim
Left Time
UINT
cycstatCyclic Handler Status──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
次のハンドラ起動までの残り時間(ミリ秒)
周期ハンドラの状態

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(cycid が不正あるいは利用できない)
オブジェクトが存在していない(cycid の周期ハンドラが存在していない)
パラメータエラー(pk_rcyc が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
なし
解説
cycid で示された周期ハンドラの状態を参照し、周期ハンドラの状態(cycstat)、次のハンドラ起動までの残り時間(lfttim)、
拡張情報(exinf)をリターンパラメータとして返す。
cycstat には次の情報が返される。
cycstat := (TCYC_STP | TCYC_STA)

μT-Kernel 3.0仕様書# define TCYC_STP# define TCYC_STA

223 / 487

0 x00
0 x01

/* 周期ハンドラが動作していない *//* 周期ハンドラが動作している */lfttim には、次に周期ハンドラが起動される予定の時刻までの残り時間(ミリ秒)が返される。周期ハンドラが現在起動中か停止中かは関係しない。
exinf には、周期ハンドラを生成する際のパラメータとして指定された拡張情報が返される。exinf は周期ハンドラに引数として渡される。
tk_ref_cyc で、cycid の周期ハンドラが存在していない場合には、エラー E_NOEXS となる。
周期ハンドラ状態情報(T_RCYC)における残り時間 lfttim は、ミリ秒単位に切り上げた値(単位ミリ秒)を返す。マイクロ秒単位の情報を知りたい場合には、tk_ref_cyc_u を使う。

μT-Kernel 3.0仕様書

4.7.2.7

224 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_cyc_u(ID cycid, T_RCYC_U *pk_rcyc_u);
パラメータ
ID
T_RCYC_U*

cycid
pk_rcyc_u

Cyclic Handler ID
Packet to Refer Cyclic
Handler Status

周期ハンドラID
周期ハンドラの状態を返す領域へのポイ
ンタ

ercd

Error Code

エラーコードexinf
lfttim_u

Extended Information
Left Time

拡張情報
次のハンドラ起動までの残り時間(マイクロ秒)
周期ハンドラの状態

リターンパラメータER
pk_rcyc_u の内容
void*
RELTIM_U

UINT
cycstatCyclic Handler Status──(以下に実装独自に他の情報を追加してもよい)──

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(cycid が不正あるいは利用できない)
オブジェクトが存在していない(cycid の周期ハンドラが存在していない)
パラメータエラー(pk_rcyc_u が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

マイクロ秒のサポート

解説
tk_ref_cyc のリターンパラメータである lfttim を64ビットマイクロ秒単位の lfttim_u としたシステムコールである。
リターンパラメータが lfttim_u となった点を除き、本システムコールの仕様は tk_ref_cyc と同じである。詳細は tk_ref_cycの説明を参照のこと。

μT-Kernel 3.0仕様書

225 / 487

4.7.3 アラームハンドラ
アラームハンドラは、指定した時刻に起動されるタイムイベントハンドラである。アラームハンドラ機能には、アラームハンドラを生成／削除する機能、アラームハンドラの動作を開始／停止する機能、アラームハンドラの状態を参照する機能が含まれる。
アラームハンドラはID番号で識別されるオブジェクトである。アラームハンドラのID番号をアラームハンドラIDと呼ぶ。
アラームハンドラを起動する時刻(これをアラームハンドラの起動時刻と呼ぶ)は、アラームハンドラ毎に設定することができる。
アラームハンドラの起動時刻になると、そのアラームハンドラの拡張情報(exinf)をパラメータとして、アラームハンドラを起動する。
アラームハンドラの生成直後には、アラームハンドラの起動時刻は設定されておらず、アラームハンドラの動作は停止している。アラームハンドラの動作を開始するシステムコール(tk_sta_alm)が呼び出されると、アラームハンドラの起動時刻を、シス
テムコールが呼び出された時刻から指定された相対時間後に設定する。アラームハンドラの動作を停止するシステムコール(tk_stp_alm)が呼び出されると、アラームハンドラの起動時刻の設定を解除する。また、アラームハンドラを起動する時にも、アラームハンドラの起動時刻の設定を解除し、アラームハンドラの動作を停止する。
補足事項
アラームハンドラが実際に起動される時刻は、タイマ割込み間隔(TTimPeriod)の分解能にしたがったものとなる。詳細は項4.7.2. 「周期ハンドラ」の補足事項を参照。

μT-Kernel 3.0仕様書

4.7.3.1

226 / 487

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
almatrAlarm Handler AttributeFP
almhdrAlarm Handler Address
UB
dsname[8]DS Object name──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
アラームハンドラ属性
アラームハンドラアドレス
DSオブジェクト名称

リターンパラメータ
ID

almid
または

Alarm Handler ID
Error CodeアラームハンドラID
エラーコードエラーコードE_NOMEM
E_LIMITE_RSATR
E_PAR

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

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

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

解説
アラームハンドラを生成しアラームハンドラIDを割り当てる。具体的には、生成されたアラームハンドラに対して管理ブロックを割り付ける。
アラームハンドラ(指定時刻起動ハンドラ)は、指定した時刻に起動されるタスク独立部のハンドラである。
exinf は、対象となるアラームハンドラに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した情報は、
アラームハンドラにパラメータとして渡される他、tk_ref_alm で取り出すことができる。なお、ユーザの情報を入れるためにもっμT-Kernel 3.0仕様書

227 / 487と大きな領域がほしい場合や、途中で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf に入れる。カーネルでは exinf の内容について関知しない。
almatr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。almatr のシステム属性の部分では、次のような指定を行う。
almatr := (TA_ASM || TA_HLNG) | [TA_DSNAME]
TA_ASM
TA_HLNG
TA_DSNAME# define TA_ASM# define TA_HLNG# define TA_DSNAME

対象ハンドラがアセンブリ言語で書かれている
対象ハンドラが高級言語で書かれている
DSオブジェクト名称を指定する
0 x00000000
0 x00000001
0 x00000040/* アセンブリ言語によるプログラム *//* 高級言語によるプログラム *//* 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つのハンドラの実行を中断して別のハンドラを実行し、そのハンドラが終了した後で前のハンドラの続きを実行する)かということは実装依存である。いずれにしても、タイ
ムイベントハンドラや割込みハンドラはタスク独立部なので、遅延ディスパッチの原則が適用される。

μT-Kernel 3.0仕様書

4.7.3.2

228 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_del_alm(ID almid);
パラメータ
ID

almid

Alarm Handler ID

アラームハンドラID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

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

利用可能なコンテキスト
タスク部○
関連するサービスプロファイル
なし
解説
アラームハンドラを削除する。

準タスク部
○

タスク独立部×μT-Kernel 3.0仕様書

4.7.3.3

229 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_sta_alm(ID almid, RELTIM almtim);
パラメータ
ID
RELTIMalmid
almtimAlarm Handler ID
Alarm Time

アラームハンドラID
アラームハンドラ起動時刻(ミリ秒)

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

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

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
なし
解説
アラームハンドラの起動時刻を設定して、動作状態にする。almtim は相対時刻で、tk_sta_alm が呼び出された時刻から
almtim で指定した時間が経過した後にアラームハンドラが起動される。すでにアラームハンドラの起動時刻が設定されて動作状態であった場合には、その設定を解除した後、新たに起動時刻を設定し動作状態とする。
almtim＝0の場合には、起動時刻設定直後にアラームハンドラが起動される。

μT-Kernel 3.0仕様書

4.7.3.4

230 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_sta_alm_u(ID almid, RELTIM_U almtim_u);
パラメータ
ID
RELTIM_Ualmidalmtim_u

Alarm Handler ID
Alarm Time

アラームハンドラID
アラームハンドラ起動時刻(マイクロ秒)

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコード
E_OK
E_ID
E_NOEXS

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

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

マイクロ秒のサポート

解説
tk_sta_alm のパラメータである almtim を64ビットマイクロ秒単位の almtim_u としたシステムコールである。
パラメータが almtim_u となった点を除き、本システムコールの仕様は tk_sta_alm と同じである。詳細は tk_sta_alm の説明を参照のこと。

μT-Kernel 3.0仕様書

4.7.3.5

231 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_stp_alm(ID almid);
パラメータ
ID

almid

Alarm Handler ID

アラームハンドラID

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS

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

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
なし
解説
アラームハンドラの起動時刻を解除し、動作していない状態にする。すでに動作していない状態であれば何もしない。

μT-Kernel 3.0仕様書

4.7.3.6

232 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_alm(ID almid, T_RALM *pk_ralm);
パラメータ
ID
almid
T_RALM* pk_ralm

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

Error Code

エラーコードリターンパラメータER

ercd

pk_ralm の内容
void*
exinf
Extended Information
RELTIM lfttim
Left Time
UINT
almstatAlarm Handler Status──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
ハンドラ起動までの残り時間(ミリ秒)
アラームハンドラの状態

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(almid が不正あるいは利用できない)
オブジェクトが存在していない(almid のアラームハンドラが存在しない)
パラメータエラー(pk_ralm が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
なし
解説
almid で示されたアラームハンドラの状態を参照し、ハンドラ起動までの残り時間(lfttim)、拡張情報(exinf)をリターンパラメ
ータとして返す。
almstat には次の情報が返される。
almstat:= (TALM_STP | TALM_STA)

μT-Kernel 3.0仕様書# define TALM_STP# define TALM_STA

233 / 487

0 x00
0 x01

/* アラームハンドラが動作していない *//* アラームハンドラが動作している */アラームハンドラが動作している(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 を使う。

μT-Kernel 3.0仕様書

4.7.3.7

234 / 487

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

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_alm_u(ID almid, T_RALM_U *pk_ralm_u);
パラメータ
ID
T_RALM_U*almid
pk_ralm_u

Alarm Handler ID
Packet to Refer Alarm
Handler Status

アラームハンドラID
アラームハンドラの状態を返す領域へのポ
インタ

ercd

Error Code

エラーコードリターンパラメータER
pk_ralm_u の内容
void*
exinf
Extended Information
RELTIM_U
lfttim_u
Left Time
UINT
almstatAlarm Handler Status──(以下に実装独自に他の情報を追加してもよい)──

拡張情報
ハンドラ起動までの残り時間(マイクロ秒)
アラームハンドラの状態

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(almid が不正あるいは利用できない)
オブジェクトが存在していない(almid のアラームハンドラが存在しない)
パラメータエラー(pk_ralm_u が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

マイクロ秒のサポート

解説
tk_ref_alm のリターンパラメータである lfttim を64ビットマイクロ秒単位の lfttim_u としたシステムコールである。
リターンパラメータが lfttim_u となった点を除き、本システムコールの仕様は tk_ref_alm と同じである。詳細は tk_ref_almの説明を参照のこと。

μT-Kernel 3.0仕様書

235 / 487

4.8 割込み管理機能
割込み管理機能は、外部割込みおよびCPU例外に対するハンドラの定義などの操作を行うための機能である。
割込みハンドラは、タスク独立部として扱われる。タスク独立部でも、タスク部と同じ形式でシステムコールを発行することが可能であるが、タスク独立部で発行できるシステムコールには以下のような制限がつく。
• 暗黙に自タスクを指定するシステムコールや自タスクを待ち状態にするシステムコールは発行することができない。E_CTXのエラーとなる。
タスク独立部の実行中はタスクの切り換え(ディスパッチ)は起らず、システムコールの処理の結果ディスパッチの要求が出されても、タスク独立部を抜けるまでディスパッチが遅らされる。これを遅延ディスパッチ(delayed dispatching)の原則と呼ぶ。

μT-Kernel 3.0仕様書

236 / 487

4.8.1 tk_def_int - 割込みハンドラ定義
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_def_int(UINT intno, CONST T_DINT *pk_dint);
パラメータ
UINT
CONST T_DINT*

intno
pk_dint

Interrupt Number
Packet to Define Interrupt
Handler

割込み番号
割込みハンドラ定義情報

pk_dint の内容
ATR
intatrInterrupt Handler AttributeFP
inthdrInterrupt Handler Address──(以下に実装独自に他の情報を追加してもよい)──

割込みハンドラ属性
割込みハンドラアドレス

リターンパラメータER

ercd

Error Code

エラーコードエラーコード
E_OK
E_NOMEM
E_RSATR
E_PAR

正常終了
メモリ不足(管理ブロック用の領域が確保できない)
予約属性(intatr が不正あるいは利用できない)パラメータエラー(intno, pk_dint, inthdr が不正あるいは利用できない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

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

解説
割込みには、デバイスからの外部割込みと、CPU例外による割込みの両方を含む。
intno で示される割込み番号に対して割込みハンドラを定義し、割込みハンドラを使用可能にする。すなわち、intno で示される割込み番号と割込みハンドラのアドレスや属性との対応付けを行う。
intno は、割込みの種類を区別するための番号である。その具体的な意味は実装ごとに定義されるが、一般には、CPUハード
ウェアの割込み処理で定義される割込み番号(IRQ番号など)をそのまま使うか、その番号との対応付けが可能な何らかの番号を使う。

μT-Kernel 3.0仕様書

237 / 487

intatr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。intatr のシステム属性の部分では、次のような指定を行う。
intatr := (TA_ASM || TA_HLNG)
TA_ASM
TA_HLNG# define TA_ASM# define TA_HLNG

対象ハンドラがアセンブリ言語で書かれている
対象ハンドラが高級言語で書かれている
0 x00000000
0 x00000001/* アセンブリ言語によるプログラム *//* 高級言語によるプログラム */TA_ASM 属性の場合、原則として、割込みハンドラの起動時にはカーネルが介入しない。割込み発生時には、CPUハードウェアの割込み処理機能により、このシステムコールで定義した割込みハンドラが直接起動される(実装によってはプログラムによる処理が含まれる場合もある)。したがって、割込みハンドラの先頭と最後では、割込みハンドラで使用するレジスタの退避と復帰を行う必要がある。割込みハンドラは、tk_ret_int システムコールまたはCPUの割込みリターン命令(またはそれに相当する手段)によって終了する。
tk_ret_int を使用せずにカーネルを介すことなく割込みハンドラから復帰する手段は必須である。ただし、tk_ret_int を使用しない場合は、遅延ディスパッチが行われなくてもよい。
tk_ret_int による割込みハンドラからの復帰も必須であり、この場合は遅延ディスパッチが行われなければならない。
TA_HLNG 属性の場合は、高級言語対応ルーチンを経由して割込みハンドラを起動する。高級言語対応ルーチンによって、レジスタの退避と復帰が行われる。割込みハンドラは、C言語関数からのリターンによって終了する。TA_HLNG 属性の場合の割込
みハンドラは次の形式となる。
void inthdr ( UINT intno )
{
/*
割込み処理
*/
return ; /* 割込みハンドラの終了 */}

割込みハンドラに渡される intno は、発生した割込みの種類を区別するための番号で、tk_def_int で指定するものと同一である。実装によっては、intno 以外にも発生した割込みに関する情報が渡される場合がある。このような情報がある場合は、割込みハンドラの2番目以降のパラメータとして実装ごとに定義する。
TA_HLNG 属性の場合、割込み発生から割込みハンドラが呼び出されるまで、CPUの割込みフラグは割込み禁止状態であるものとする。つまり、割込み発生直後から多重割込みが禁止された状態であり、多重割込みが禁止された状態のまま割込みハンドラが呼び出される。多重割込みを許可する場合は、割込みハンドラ内でCPUの割込みフラグを操作して許可する必要がある。
また、TA_HLNG 属性の場合は、割込みハンドラに入った時点で、システムコールの呼出が可能な状態となっていなければならない。ただし、上述の機能を標準とした上で、多重割込みを許可した状態で割込みハンドラに入る機能を追加するなどの拡張は許される。
TA_ASM 属性の場合、割込みハンドラに入った時点の状態は実装ごとに定義される。割込みハンドラに入った時点のスタックやレジスタの状態、システムコールの呼出の可否、システムコールを呼び出せるようにする方法、および割込みハンドラからカーネルを介さずに復帰する方法などが明確に定義されていなければならない。
TA_ASM 属性の場合、実装によっては、割込みハンドラ実行中もタスク独立部として判定されない場合がある。タスク独立部として判定されない場合は、次の点に注意が必要である。
• 割込みを許可すると、タスクディスパッチが発生する可能性がある。
• システムコールを呼び出した場合、タスク部または準タスク部から呼び出したものとして処理される。

μT-Kernel 3.0仕様書

238 / 487

なお、割込みハンドラ内で何らかの操作を行ってタスク独立部として判定させる方法がある場合は、実装ごとにその方法を示すものとする。
割込みハンドラの中でシステムコールを発行することにより、それまで実行状態(RUNNING)であったタスクがその他の状態に移行し、代わりに別のタスクが実行状態(RUNNING)となった場合でも、割込みハンドラ実行中はディスパッチ(実行タスクの切り替え)が起こらない。ディスパッチングが必要になっても、まず割込みハンドラを最後まで実行することが優先され、割込
みハンドラを終了する時にはじめてディスパッチが行われる。すなわち、割込みハンドラ実行中に生じたディスパッチ要求はすぐに処理されず、割込みハンドラ終了までディスパッチが遅らされる。これを遅延ディスパッチの原則と呼ぶ。
割込みハンドラはタスク独立部として実行される。したがって、割込みハンドラの中では、待ち状態に入るシステムコールや、自タスクの指定を意味するシステムコールを実行することはできない。
pk_dint＝NULL とした場合には、前に定義した割込みハンドラの定義解除を行う。割込みハンドラの定義解除状態では、シス
テムの定義するデフォルトハンドラが設定される。
既に定義済みの割込み番号に対して、割込みハンドラを再定義することも可能である。再定義のときにも、あらかじめその番号のハンドラの定義解除を行っておく必要はない。既に割込みハンドラが定義された intno に対して新しいハンドラを再定義しても、エラーにはならない。
補足事項
TA_ASM 属性に関する種々の規定は、主に割込みのフックを行うためのものである。例えば、不正アドレスのアクセスによる例外の場合、通常は上位のプログラムで定義した割込みハンドラによって例外を検出してエラー処理を行うが、デバッグ中の場合は上位のプログラムでエラー処理を行う代りに、システムの定義するデフォルトの割込みハンドラに処理させてデバッガを起動するというようなことを行う。この場合、上位のプログラムで定義した割込みハンドラは、システムの定義するデフォルトの割
込みハンドラをフックする形になる。そして、状況に応じてデバッガ等のシステムプログラムに割込み処理を引き渡すか、そのま
ま自身で処理することになる。

μT-Kernel 3.0仕様書

239 / 487

4.8.2 tk_ret_int - 割込みハンドラから復帰
C言語インタフェース#include <tk/tkernel.h>void tk_ret_int(void);
C言語インタフェースは形式として定義されるが、高級言語対応ルーチンを使用した場合には呼び出されることがない。
パラメータなし
リターンパラメータ※ システムコールを発行したコンテキストには戻らない
エラーコード※ 次のようなエラーを検出する可能性があるが、エラーを検出した場合でも、システムコールを発行したコンテキストには戻らない。したがって、システムコールのリターンパラメータとして直接エラーコードを返すことはできない。万一エラーを検出した場
合の動作は、実装依存となる。
E_CTX

コンテキストエラー(割込みハンドラ以外から発行,実装依存)

利用可能なコンテキスト
タスク部
×

準タスク部
×

タスク独立部○

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

TA_ASM属性の割り込みハンドラのサポート

解説
割込みハンドラを終了する。
割込みハンドラの中でシステムコールを実行してもディスパッチは起らず、tk_ret_int によって割込みハンドラを終了するまで
ディスパッチが遅延させられる(遅延ディスパッチの原則)。そのため、tk_ret_int では、割込みハンドラの中から発行されたシ
ステムコールによるディスパッチ要求がまとめて処理される。
tk_ret_int は TA_ASM 属性の割込みハンドラの場合にのみ呼び出す。TA_HLNG 属性の割込みハンドラの場合は、高級言語対
応ルーチン内で暗黙に tk_ret_int 相当の機能が実行されるので、tk_ret_int を明示的には呼び出さない(呼び出してはいけない)。
TA_ASM 属性の場合、原則として、割込みハンドラの起動時にはカーネルが介入しない。割込み発生時には、CPUハードウェアの割込み処理機能により、割込みハンドラが直接起動される。そのため、割込みハンドラで使用するレジスタの退避や復帰は割込みハンドラの中で行わなければならない。

μT-Kernel 3.0仕様書

240 / 487

また、この理由により、tk_ret_int を発行した時のスタックやレジスタの状態は、割込みハンドラへ入った時と同じでなければならず、この関係で tk_ret_int では機能コードを使用できないことがある。この場合は、他のシステムコールとは別ベクトルのト
ラップ命令を用いて tk_ret_int を実現する。
補足事項
tk_ret_int は発行元のコンテキストに戻らないシステムコールである。したがって、何らかのエラーを検出した場合にエラーコ
ードを返しても、これらのシステムコールを呼んだ側ではエラーのチェックを行っていないのが普通であり、プログラムが暴走する可能性がある。そこで、これらのシステムコールでは、エラーを検出した場合にも、システムコール発行元へは戻らないものとする。
割込みハンドラから戻っても、ディスパッチが起こらない(必ず同じタスクが実行を継続する)ことがはっきりしている、またはディスパッチしなくても構わない場合には、tk_ret_int ではなく、アセンブリ言語の割込みリターン命令によって割込みハンドラを終了しても構わない。
また、CPUのアーキテクチャやカーネルの構成法によっては、アセンブリ言語の割込みリターン命令によって割込みハンドラを終了しても、遅延ディスパッチが可能となる場合がある。このような場合は、アセンブリ言語の割込みリターン命令がそのまま
tk_ret_int のシステムコールであると解釈しても構わない。
タイムイベントハンドラから tk_ret_int を呼んだ場合の E_CTX のエラーチェックは実装依存である。実装によっては、種類の違うハンドラからそのままリターンしてしまう場合がある。

μT-Kernel 3.0仕様書

241 / 487

4.9 システム状態管理機能
システム状態管理機能は、システムの状態を変更／参照するための機能である。タスクの優先順位を回転する機能、実行状
態のタスクIDを参照する機能、タスクディスパッチを禁止／解除する機能、コンテキストやシステム状態を参照する機能、省電力モードを設定する機能、カーネルのバージョンを参照する機能が含まれる。

μT-Kernel 3.0仕様書

242 / 487

4.9.1 tk_rot_rdq - タスクの優先順位の回転
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_rot_rdq(PRI tskpri);
パラメータ
PRI

tskpri

Task Priority

タスク優先度Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(tskpri が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
なし
解説
tskpri で指定される優先度のタスクの優先順位を回転する。すなわち、対象優先度を持った実行できる状態のタスクの中で、最も高い優先順位を持つタスクを、同じ優先度を持つタスクの中で最低の優先順位とする。
tskpri＝TPRI_RUN＝0により、その時実行状態(RUNNING)にあるタスクの優先度のタスクの優先順位を回転する。一般のタスクから発行される tk_rot_rdq では、これは自タスクの持つ優先度のタスクの優先順位を回転するのと同じ意味であるが、周期ハンドラなどのタスク独立部から tk_rot_rdq(tskpri=TPRI_RUN) を発行することも可能である。
補足事項
対象優先度を持った実行できる状態のタスクがない場合や、一つしかない場合には、何もしない(エラーとはしない)。
ディスパッチ許可状態で、対象優先度に TPRI_RUN または自タスクの現在優先度を指定してこのシステムコールが呼び出されると、自タスクの実行順位は同じ優先度を持つタスクの中で最低となる。そのため、このシステムコールを用いて、実行権の放棄を行うことができる。
ディスパッチ禁止状態では、同じ優先度を持つタスクの中で最高の優先順位を持ったタスクが実行されているとは限らないため、この方法で自タスクの実行順位が同じ優先度を持つタスクの中で最低となるとは限らない。

μT-Kernel 3.0仕様書

243 / 487

tk_rot_rdq の実行例を[図 4.5. 「tk_rot_rdq実行前の優先順位」], [図 4.6. 「tk_rot_rdq(tskpri=2)実行後の優先順位」]に示す。[図 4.5. 「tk_rot_rdq実行前の優先順位」]の状態で、tskpri＝2をパラメータとしてこのシステムコールが呼ばれると、新しい優先順位は[図 4.6. 「tk_rot_rdq(tskpri=2)実行後の優先順位」]のようになり、次に実行されるのはタスクCとなる。

図 4.5: tk_rot_rdq実行前の優先順位

図 4.6: tk_rot_rdq(tskpri=2)実行後の優先順位

μT-Kernel 3.0仕様書

244 / 487

4.9.2 tk_get_tid - 実行状態タスクのタスクID参照
C言語インタフェース#include <tk/tkernel.h>ID tskid = tk_get_tid(void);
パラメータなし
リターンパラメータ
ID

tskid

Task ID

実行状態タスクのID

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
なし
解説
現在実行状態にあるタスクのID番号を得る。タスク独立部の実行中を除けば、現在実行状態にあるタスクは自タスクである。
現在実行状態のタスクがない場合は、0が返される。
補足事項
tk_get_tid で返されるタスクIDは、tk_ref_sys で返される runtskid と同一である。

μT-Kernel 3.0仕様書

245 / 487

4.9.3 tk_dis_dsp - ディスパッチ禁止
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_dis_dsp(void);
パラメータなし
リターンパラメータER

ercd

Error Code

エラーコードエラーコード
E_OK
E_CTX

正常終了
コンテキストエラー(タスク独立部から発行)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
タスクのディスパッチを禁止する。これ以後 tk_ena_dsp が実行されるまでの間はディスパッチ禁止状態となり、自タスクが実
行状態(RUNNING)から実行可能状態(READY)に移ることはなくなる。また、待ち状態に移ることもできなくなる。ただし、外部割込みは禁止しないので、ディスパッチ禁止状態であっても割込みハンドラは起動される。ディスパッチ禁止状態においては、実行中のタスクが割込みハンドラによってプリエンプト(CPUの実行権の横取り)される可能性はあるが、他のタスクによってプリエンプトされる可能性はない。
ディスパッチ禁止状態の間は、具体的には次のような動作をする。
• 割込みハンドラあるいは tk_dis_dsp を実行したタスクから発行されたシステムコールによって、tk_dis_dsp を実行したタ
スクより高い優先度を持つタスクが実行可能状態(READY)となっても、そのタスクにはディスパッチされない。優先度の高いタスクへのディスパッチは、ディスパッチ禁止状態が終了するまで遅延される。
• tk_dis_dsp を実行したタスクが、自タスクを待ち状態に移す可能性のあるシステムコール(tk_slp_tsk、tk_wai_sem など)を発行した場合には、E_CTX のエラーとなる。
• tk_ref_sys によってシステム状態を参照した場合、sysstat として TSS_DDSP が返る。
既にディスパッチ禁止状態にあるタスクが tk_dis_dsp を発行した場合は、ディスパッチ禁止状態がそのまま継続するだけで、エラーとはならない。ただし、tk_dis_dsp を何回か発行しても、その後 tk_ena_dsp を1回発行するだけでディスパッチ禁止
状態が解除される。したがって、tk_dis_dsp〜tk_ena_dsp の対がネストした場合の動作は、必要に応じてユーザ側で管理しなければならない。

μT-Kernel 3.0仕様書

246 / 487

補足事項
ディスパッチ禁止状態では、実行状態のタスクが休止状態(DORMANT)や未登録状態(NON-EXISTENT)に移行することはできない。割込みおよびディスパッチ禁止状態で、実行状態のタスクが tk_ext_tsk または tk_exd_tsk を発行した場合には、E_CTX のエラーを検出する。ただし、tk_ext_tsk や tk_exd_tsk は元のコンテキストに戻らないシステムコールなので、これらのシステムコールのリターンパラメータとしてエラーを通知することはできない。

μT-Kernel 3.0仕様書

247 / 487

4.9.4 tk_ena_dsp - ディスパッチ許可
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ena_dsp(void);
パラメータなし
リターンパラメータER

ercd

Error Code

エラーコードエラーコード
E_OK
E_CTX

正常終了
コンテキストエラー(タスク独立部から発行)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
タスクのディスパッチを許可する。すなわち、tk_dis_dsp によって設定されていたディスパッチ禁止状態を解除する。
ディスパッチ禁止状態ではないタスクが tk_ena_dsp を発行した場合は、ディスパッチを許可した状態がそのまま継続するだ
けで、エラーとはならない。

μT-Kernel 3.0仕様書

248 / 487

4.9.5 tk_ref_sys - システム状態参照
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_sys(T_RSYS *pk_rsys);
パラメータ
T_RSYS*

pk_rsys

Packet to Refer System Status

システム状態を返す領域へのポインタ

Error Code

エラーコードリターンパラメータERercd

pk_rsys の内容
UINT
sysstat
System StateID
runtskid
Running Task ID
ID
schedtskid
Scheduled Task ID
──(以下に実装独自に他の情報を追加してもよい)──

システム状態
現在実行状態にあるタスクのID
実行状態にすべきタスクのID

エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(pk_rsys が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
なし
解説
実行状態を参照し、ディスパッチ禁止中、タスク独立部実行中などといった情報をリターンパラメータとして返す。
sysstat は次のような値をとる。
sysstat := ( TSS_TSK | [TSS_DDSP] | [TSS_DINT] )|| ( TSS_QTSK | [TSS_DDSP] | [TSS_DINT] )|| ( TSS_INDP )TSS_TSK0

タスク部実行中μT-Kernel 3.0仕様書

TSS_DDSPTSS_DINTTSS_INDPTSS_QTSK

12
4
8249 / 487

ディスパッチ禁止中
割込み禁止中タスク独立部実行中
準タスク部実行中

runtskid には現在実行中のタスクのID、schedtskid には実行状態にすべきタスクのIDが返される。通常は runtskid＝schedtskidとなるが、ディスパッチ禁止中により優先度の高いタスクが起床された場合などに runtskid≠schedtskid となる場合がある。
なお、該当タスクがない場合は0を返す。
割込みハンドラやタイムイベントハンドラからも発行できなければならない。
補足事項
tk_ref_sys で返される情報は、カーネルの実装によっては、必ずしも常に正しい情報を返すとは限らない。

μT-Kernel 3.0仕様書

250 / 487

4.9.6 tk_set_pow - 省電力モード設定
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_set_pow(UINT powmode);
パラメータ
UINT

powmodePower Mode

省電力モードError Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_PAR
E_QOVR
E_OBJ

正常終了
パラメータエラー(powmode が使用できない値)
低消費電力モード切替禁止カウントのオーバーフロー
低消費電力モード切替禁止カウントが0の状態で更に TPW_ENALOWPOW を要求した

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

省電力機能のサポート

解説
省電力機能は、次の2つの機能からなる。
●アイドル(無負荷)中の消費電力低減
実行すべきタスクがない状態のとき、ハードウェアに用意されている低消費電力モードに切り替える。
低消費電力モードは、タイマ割込みから次のタイマ割込みの間のようにごく短い時間の電力消費を抑えるための機能
で、CPUのクロック周波数を下げることなどにより行われる。したがって、ソフトウェアによる複雑なモード切替を必要とせず、主にハードウェアの機能によって実現される。
●自動電源オフ
オペレータが何も操作しない状態が一定時間以上続いた場合、自動的に電源を切りサスペンド状態に移行する。周辺
機器からの起動要求(割込みなど)またはオペレータが電源を入れることによりリジュームされ、電源が切れたときの状態に復帰する。
また、バッテリー切れなどの電源異常によっても、自動的に電源を切りサスペンド状態に移行する。

μT-Kernel 3.0仕様書

251 / 487

サスペンド中は、周辺機器や周辺回路およびCPUの電源が切れる。しかし、メインメモリの内容は保持される。
tk_set_pow は、省電力モードの設定を行う。
powmode:= ( TPW_DOSUSPEND || TPW_DISLOWPOW || TPW_ENALOWPOW )# define TPW_DOSUSPEND# define TPW_DISLOWPOW# define TPW_ENALOWPOW

1
2
3

サスペンド状態へ移行
低消費電力モード切替禁止
低消費電力モード切替許可(デフォルト)• TPW_DOSUSPEND
すべてのタスク及びハンドラの実行を停止し、周辺回路(タイマや割込みコントローラ)を停止し、電源を切る(サスペンドする)。(off_pow を呼び出す)
電源オンされたら、周辺回路の再起動をし、すべてのタスク及びハンドラの実行を再開して、電源を切る前の状態に復帰(リジューム)し、リターンする。
何らかの理由によりリジュームに失敗したときには、通常(リセット時)のスタートアップ処理を行い、新たにシステムを立ち上げなおす。
• TPW_DISLOWPOW
ディスパッチャ内で行われる低消費電力モードへの切替を禁止する。(low_pow を呼び出さない)• TPW_ENALOWPOW
ディスパッチャ内で行われる低消費電力モードへの切替を許可する。(low_pow を呼び出す)
起動時のデフォルトは切替許可(TPW_ENALOWPOW)となる。
TPW_DISLOWPOW が 指 定 さ れ た 場 合、 そ の 要 求 回 数 が カ ウ ン ト さ れ る。TPW_DISLOWPOW が 要 求 さ れ た 回 数 と 同 じ だ け
TPW_ENALOWPOW が要求されないと、低消費電力モードは許可されない。要求カウント数の最大値は実装定義だが、少な
くとも255回以上カウントできなければならない。
補足事項
off_pow, low_pow はμT-Kernel/SMの機能である。詳細は 項5.5. 「省電力機能」 を参照のこと。
μT-Kernelでは、電源異常などのサスペンド移行要因の検出は行わない。また、実際にサスペンドするためには、各周辺機器(デバイスドライバ)のサスペンド処理も必要である。サスペンドするには tk_set_pow を直接呼び出すのではなく、
μT-Kernel/SMのサスペンド機能を利用する。

μT-Kernel 3.0仕様書

252 / 487

4.9.7 tk_ref_ver - バージョン参照
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_ver(T_RVER *pk_rver);
パラメータ
T_RVER* pk_rver

Packet to Refer Version
Information

バージョン情報を返す領域へのポインタ

Error Code

エラーコードMaker Code
Product ID
Specification Version
Product Version
Product Number

カーネルのメーカコード
カーネルの識別番号
仕様書バージョン番号
カーネルのバージョン番号
カーネル製品の管理情報

リターンパラメータER

ercd

pk_rver の内容
UH
UH
UH
UH
UH

maker
prid
spver
prver
prno[4]

エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(pk_rver が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
使用しているカーネルのバージョン情報を参照し、pk_rverで指定されるパケットに返す。具体的には、次の情報を参照することができる。
maker は、このカーネルを実装したμT-Kernel提供者のコードである。maker のフォーマットを[図 4.7. 「maker のフォーマット」]に示す。

μT-Kernel 3.0仕様書

253 / 487

図 4.7: maker のフォーマット
prid は、カーネルの種類を区別するための番号である。prid のフォーマットを[図 4.8. 「prid のフォーマット」]に示す。
pridの具体的な値の割付けは、カーネルを実装したμT-Kernel提供者に任される。ただし、製品の区別はあくまでもこの番号のみで行うので、各μT-Kernel提供者において番号の付け方を十分に検討した上、体系づけて使用するようにしなければならない。したがって、 maker と prid の組でカーネルの種類を一意に識別することができる。
μT-Kernelのリファレンスコードは、トロンフォーラムから提供され、その maker と prid は次のようになる。
maker
prid

= 0x0000= 0x0000

図 4.8: prid のフォーマット
spver では、上位4ビットでOS仕様の種類と、下位12ビットでカーネルが準拠する仕様のバージョン番号を表す。spver のフォーマットを[図 4.9. 「spver のフォーマット」]に示す。
たとえばμT-Kernelの Ver 3.01.xx の仕様書に対応する spver は次のようになる。
MAGIC = 0x6
SpecVer = 0x301
spver = 0x6301(μT-Kernel)(Ver 3.01)

また、μT-Kernel仕様書のドラフト版であるVer 3.B0.xxの仕様書に対応する spver は次のようになる。
MAGIC = 0x6
SpecVer = 0x3B0
spver = 0x63B0(μT-Kernel)(Ver 3.B0)

図 4.9: spver のフォーマットMAGIC:
OS仕様の種類

μT-Kernel 3.0仕様書

0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7

254 / 487

TRON共通 (TAD等)
reserved
reserved
reserved
reserved
reserved
μT-Kernel
T-Kernel

SpecVer:
カーネルが準拠する仕様のバージョン番号。3桁のパックト形式BCDコードで入れる。ドラフトの仕様書の場合は、上から2桁目がA, B, Cとなる場合もある。この場合は、対応する16進数のA, B, Cを入れる。
prverは、カーネル実装上のバージョン番号を表す。prver の具体的な値の割付けは、カーネルを実装したT-Kernel提供者に任される。
prno は、カーネル製品の管理情報や製品番号などを入れるために使用するためのリターンパラメータである。prno の具体的な値の意味は、カーネルを実装したT-Kernel提供者に任される。
補足事項
バージョン情報を得るためのパケットの形式や構造体の各メンバのフォーマットの仕様は、T-KernelやμT-Kernelの各バー
ジョンの間でほぼ共通になっている。
tk_ref_ver の SpecVer として得られるのは仕様書のバージョン番号の上位3桁であるが、これより下位の桁はミスプリントの修正などといった表記上の変更を表す桁なので、tk_ref_ver で得られる情報には含めていない。仕様書の内容との対応という意味では、仕様書のバージョン番号の上位3桁を知ることで必要十分である。
ドラフト版の仕様書を対象として実装されたカーネルでは、SpecVer の2桁目がA, B, Cとなることがある。この場合、仕様書のリリース順序と SpecVer の大小関係が必ずしも一致しないので、注意が必要である。仕様書のリリース順は、たとえばVer
2.A1→Ver 2.A2→Ver 2.B1→Ver 2.C1→Ver 2.00→Ver 2.01→... となるが、SpecVer の大小関係はドラフト版から正式版に移る部分(Ver 2.Cx→Ver 2.00の部分)で逆転する。

μT-Kernel 3.0仕様書

255 / 487

4.10 サブシステム管理機能
サブシステム管理機能は、μT-Kernel上で動作するミドルウェア等を実装するために、「サブシステム」と呼ばれるユーザ定義の機能をカーネルに追加し、μT-Kernel本体の機能を拡張するための機能である。μT-Kernel/SMの一部の機能についても、サブシステム管理機能を利用して実装されている。
サブシステムは、ユーザ定義のシステムコール(「拡張SVC」と呼ぶ)を実行するための拡張SVCハンドラのほか、例外発生時の処理を行うブレーク関数、デバイス等からのイベント発生時の処理を行うイベント処理関数から構成される(図 4.10. 「サブシステム概要」)。

図 4.10: サブシステム概要
このうち、拡張SVCハンドラはアプリケーションなどからの要求を直接受け付けて処理する。一方、ブレーク関数、イベント処理
関数は、いわゆるコールバック型の関数であり、カーネルからの要求を受け付けて処理する。
補足事項
一般に、プロセス管理機能、ファイル管理機能などを含む上位ミドルウェアの機能を実装する場合には、サブシステム管理機能を利用する。このほか、サブシステム管理機能を利用して実装されたミドルウェアの例として、TCP/IPマネージャ、USB
マネージャ、PCカードマネージャなどがある。
サブシステム管理機能は、大まかに言えばシステムコール(SVC: SuperVisor Call)をユーザが追加するための機能であるが、単なるユーザ定義システムコールの追加だけではなく、追加したシステムコールの処理に付随して必要となる例外発生時の処理機能も提供することによって、高度で複雑な機能を持つミドルウェアを実現可能としたものである。
なお、μT-Kernel本体の機能を拡張するための機能としては、サブシステム管理機能のほかに、デバイスドライバの機能がある。サブシステムもデバイスドライバも、μT-Kernel本体とは独立した機能モジュールであり、対応するバイナリプログ
ラムをロードすることによって、μT-Kernel上のタスクからこれらの機能を呼び出して利用できるようになる。また、両者とも保護レベル0で動作する。一方、両者の相違点としては、デバイスドライバを呼び出す際のAPIがオープン/クローズ、リード/
ライト型に固定されているのに対して、サブシステムを呼び出す際のAPIは自由に定義できる。
サブシステムは、サブシステムID(ssid)によって区別され、複数のサブシステムを同時に定義して利用することが可能である。また、あるサブシステムの中から別のサブシステムを呼び出して利用することも可能である。

μT-Kernel 3.0仕様書

256 / 487

4.10.1 tk_def_ssy - サブシステム定義
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_def_ssy(ID ssid, CONST T_DSSY *pk_dssy);
パラメータ
ID
CONST T_DSSY*

ssid
pk_dssy

Subsystem ID
Packet to Define
Subsystem

サブシステムID
サブシステム定義情報

pk_dssy の内容
ATR
PRI
FP

ssyatrssyprisvchdrSubsystem Attributes
Subsystem Priority
Extended SVC Handler
AddressFP
breakfn
Break Function Address
FP
eventfn
Event Handling Function
Address──(以下に実装独自に他の情報を追加してもよい)──

サブシステム属性
サブシステム優先度
拡張SVCハンドラアドレス
ブレーク関数アドレス
イベント処理関数アドレス

リターンパラメータER

ercd

Error Code

エラーコードエラーコード
E_OK
E_ID
E_NOMEM
E_RSATR
E_PAR
E_OBJ
E_NOEXS

正常終了
不正ID番号(ssid が不正あるいは利用できない)
メモリ不足(管理ブロック用の領域が確保できない)
予約属性(ssyatr が不正あるいは利用できない)パラメータエラー(pk_dssy が不正あるいは利用できない)
ssid はすでに定義済みである。(pk_dssy≠NULL の時)
ssid は定義されていない。(pk_dssy＝NULL の時)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

サブシステム管理機能のサポート

μT-Kernel 3.0仕様書

257 / 487

以下のサービスプロファイルが有効に設定されているとき、サブシステム優先度(ssypri)の指定が可能である。
TK_SUPPORT_SSYEVENT

サブシステムのイベント処理のサポート

また、以下のサービスプロファイルが有効に設定されているとき、ブレーク関数の指定が可能である。
TK_SUPPORT_TASKEXCEPTION

タスク例外処理機能のサポート

解説
ssid のサブシステムを定義する。
1つのサブシステムに1つのサブシステムIDを、他のサブシステムと重複しないように割り当てなければならない。カーネルに自動割当ての機能はない。
サブシステムIDは1〜9がμT-Kernel用に予約されている。10〜255がミドルウェア等で使用できる番号となる。ただし、使用可能なサブシステムIDの最大値は実装定義であり、255より小さい場合がある。
ssyatr は、下位側がシステム属性を表し、上位側が実装独自属性を表す。ssyatr のシステム属性には、現在のバージョンでは割当てがなく、システム属性は使われていない。
ssypri は、サブシステムの優先度で、スタートアップ関数、クリーンアップ関数、イベント処理関数が優先度順に呼び出される。同一優先度の場合の呼出順は不定である。サブシステム優先度は、1が最も優先度が高く、数値が大きくなるにしたがって優先度が下がる。指定できる優先度の範囲は実装定義だが、少なくとも1〜16が指定できなければならない。
breakfn、eventfn はそれぞれ NULL を指定することができる。NULL を指定した場合、対応する関数は呼び出されない。
pk_dssy＝NULL とした場合は、サブシステムの定義を抹消する。
• 拡張SVCハンドラ
アプリケーションなどからの要求の受け付け口となる。サブシステムのAPIとなる部分である。システムコールと同様の方法
で呼び出すことが可能で、一般的にはトラップ命令などで呼び出す。
拡張SVCハンドラは次の形式となる。
INT svchdr ( void * pk_para , FN fncd ){/*fncd により分岐して処理*/
return retcode ;/* 拡張SVCハンドラの終了 */}fncd は機能コードである。機能コードの下位8ビットにはサブシステムIDが入る。残りの上位ビットは、サブシステム側で任意に使用できる。通常は、サブシステム内の機能コードとして使用する。ただし、機能コードは正の値でなければならないた
め、最上位ビットは必ず0となる。
pk_para は呼出側から渡されたパラメータをパケット形式にしたものである。パケットの形式は、サブシステム側で任意に決めることができる。一般的には、C言語で関数に引数を渡すときのスタックの形式と同じになる。これは、多くの場合C言語の構造体の形式と同じである。
拡張SVCハンドラからの戻値は、そのまま呼出元へ関数の戻値として戻される。原則として、負の値をエラー値、0または正の値を正常時の戻値とする。なお、何らかの理由で拡張SVCの呼出に失敗した場合は、拡張SVCハンドラは呼び出されずに、呼出元にはカーネルの返すエラーコード(負の値)が返されるため、それと混同しないようにしておくことが望ましい。
拡張SVCの呼出側の形式はカーネルの実装に依存する。ただし、サブシステムのAPIとしてはC言語の関数の形式で、カーネルの実装に依存しないように規定しなければならない。サブシステムは、C言語の関数の形式からカーネル依存の拡張
SVCの呼出形式に変換するための、インタフェースライブラリを用意しなければならない。
拡張SVCハンドラは、準タスク部として実行される。
タスク独立部からも呼出が可能で、タスク独立部から呼び出された場合は、拡張SVCハンドラもタスク独立部として実行される。

μT-Kernel 3.0仕様書

258 / 487

• ブレーク関数
ブレーク関数は、拡張SVCハンドラの実行中のタスクに、タスク例外が発生した場合に呼び出される関数である。
ブレーク関数が呼び出されたら、タスク例外が発生した現在実行中の拡張SVCハンドラの処理を速やかに中止し、拡張
SVCハンドラから呼出元に戻らなければならない。現在実行中の拡張SVCハンドラの処理を中止するための処理をブレーク関数で行う。
ブレーク関数は次の形式となる。
void breakfn ( ID tskid ){/*拡張SVCハンドラの実行中止処理*/}

tskid はタスク例外が発生したタスクのIDである。
ブレーク関数は、tk_ras_tex によりタスク例外が発生されたときに呼び出される。また、拡張SVCハンドラがネストして呼び出されていた場合は、拡張SVCハンドラから戻ってネストが１段浅くなったときに、戻った先の拡張SVCハンドラに対応するブレーク関数が呼び出される。
ブレーク関数は、１回のタスク例外で、１つの拡張SVCハンドラに対して１回のみ実行される。
タスク例外が発生している状態で、さらにネストして拡張SVCを呼び出した場合、呼出先の拡張SVCハンドラに対してはブレーク関数は呼び出されない。
ブレーク関数は準タスク部として実行されるが、その要求タスクは次のようになる。tk_ras_tex の発行によるブレーク関数実行の場合は、tk_ras_tex を発行したタスクの準タスク部としてブレーク関数が実行される。一方、拡張SVCハンドラのネストが1段浅くなったときのブレーク関数実行の場合は、タスク例外の発生したタスク(拡張SVCハンドラを実行しているタスク)の準タスク部としてブレーク関数が実行される。したがって、ブレーク関数の実行タスクと拡張SVCハンドラの実行タスクが異なっている場合がある。このような場合、ブレーク関数と拡張SVCハンドラがタスクスケジューリングにしたがって同時に実行されることになる。
そのため、ブレーク関数の実行が終了する前に拡張SVCハンドラから呼出元に戻るケースが考えられるが、そのような場合には拡張SVCハンドラから呼出元に戻る直前の状態でブレーク関数が終了するまで待たされる。この待ち状態がタスク状
態遷移のどの状態になるかは実装依存とするが、READY状態のまま(RUNNING状態になれないREADY状態)とすることが望ましい。また、ブレーク関数の終了を待つ間、タスクの優先順位が変化することがあるが、タスクの優先順位がどのようになるかは実装依存とする。
同様に、ブレーク関数の実行が終了するまで拡張SVCハンドラから拡張SVCを呼び出すことはできず、ブレーク関数の終了まで待たされる。
つまり、タスク例外が発生してからブレーク関数が終了するまでの間、タスク例外が発生したときの拡張SVCハンドラから抜けないようにしなくてはならない。
ブレーク関数と拡張SVCハンドラの要求タスクが異なるケース、すなわちブレーク関数と拡張SVCハンドラが異なるタスクとして実行されるケースにおいて、ブレーク関数のタスク優先度が拡張SVCハンドラのタスク優先度より低い場合は、ブレーク関数の実行期間だけ、拡張SVCハンドラのタスク優先度と同じ優先度までブレーク関数のタスク優先度が引き上げられる。
逆に、ブレーク関数のタスク優先度が同じかより高い場合には、優先度は変更されない。変更される優先度は現在優先度
で、ベース優先度は変更されない。
優先度変更はブレーク関数へ入る直前のみで、その後に拡張SVCハンドラ側の優先度が変更されても追従してブレーク関
数側の優先度が変更されることはない。ブレーク関数実行中にブレーク関数側の優先度を変更した場合も、拡張SVCハン
ドラ側の優先度が変更されることはない。また、このときブレーク関数を実行中であることにより優先度の変更が制限されることはない。
ブレーク関数終了時には現在優先度をベース優先度に戻す。ただし、ミューテックスをロックしていた場合には、ミューテック
スにより調整された優先度に戻す。(つまり、ブレーク関数の入口と出口で現在優先度を調整する機能があるのみで、それ以外については通常のタスク実行中と同じである。)• イベント処理関数
tk_evt_ssy の呼出によって呼び出される。
サブシステムに対する各種要求を処理する。

μT-Kernel 3.0仕様書

259 / 487

なお、すべての要求がすべてのサブシステムで処理されなければならないという性質のものではない。処理する必要がなけ
れば何もせず単に E_OK を返せばよい。
イベント処理関数は次の形式となる。
ER eventfn ( INT evttyp , INT info ){/*各イベントに対応する処理*/
return ercd ;}evttyp は要求の種別、info は任意のパラメータで、いずれも tk_evt_ssy で指定されたものである。
正常に処理した場合は戻値に E_OK を返す。異常があった場合はエラーコード(負の値)を返す。
evttyp には次のものがある。詳細は 項5.2. 「デバイス管理機能」 を参照のこと。
# define# define# define# define# define# define

TSEVT_SUSPEND_BEGIN
TSEVT_SUSPEND_DONE
TSEVT_RESUME_BEGIN
TSEVT_RESUME_DONE
TSEVT_DEVICE_REGISTTSEVT_DEVICE_DELETE

1
2
3
4
5
6

/* デバイスサスペンド開始前 *//* デバイスサスペンド完了後 *//* デバイスリジューム開始前 *//* デバイスリジューム完了後 *//* デバイス登録通知 *//* デバイス抹消通知 */イベント処理関数は、tk_evt_ssy の発行タスクの準タスク部として実行される。
補足事項
拡張SVCハンドラおよびブレーク関数、イベント関数は TA_HLNG 属性相当のみで、高級言語対応ルーチンを経由して呼び出される。TA_ASM 属性を指定する機能はない。
拡張SVCハンドラの中で待ち状態に入るシステムコールを発行しても構わないが、ブレーク関数による中止を考慮したプログ
ラムにしておく必要がある。この場合の具体的な処理は次のようになる。拡張SVCハンドラの実行中に、呼出側のタスクを対象とした tk_ras_tex が発行された場合、できるだけ速やかに拡張SVCハンドラの実行中止処理を行い、呼出側に対して中止のエラーを返す必要がある。このためにブレーク関数が実行される。ブレーク関数の中では、速やかに実行中止処理を行うため、拡張SVCハンドラの処理中に待ち状態になっていた場合でも、その待ち状態を強制的に解除する必要がある。このためのシステムコールとして、通常は tk_dis_wai を使う。tk_dis_wai の機能により、その後も拡張SVCハンドラから呼出側に戻るまでの間は待ち状態に入らないようにできるが、拡張SVCハンドラ側のプログラムも、ブレーク関数による実行の中止を考慮しておくべきである。たとえば、待ち状態から E_DISWAI のエラーで抜けた場合には、ブレーク関数による実行の中止を意味すると考えられるので、その後に予定していた処理を行わず、速やかに拡張SVCハンドラを終了し、呼出側に対して中止のエラーを返すようにする。
拡張SVCハンドラは、複数のタスクから同時に並行して呼び出される可能性がある。そのため、共通に利用する資源等があった場合には、拡張SVCハンドラの中で、必要に応じて排他制御を行う。
移植ガイドライン
INT型が16ビット幅の環境では、機能コードのうちサブシステム内の機能コードとして使える上位ビットは7ビット分(0〜127)になるため注意が必要である。

μT-Kernel 3.0仕様書

260 / 487

4.10.2 tk_evt_ssy - イベント処理関数呼出C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_evt_ssy(ID ssid, INT evttyp, INT info);
パラメータ
ID
INT
INT

ssid
evttypinfo

Subsystem ID
Event Type
Information

サブシステムID
イベント要求種別
任意パラメータ

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_ID
E_NOEXS
E_CTX
その他

正常終了
不正ID番号(ssidが不正あるいは利用できない)
オブジェクトが存在していない(ssid のサブシステムが定義されていない)
コンテキストエラー(タスク独立部またはディスパッチ禁止状態で実行)
イベント処理関数の返したエラー値

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

サブシステム管理機能のサポート
サブシステムのイベント処理のサポート

解説
ssid のサブシステムのイベント処理関数を呼び出す。
ssid＝0を指定したときは、現在定義されているすべてのサブシステムのイベント処理関数を呼び出す。この場合、次の順序
で各サブシステムのイベント処理関数を呼び出す。
evttyp が奇数のとき:
サブシステム優先度の高い方から順に呼び出す。
evttyp が偶数のとき:
サブシステム優先度の低い方から順に呼び出す。

μT-Kernel 3.0仕様書

261 / 487

同一優先度の場合の呼出順は不定である。
イベント処理関数が定義されていないサブシステムに対して実行しても、単にイベント処理関数を呼び出さないだけでエラーとはならない。
イベント処理関数がエラーを返した場合、システムコールの戻値としてそのエラー値をそのまま返す。ssid＝0の場合、イベント処理関数がエラーを返した場合も、すべてのサブシステムのイベント処理関数が呼び出される。システムコールの戻値には、エラーを返したイベント処理関数の内の１つのエラー値のみ返す。どのサブシステムのイベント処理関数が返したエラーかはわからない。
イベント処理関数を実行中に、tk_evt_ssy を呼び出したタスクにタスク例外が発生した場合、タスク例外はイベント処理関数が終了するまで保留される。
補足事項
イベント処理関数の利用例の1つは、省電力機能に関連したサスペンドやリジュームの処理である。具体的には、電源異常な
どの要因により電源を切った状態(デバイスのサスペンド状態)に移行する際、サスペンド状態への移行を各サブシステムに対して通知し、サブシステム毎に適切な処理を行うために、各サブシステムのイベント処理関数が呼び出される。μT-Kernel/
SMの tk_sus_dev の処理の中では、この目的で tk_evt_ssy を実行している。各サブシステムのイベント処理関数では、必要に応じて、サスペンド状態への移行時に処理すべきデータの保存などを行う。一方、電源の再投入などによってサスペンド状態から復帰(リジューム)する際には、サスペンド状態からの復帰を各サブシステムに対して通知し、サブシステム毎に適切な処理を行うために、各サブシステムのイベント処理関数が再度呼び出される。詳細は tk_sus_dev を参照。
このほか、tk_def_dev によって新しいデバイスが登録された際にも、デバイスの登録を各サブシステムに対して通知し、サブ
システム毎に適切な処理を行うために、各サブシステムのイベント処理関数が呼び出される。μT-Kernel/SMの tk_def_devの処理の中では、この目的で tk_evt_ssy を実行している。
移植ガイドライン
infoがINT型であり、処理系によってとれる値の範囲に異なる可能性があるため注意が必要である。

μT-Kernel 3.0仕様書

262 / 487

4.10.3 tk_ref_ssy - サブシステム定義情報の参照
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_ssy(ID ssid, T_RSSY *pk_rssy);
パラメータ
ID
T_RSSY*ssid
pk_rssy

Subsystem ID
Packet to Refer Subsystem

サブシステムID
サブシステム定義情報を返す領域へのポインタ

Error Code

エラーコードリターンパラメータERercd

pk_rssy の内容
PRI
ssypri
Subsystem Priority──(以下に実装独自に他の情報を追加してもよい)──

サブシステム優先度

エラーコード
E_OK
E_ID
E_NOEXS
E_PAR

正常終了
不正ID番号(ssid が不正あるいは利用できない)
オブジェクトが存在していない(ssid のサブシステムが定義されていない)
パラメータエラー(pk_rssy が不正)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

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

サブシステム管理機能のサポート

以下のサービスプロファイルが有効に設定されているとき、サブシステム優先度(ssypri)の取得が可能である。
TK_SUPPORT_SSYEVENT

サブシステムのイベント処理のサポート

解説
ssid で示された対象サブシステムの各種の情報を参照する。

μT-Kernel 3.0仕様書

ssypri には、tk_def_ssy で指定したサブシステムの優先度が返される。
ssid のサブシステムが定義されていない場合は、E_NOEXS となる。

263 / 487

μT-Kernel 3.0仕様書

264 / 487

第5章

μT-Kernel/SMの機能
この章では、μT-Kernel/SM(System Manager)で提供している機能の詳細について説明を行う。
全般的な注意・補足事項• μT-Kernel/SMの仕様で定義されているAPIには、tk_〜の名称を持つものと、それ以外の名称を持つものがある。tk_〜の名称を持つAPIは、サブシステム管理機能の拡張SVCを使って実装することを想定したAPIであり、それ以外の名称を持つAPIは、ライブラリ関数(インライン関数を含む)またはC言語のマクロで実装することを想定したAPIである。ただし、μT-Kernelの仕様でこれらのAPIの実装方法を規定しているわけではなく、別の実装方法を使っても構わない。また、ラ
イブラリまたはマクロであっても、間接的に拡張SVCやシステムコールを呼び出す場合がある。
• 常に発生する可能性のあるエラー E_PAR, E_MACV, E_NOMEM などは、特に説明を必要とする場合以外は省略している。
• μT-Kernel/SM APIは、特に明記されているものを除き、タスク独立部およびディスパッチ禁止中・割込み禁止中状態から呼び出すことはできない(E_CTX)。
• μT-Kernel/SM APIは、特に明記されているものを除き、μT-Kernel/OSのシステムコールの呼出可能な保護レベルより低い保護レベル(TSVCLimit より低い保護レベル)から呼び出すことはできない(E_OACV)。
• μT-Kernel/SM APIは、特に明記されているものを除き、再入可能(reentrant)である。ただし、内部で排他制御を行っている場合がある。

μT-Kernel 3.0仕様書

265 / 487

5.1 システムメモリ管理機能
システムメモリ管理機能は、μT-Kernelが動的に割り当てるすべてのメモリ(システムメモリ)を管理するための機能である。
μT-Kernel内部で使用しているメモリやタスクのスタック、メッセージバッファ、メモリプールなどもここから割り当てる。
システムメモリ管理機能は、システムメモリを細分化して管理するメモリ割当てライブラリからなる。
システムメモリ管理機能は、μT-Kernelの内部で利用するほか、アプリケーションやサブシステム、デバイスドライバなどからも利用可能である。

μT-Kernel 3.0仕様書

266 / 487

5.1.1 メモリ割当てライブラリ
メモリ割当てライブラリは、C言語標準ライブラリの malloc／calloc／realloc／free と同等の機能が提供される。
これらのメモリは、すべて TSVCLimit で指定された保護レベルのメモリとして割り当てられる。

μT-Kernel 3.0仕様書

5.1.1.1

267 / 487

Kmalloc - メモリの割当て

C言語インタフェース#include <tk/tkernel.h>void* Kmalloc(size_t size);
パラメータ
size_tsize

Size

割り当てるメモリサイズ(バイト数)

Memory Start Address

割り当てたメモリの先頭アドレス

リターンパラメータ
void*

addr

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_MEMLIB

メモリ割当てライブラリのサポート

解説
size で指定したバイト数のメモリを割り当て、その先頭アドレスを addr に返す。
指定したサイズのメモリの割当てができなかった場合や、size に0が指定された場合は、addr に NULL が返る。
Kmalloc を含むメモリ割当てライブラリのAPIは、タスク独立部およびディスパッチ禁止中、割込み禁止中に呼び出すことはできない。呼び出した場合の動作は、システムダウンの可能性も含めて不定であり、呼出時の状態を保証するのは、呼出側の責任である。
補足事項
size には任意の値を指定できるが、管理領域の確保や、割り当てるメモリアドレスのアラインメントの調整といった理由により、内部的には、size で指定したバイト数よりも大きなメモリが割り当てられる場合がある。たとえば、割当て可能なメモリサイズの最低が16バイトで、アラインメントが8バイト単位という実装の場合には、size に16バイト未満の値を指定した場合でも、内部的には16バイトのメモリが割り当てられる。また、size に20バイトの値を指定した場合でも、内部的には24バイトのメモリが割り当てられる。

μT-Kernel 3.0仕様書

5.1.1.2

268 / 487

Kcalloc - メモリの割当てとクリア

C言語インタフェース#include <tk/tkernel.h>void* Kcalloc(size_t nmemb, size_t size);
パラメータ
size_tsize_tnmemb
size

Number of Memory Blocks
Size

割り当てるメモリブロックの個数割り当てるメモリブロックのサイズ(バイト数)

Memory Start Address

割り当てたメモリの先頭アドレス

リターンパラメータ
void*

addr

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_MEMLIB

メモリ割当てライブラリのサポート

解説
size で指定したバイト数のメモリブロックを、nmemb で指定された個数だけ連続して割り当て、0クリアしてから、その先頭アド
レスを addr に返す。メモリ割当ての動作は、size と nmemb を乗じたバイト数のメモリブロック1個を割り当てるのと同じである。
指定した個数のメモリブロックの割当てができなかった場合や、nmemb または size に0が指定された場合は、addr に NULL が返る。
Kcalloc を含むメモリ割当てライブラリのAPIは、タスク独立部およびディスパッチ禁止中、割込み禁止中に呼び出すことはできない。呼び出した場合の動作は、システムダウンの可能性も含めて不定であり、呼出時の状態を保証するのは、呼出側の責
任である。
補足事項
内部的には、size と nmemb を乗じたバイト数よりも大きなメモリが割り当てられる場合がある。詳細は Kmalloc の補足事項
を参照のこと。

μT-Kernel 3.0仕様書

5.1.1.3

269 / 487

Krealloc - メモリの再割当て

C言語インタフェース#include <tk/tkernel.h>void* Krealloc(void *ptr, size_t size);
パラメータ
void*
size_tptr
size

Pointer to Memory
Size

再割当て対象のメモリアドレス
再割当て後のメモリサイズ(バイト数)

Memory Start Address

再割当てされたメモリの先頭アドレス

リターンパラメータ
void*

addr

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_MEMLIB

メモリ割当てライブラリのサポート

解説
ptr で指定した割当て済のメモリのサイズを、size で指定されたサイズに変更する。その際にメモリの再割当てを行い、再割当て後のメモリの先頭アドレスを addr に返す。
サイズ変更をともなうメモリの再割当てにより、一般にはメモリの先頭アドレスが移動し、addr は ptr と異なった値になる。ただし、その場合でも、再割当ての対象となったメモリの内容は保存される。このため、Krealloc の処理の中でメモリ内容のコピーを行う。また、再割当てにより不要になったメモリは解放される。
ptr には、Kmalloc、Kcalloc、Krealloc で割り当てられたメモリの先頭アドレスを指定する必要がある。ptr の正当性は呼出側で保証しなければならない。
ptr に NULL を指定した場合は、新しいメモリの割当てのみを行う。この場合の動作は Kmalloc と同一である。
指定したサイズのメモリの再割当てができなかった場合や、size に0が指定された場合は、addr に NULL が返る。このとき、ptr に NULL 以外が指定されていれば、ptr のメモリの解放だけを行う。この場合の動作は Kfree と同一である。
Krealloc を含むメモリ割当てライブラリのAPIは、タスク独立部およびディスパッチ禁止中、割込み禁止中に呼び出すことはできない。呼び出した場合の動作は、システムダウンの可能性も含めて不定であり、呼出時の状態を保証するのは、呼出側の責任である。

μT-Kernel 3.0仕様書

270 / 487

補足事項
再割当てによりメモリサイズが小さくなる場合や、ptr で指定されるメモリの周辺に未割当てのメモリが残っている場合など、状況によっては、addr に返るメモリアドレスが ptr と同一となることがある。
内部的には、sizeで指定したバイト数よりも大きなメモリが割り当てられる場合がある。詳細は Kmalloc の補足事項を参照のこと。

μT-Kernel 3.0仕様書

5.1.1.4

271 / 487

Kfree - メモリの解放

C言語インタフェース#include <tk/tkernel.h>void Kfree(void *ptr);
パラメータ
void*

ptr

Pointer to Memory

解放するメモリの先頭アドレス

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_MEMLIB

メモリ割当てライブラリのサポート

解説
ptr で指定したメモリを解放する。
ptr には、Kmalloc、Kcalloc、Krealloc で割り当てられたメモリの先頭アドレスを指定する必要がある。ptr の正当性は呼出側で保証しなければならない。
Kfree を含むメモリ割当てライブラリのAPIは、タスク独立部およびディスパッチ禁止中、割込み禁止中に呼び出すことはできない。呼び出した場合の動作は、システムダウンの可能性も含めて不定であり、呼出時の状態を保証するのは、呼出側の責任である。

μT-Kernel 3.0仕様書

272 / 487

5.2 デバイス管理機能
デバイス管理機能は、μT-Kernel上で動作するデバイスドライバを管理するための機能である。
デバイスドライバとは、主としてハードウェアのデバイスの操作や入出力を行うために、μT-Kernel本体とは独立して実装されるプログラムである。アプリケーションやミドルウェアによるデバイスの操作や入出力を、デバイスドライバ経由で行うことにより、個々のデバイスの仕様の差異をデバイスドライバ側で吸収し、アプリケーションやミドルウェアのハードウェア非依存性や互換性を高めることができる。
デバイス管理機能には、デバイスドライバを定義するための機能、すなわちμT-Kernelにデバイスドライバを登録するための機能と、登録済みのデバイスドライバをアプリケーションやミドルウェアから利用するための機能が含まれる。
デバイスドライバの登録は、システム起動時の初期化処理の中で行う場合が多いが、システムの通常の動作中に動的に行うことも可能である。デバイスドライバの登録は tk_def_dev によって行われ、このAPIのパラメータの一つであるデバイス登録
情報(ddev)の中で、デバイスドライバの実際の処理を行うプログラムの関数(ドライバ処理関数)群を指定する。この中には、デバイスのオープン時に呼び出されるオープン関数(openfn)、読込み時や書込みの処理開始時に呼び出される処理開始関数(execfn)、読込み時や書込みの処理の完了を待つ完了待ち関数(waitfn)などがあり、これらのドライバ処理関数の中で、実際のデバイスの操作やデバイスとの入出力の処理を行う。
これらのドライバ処理関数は、準タスク部として保護レベル0で実行されるため、ハードウェアに直接アクセスすることも可能である。デバイスとの入出力などの処理は、これらのドライバ処理関数の中で直接行う場合もあるし、これらのドライバ処理関数の中から出された要求に応じて動作する別タスク等の中で行う場合もある。これらのドライバ処理関数が呼び出される際のパラメータ等の仕様は、デバイスドライバインタフェースとして規定される。デバイスドライバインタフェースは、デバイスドライバとμT-Kernelのデバイス管理機能との間のインタフェースである。
デバイスドライバのプログラムは、その保守性や移植性を高めるために、インタフェース層、論理層、物理層の3段階の階層分けを意識して実装することが推奨される。インタフェース層はμT-Kernelのデバイス管理機能とデバイスドライバとの間のインタフェースを処理する部分、論理層はデバイスの種類に応じて共通の処理を行う部分、物理層は実際のハードウェア
や制御チップに依存した処理を行う部分である。ただし、インタフェース層、論理層、物理層の間のインタフェースについて、
μT-Kernelで仕様を規定しているわけではなく、実際の階層分けについては、個々のデバイスドライバにおいて最適な実装を行うことができる。インタフェース層については、個々のデバイスに依存しない共通の処理が多いため、インタフェース層の処理を行うプログラムがライブラリとして提供される場合がある。
一方、登録済みのデバイスドライバをアプリケーションやミドルウェアから利用するために、オープン(tk_opn_dev)、クローズ(tk_cls_dev)、読込み(tk_rea_dev)、書込み(tk_wri_dev)などがAPIとして提供されている。これらのAPIの仕様をアプリケ
ーションインタフェースと呼ぶ。たとえば、アプリケーションがデバイスをオープンするために tk_opn_dev を実行した場合、μT-Kernelは、対応するデバイスドライバのオープン関数(openfn)を呼び出して、デバイスのオープンの処理を依頼する。
μT-Kernelのデバイス管理機能の位置付けと構成を図 5.1. 「デバイス管理機能」に示す。

μT-Kernel 3.0仕様書

273 / 487

図 5.1: デバイス管理機能
補足事項
デバイスドライバは、μT-Kernel本体とは独立して実装され、μT-Kernelの機能に対して拡張や追加を行うシステムプロ
グラムであるという点で、サブシステムと共通の特徴を持つ。また、保護レベル0で動作し、ハードウェアへのアクセスが可能である点についても、両者とも共通である。一方、両者の相違点としては、デバイスドライバを呼び出す際のAPIがオープン／クローズ、リード／ライト型に固定されているのに対して、サブシステムを呼び出す際のAPIは自由に定義できる。
デバイス管理機能によって管理されるμT-Kernelのデバイスドライバは、物理的な意味でのデバイスやハードウェアに対するドライバを想定した機能であるが、物理的な意味でのデバイスやハードウェアを扱うことが必須ではない。一方、デバイスを操作するためのシステムプログラムであっても、オープン／クローズ、リード／ライト型のAPIが馴染まない場合など、デバイスドライバではなくサブシステムとして実装されることがある。

μT-Kernel 3.0仕様書

274 / 487

5.2.1 デバイスドライバに関する共通事項
5.2.1.1

デバイスの基本概念

デバイスには、物理的なハードウェアとしてのデバイスを表す物理デバイスのほかに、ソフトウェアから見たデバイスの単位である論理デバイスがある。
多くのデバイスにおいて両者は一致するが、ハードディスクやストレージ系のデバイス(SDカード, USBストレージなど)の中に区画(パーティション)を作った場合には、デバイス全体が物理デバイス、1つの区画が論理デバイスとなる。
同種類の物理デバイスは「ユニット」により区別され、1つの物理デバイス内の論理デバイスは「サブユニット」により区別される。たとえば、1台目のハードディスクと2台目のハードディスクを区別する情報が「ユニット」であり、1台目のハードディスク内の1つ目の区画と2つ目の区画を区別する情報が「サブユニット」である。
デバイス管理機能で使用するデータの定義は、以下の通りである。なお、以下の説明のうち、具体的なデバイス名やデバイスに依存した属性などに言及した部分は、μT-Kernelの仕様ではなく、デバイスドライバの仕様に対する共通的なガイドラインを定めたものである。各デバイスドライバは、必ずしもここに定められたすべての機能を実装する必要はないが、各デバイスドラ
イバの説明は、以下の仕様と矛盾のないように定める必要がある。
5.2.1.1.1

デバイス名 (UB*型)

デバイス名は、デバイス毎につけられた最大8文字の文字列であり、文字コードはUS-ASCIIを使用する。デバイス名は次の要素により構成される。
# define L_DEVNM

8/* デバイス名の長さ */種別
デバイスの種別を示す名前
使用可能な文字は a〜z A〜Z
ユニット
物理的なデバイスを示す英字1文字
a〜zでユニットごとにaから順に割り当てる
サブユニット
論理的なデバイスを示す数字最大3文字
0〜254でサブユニットごとに0から順に割り当てる
デバイス名は、種別＋ユニット＋サブユニットの形式で表すが、ユニット、サブユニットはデバイスによっては存在しない場合もあり、その場合はそれぞれのフィールドは存在しない。
サブユニットは、ハードディスクなどの区画(パーティション)を区別するために使用するが、それ以外のデバイスにおいても、1つの物理デバイスの中に複数の論理的なデバイスを設けたい場合に使用できる。
種別＋ユニットの形式を物理デバイス名と呼ぶ。また、種別＋ユニット＋サブユニットを論理デバイス名と呼ぶ。サブユニットがない場合は、物理デバイス名と論理デバイス名は同じになる。単にデバイス名と言ったときは、論理デバイス名を指す。
デバイス名の例
デバイス名
hda
hda0
fda
rsa
kbpd
fla
neta

対象デバイスハードディスク(ディスク全体)
ハードディスク(先頭の区画)
フロッピーディスク
シリアルポート
キーボード／ポインティングデバイス
フラッシュメモリ
ネットワークμT-Kernel 3.0仕様書

5.2.1.1.2

275 / 487

デバイスID (ID型)

デバイス(デバイスドライバ)を μT-Kernel/SMに登録することにより、デバイス(物理デバイス名)に対してデバイスID(>0)が割り当てられる。デバイスIDは物理デバイスごとに割り当てられ、論理デバイスのデバイスIDは物理デバイスに割り当てられたデバイスIDにサブユニット番号+1(1〜255)を加えたものとなる。
devid: 登録時に割り当てられたデバイスID
devid
devid + n+1

物理デバイスn 番目のサブユニット(論理デバイス)

デバイスIDの例
デバイス名
hda
hda0
hda1

5.2.1.1.3

デバイスID
devid
devid + 1
devid + 2

説明
ハードディスク(ディスク全体)
ハードディスクの先頭の区画
ハードディスクの２番目の区画

デバイス属性 (ATR型)

各デバイスの特徴を表すとともに、デバイスの種類分けを行うため、デバイス属性を定義する。デバイス属性は、デバイスドライ
バを登録する際に指定する。
デバイス属性の指定方法は、次の通りである。
IIII IIII IIII IIII PRxx xxxx KKKK KKKK
上位16ビットは、デバイス依存属性で、デバイスごとに定義される。下位16ビットは、標準属性で、下記のように定義される。
# define TD_PROTECT# define TD_REMOVABLE

0 x8000
0 x4000/* P : 書込み禁止 *//* R : メディアの取り外し可能 */# define TD_DEVKIND# define TD_DEVTYPE

0 x00ff
0 x00f0/* K : デバイス/メディア種別 *//*デバイスタイプ */# define TDK_UNDEF# define TDK_DISK

0 x0000
0 x0010/* デバイスタイプ *//* 未定義/不明 *//* ディスクデバイス */μT-Kernelの範囲では、ディスクタイプ以外のデバイスタイプは定義されておらず、ディスクタイプ以外のデバイスタイプを定義しても、μT-Kernelの動作には影響しない。未定義のデバイスは、未定義 TDK_UNDEF とする。
ディスクデバイスの場合には、さらに、ディスク種別が定義される。代表的なディスク種別は以下の通りである。
/* ディスク種別 */# define TDK_DISK_UNDEF# define TDK_DISK_RAM# define TDK_DISK_ROM# define TDK_DISK_FLA# define TDK_DISK_FD# define TDK_DISK_HD# define TDK_DISK_CDROM

0 x00100 x00110 x00120 x00130 x00140 x00150 x0016/* その他のディスク *//* RAMディスク(主メモリ使用) *//* ROMディスク(主メモリ使用) *//* Flash ROM、その他のシリコンディスク *//* フロッピーディスク *//* ハードディスク *//* CD - ROM */μT-Kernel 3.0仕様書

276 / 487

ディスク種別の定義は、μT-Kernelの動作には影響しない。これらの定義は、デバイスドライバやアプリケーションにおいて、必要な場合にのみ利用する。たとえば、アプリケーションがデバイスやメディアの種類によって処理内容を変える必要がある場
合に、ディスク種別の情報を利用する。特に明確な区別をする必要がないデバイスやメディアに対しては、必ずしもディスク種
別を割り当てる必要はない。
5.2.1.1.4

デバイスディスクリプタ (ID型)

デバイスディスクリプタは、デバイスをアクセスするための識別子である。
デバイスディスクリプタは、デバイスをオープンしたときに、μT-Kernel/SMによって正の値(>0)が割り当てられる。
5.2.1.1.5

リクエストID (ID型)

デバイスに対する入出力を要求したときには、その要求の識別子として、リクエストID(>0)が割り当てられる。このリクエストID
により入出力の完了を待つことができる。
5.2.1.1.6

データ番号 (W型, D型)

デバイスから入出力するデータはデータ番号により指定する。データは固有データと属性データに大別される。
固有データ：データ番号≧0
デバイス固有のデータで、データ番号はデバイスごとに定義される。
固有データの例
デバイス
ディスク
シリアル回線

データ番号
データ番号＝物理ブロック番号
データ番号は0のみ使用

属性データ：データ番号＜0
ドライバやデバイスの状態の取得や設定、特殊機能などを指定する。
データ番号のいくつかは共通で定義されているが、デバイス独自にも定義できる。詳細は項5.2.1.2. 「属性データ」を参照。

μT-Kernel 3.0仕様書

5.2.1.2

277 / 487

属性データ

属性データは大きく次の3つに分類される。
共通属性
すべてのデバイス(デバイスドライバ)に共通に定義する属性。
デバイス種別属性
同じ種類に分類されるデバイス(デバイスドライバ)に共通に定義する属性。
デバイス個別属性
各デバイス(デバイスドライバ)ごとに独自に定義される属性。
デバイス種別属性およびデバイス個別属性については、デバイスドライバの仕様書で定める。ここでは、共通属性のみ定義する。
共通属性の属性データ番号は -1〜-99 の範囲となる。共通属性のデータ番号はすべてのデバイスで共通となるが、すべてのデバイスが必ずしもすべての共通属性に対応しているとは限らない。対応していないデータ番号を指定されたときは、エラー
E_PAR とする。
共通属性の定義は、以下の通りである。
# define# define# define# define# define

TDN_EVENTTDN_DISKINFO
TDN_DISPSPECTDN_PCMCIAINFO
TDN_DISKINFO_D

( -1)
( -2)
( -3)
( -4)
( -5)

/*
/*
/*
/*
/*

RW :事象通知用メッセージバッファID */R -:ディスク情報 */reserved */reserved */R -:ディスク情報(64ビットデバイス) */RW: 読込み(tk_rea_dev)/書込み(tk_wri_dev)可能
R-: 読込み(tk_rea_dev)のみ可能
TDN_EVENT
事象通知用メッセージバッファID
データ形式

ID

デバイス事象通知用のメッセージバッファのIDである。
デバイスドライバの起動時には、tk_def_dev によってデバイスの登録を行うが、このAPIのリターンパラメータとしてシステムデフォルトの事象通知用メッセージバッファID(evtmbfid)が返されるので、その値をデバイスドライバ内で保持し、本属性データの初期値とする。
0が設定されている場合は、デバイス事象通知を行わない。デバイス事象通知については、項5.2.3.3. 「デバイス事象通知」を参照。
TDN_DISKINFO
32ビットデバイス・ディスク情報
データ形式
typedef enum {DiskFmt_STD
DiskFmt_CDROM} DiskFormat ;DiskInfo= 0,= 4

typedef struct {DiskFormat format ;UWprotect :1;
UW
removable :1;
UW
rsv :30;/* 標準( HDなど) *//* CD - ROM 640 MB *//* フォーマット形式 *//* プロテクト状態 *//* 取り外し可否 *//* 予約 (常に0) */μT-Kernel 3.0仕様書

W
W} DiskInfo ;278 / 487

blocksize ;blockcont ;/* ブロックバイト数 *//* 総ブロック数 */

上記の記載以外のDiskFormatの定義については、デバイスドライバ関連の仕様書を参照のこと。
TDN_DISPSPEC
表示デバイス仕様
データ形式

DEV_SPEC

DEV_SPECの定義については、デバイスドライバ関連の仕様書を参照のこと。
TDN_DISKINFO_D
64ビットデバイス・ディスク情報
データ形式
typedef struct diskinfo_d {DiskFormat format ;BOOL
protect :1;
BOOL
removable :1;
UW
rsv :30;
W
blocksize ;Dblockcont_d ;} DiskInfo_D ;DiskInfo_D/* フォーマット形式 *//* プロテクト状態 *//* 取り外し可否 *//* 予約 (0) *//* ブロックバイト数 *//* 64ビットの総ブロック数 */

DiskInfo_DとDiskInfoとの差異は、blockcont あるいは blockcont_d の部分の名称およびデータタイプのみである。
μT-Kernel/SMは、DiskInfoとDiskInfo_Dの間の変換は行わない。TDN_DISKINFO も TDN_DISKINFO_D も、デバイス
ドライバへの要求をそのまま渡すのみである。
デ ィ ス ク ド ラ イ バ は、TDN_DISKINFO ま た は TDN_DISKINFO_D の い ず れ か 一 方、 ま た は 両 方 に 対 応 す る 必 要 が ある。TDN_DISKINFO は可能な限り対応することを推奨する。
ディスク全体の総ブロック数がWに収まらない場合でも、個々の区画のブロック数はWに収まることがある。そのような場
合、Wに収まる区画は TDN_DISKINFO に対応し、Wに収まらないもののみ TDN_DISKINFO はエラー(E_PAR)とするような実装が望ましい。また、ブロック数がWに収まる場合であっても、TDN_DISKINFO_D に対応することは望ましいことである。
TDN_DISKINFO_D への対応とデバイスドライバ属性の TDA_DEV_D には直接の依存関係がない。TDN_DISKINFO_D に対応しているからといって TDA_DEV_D 属性のデバイスドライバであるとは限らないし、TDA_DEV_D 属性のデバイスドライバ
であっても TDN_DISKINFO_D に対応しているとは限らない。
なお、上記の共通属性の定義は、μT-Kernelではなくデバイスドライバの仕様の一部を定めるものであり、μT-Kernelの動作には直接影響しない。また、各デバイスドライバは、共通属性に定義されたすべての機能を実装する必要はない。しかし、共通属性の定義はすべてのデバイスドライバに対して有効であり、各デバイスドライバの仕様は、これらの定義と矛盾のないように定める必要がある。

μT-Kernel 3.0仕様書

279 / 487

5.2.2 デバイスの入出力操作
登録済みのデバイスドライバをアプリケーションやミドルウェアから利用するためには、アプリケーションインタフェースを使用する。アプリケーションインタフェースには下記の関数がある。これらの関数は、タスク独立部およびディスパッチ禁止中、割込み禁止中に呼び出すことはできない(E_CTX)。
ID
ER
ID
ID
ER
ER
ID
ID
ER
ER
ID
ID
INT
ID
ID
ID
INT
INT

tk_opn_dev ( CONST UB * devnm , UINT omode )tk_cls_dev ( ID dd , UINT option )tk_rea_dev ( ID dd , W start , void * buf , SZ size , TMO tmout )tk_rea_dev_du ( ID dd , D start_d , void * buf , SZ size , TMO_U tmout_u )tk_srea_dev ( ID dd , W start , void * buf , SZ size , SZ * asize )tk_srea_dev_d ( ID dd , D start_d , void * buf , SZ size , SZ * asize )tk_wri_dev ( ID dd , W start , CONST void * buf , SZ size , TMO tmout )tk_wri_dev_du ( ID dd , D start_d , CONST void * buf , SZ size , TMO_U tmout_u )tk_swri_dev ( ID dd , W start , CONST void * buf , SZ size , SZ * asize )tk_swri_dev_d ( ID dd , D start_d , CONST void * buf , SZ size , SZ * asize )tk_wai_dev ( ID dd , ID reqid , SZ * asize , ER * ioer , TMO tmout )tk_wai_dev_u ( ID dd , ID reqid , SZ * asize , ER * ioer , TMO_U tmout_u )tk_sus_dev ( UINT mode )tk_get_dev ( ID devid , UB * devnm )tk_ref_dev ( CONST UB * devnm , T_RDEV * rdev )tk_oref_dev ( ID dd , T_RDEV * rdev )tk_lst_dev ( T_LDEV * ldev , INT start , INT ndev )tk_evt_dev ( ID devid , INT evttyp , void * evtinf )μT-Kernel 3.0仕様書

5.2.2.1

280 / 487

tk_opn_dev - デバイスのオープン

C言語インタフェース#include <tk/tkernel.h>
ID dd = tk_opn_dev(CONST UB *devnm, UINT omode);
パラメータ
CONST UB*
UINT

devnm
omode

Device NameOpen Mode

デバイス名
オープンモード

Device Descriptor
Error Code

デバイスディスクリプタ
エラーコードリターンパラメータ
ID

dd
または

エラーコードE_BUSYE_NOEXS
E_LIMITその他

デバイスは使用中(排他オープン中)
デバイスは存在しない
オープン可能な最大数を超えた
デバイスドライバから返されたエラーコード

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
devnm で指定したデバイスを omode で指定したモードでオープンし、デバイスへのアクセスを準備する。戻値に、デバイスディ
スクリプタを返す。
omode := (TD_READ || TD_WRITE || TD_UPDATE) | [TD_EXCL || TD_WEXCL || TD_REXCL]# define# define# define# define# define# define

TD_READ
TD_WRITE
TD_UPDATE
TD_EXCL
TD_WEXCLTD_REXCLTD_READ
読込み専用

0 x0001
0 x0002
0 x0003
0 x0100
0 x0200
0 x0400/* 読込み専用 *//* 書込み専用 *//* 読込みおよび書込み *//* 排他 *//* 排他書込み *//* 排他読込み */μT-Kernel 3.0仕様書

281 / 487

TD_WRITE
書込み専用
TD_UPDATE
読込みおよび書込み
アクセスモードを指定する。
TD_READ の場合は、tk_wri_dev は使用できない。
TD_WRITE の場合は、tk_rea_dev は使用できない。
TD_EXCL排他
TD_WEXCL
排他書込み
TD_REXCL
排他読込み
排他モードを指定する。
TD_EXCL は、一切の同時オープンを禁止する。
TD_WEXCL は、書込みモード(TD_WRITE または TD_UPDATE)による同時オープンを禁止する。
TD_REXCL は、読込みモード(TD_READ または TD_UPDATE)による同時オープンを禁止する。

現在オープンモード

排他指定なしTD_WEXCLTD_REXCL

TD_EXCL

R
Ｕ
Ｗ
R
Ｕ
Ｗ
R
Ｕ
Ｗ
R
Ｕ
Ｗ

排他指定なし
R
U
W
○
○
○
○
○
○
○
○
○
○
×
×
○
×
×
○
×
×
×
×
○
×
×
○
×
×
○
×
×
×
×
×
×
×
×
×

同時オープンモード
TD_WEXCLTD_REXCL
R
U
W
R
U
W
○
○
○
×
×
×
×
×
×
×
×
×
×
×
×
○
○
○
○
×
×
×
×
×
×
×
×
×
×
×
×
×
×
○
×
×
×
×
○
×
×
×
×
×
×
×
×
×
×
×
×
×
×
○
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×

R
×
×
×
×
×
×
×
×
×
×
×
×

TD_EXCL
U
W
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×

表 5.1: 同じデバイスを同時にオープンしようとしたときの可否

R = TD_READ
W = TD_WRITE
U = TD_UPDATE○ = オープン可× = オープン不可(E_BUSY)
なお、物理デバイスをオープンした場合、その物理デバイスに属する論理デバイスをすべて同じモードでオープンしたのと同様に扱い、排他オープンの処理が行われる。

μT-Kernel 3.0仕様書

5.2.2.2

282 / 487

tk_cls_dev - デバイスのクローズ

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_cls_dev(ID dd, UINT option);
パラメータ
ID
UINT

dd
optionDevice Descriptor
Close Option

デバイスディスクリプタ
クローズオプション

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコードE_ID
その他

dd が不正またはオープンされていない
デバイスドライバから返されたエラーコード

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
dd のデバイスディスクリプタをクローズする。処理中の要求があった場合は、その処理を中止させてクローズする。
option := [TD_EJECT]# define TD_EJECT

0 x0001/* メディア排出 */TD_EJECT
メディア排出同一デバイスが他からオープンされていなければ、メディアを排出する。ただし、メディアの排出ができないデバイスでは無視される。

μT-Kernel 3.0仕様書

5.2.2.3

283 / 487

tk_rea_dev - デバイスの読込み開始

C言語インタフェース#include <tk/tkernel.h>
ID reqid = tk_rea_dev(ID dd, W start, void *buf, SZ size, TMO tmout);
パラメータ
ID
W

dd
start

Device Descriptor
Start Location

void*
SZ
TMO

buf
size
tmout

BufferRead Size
Timeout

デバイスディスクリプタ
読込み開始位置(≧0:固有データ, ＜0:属性
データ)
読み込んだデータを格納するバッファ
読み込むサイズ
要求受付待ちタイムアウト時間(ミリ秒)

Request ID
Error Code

リクエストID
エラーコードリターンパラメータ
ID

reqid
または

エラーコード
E_ID
E_OACV
E_LIMIT
E_TMOUTE_ABORTその他

dd が不正またはオープンされていない
オープンモードが不正(読込みが許可されていない)
最大リクエスト数を超えた
他の要求を処理中で受け付けられない
処理中止
デバイスドライバから返されたエラーコード

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
デバイスから固有データまたは属性データの読込みを開始する。読込みを開始するのみで、読込み完了を待たずに呼出元へ戻る。読込みが完了するまで、buf を保持しなければならない。読込み完了は tk_wai_dev により待つ。読込み開始のための処理にかかる時間はデバイスドライバにより異なる。必ずしも即座に戻るとは限らない。
固有データの場合、start および size の単位はデバイスごとに決められる。属性データの場合、start は属性データ番号、size はバイト数となり、start のデータ番号の属性データを読み込む。通常、size は読み込む属性データのサイズ以上でなければならない。複数の属性データを一度に読み込むことはできない。size＝0を指定した場合、実際の読込みは行わず、現時点で読込み可能なサイズを調べる。
読込みまたは書込みの動作中である場合、新たな要求を受け付けられるか否かはデバイスドライバによる。新たな要求を受け付けられない状態の場合、要求受付待ちとなる。要求受付待ちのタイムアウト時間を tmout に指定する。tmout には TMO_POL

μT-Kernel 3.0仕様書

284 / 487

または TMO_FEVR を指定することもできる。なお、タイムアウトするのは要求受付までである。要求が受け付けられた後にはタイムアウトしない。
TDA_DEV_D や TDA_TMO_U 属性のデバイスドライバに対して、本APIを使用しても構わない。その場合、μT-Kernel/SMの中でパラメータを適切に変換する。たとえば、デバイスドライバの属性が TDA_TMO_U の場合、本APIの tmout で指定されたミリ秒
単位のタイムアウト時間が、マイクロ秒単位の時間に換算された上で、TDA_TMO_U 属性のデバイスドライバに渡される。

μT-Kernel 3.0仕様書

5.2.2.4

285 / 487

tk_rea_dev_du - デバイスの読込み開始(64ビットマイクロ秒単位)

C言語インタフェース#include <tk/tkernel.h>
ID reqid = tk_rea_dev_du(ID dd, D start_d, void *buf, SZ size, TMO_U tmout_u);
パラメータ
ID
D

dd
start_d

Device Descriptor
Start Location

void*
SZ
TMO_U

buf
size
tmout_u

BufferRead Size
Timeout

デバイスディスクリプタ
読込み開始位置(64ビット, ≧0:固有データ,＜0:属性データ)読み込んだデータを格納するバッファ
読み込むサイズ
要求受付待ちタイムアウト時間(マイクロ秒)

Request ID
Error Code

リクエストID
エラーコードリターンパラメータ
ID

reqid
または

エラーコード
E_ID
E_OACV
E_LIMIT
E_TMOUTE_ABORTその他

dd が不正またはオープンされていない
オープンモードが不正(読込みが許可されていない)
最大リクエスト数を超えた
他の要求を処理中で受け付けられない
処理中止
デバイスドライバから返されたエラーコード

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_LARGEDEVTK_SUPPORT_USEC

大容量デバイス(64ビット)のサポート
マイクロ秒のサポート

解説
tk_rea_dev のパラメータである start および tmout を、64ビットの start_d および64ビットマイクロ秒単位の tmout_u としたAPIである。
パラメータが start_d および tmout_u となった点を除き、本APIの仕様は tk_rea_dev と同じである。詳細は tk_rea_dev の説明を参照のこと。

μT-Kernel 3.0仕様書

286 / 487

補足事項
対応するデバイスドライバが TDA_DEV_D 属性のデバイスドライバでない場合に、開始位置 start_d としてWに入りきらない値を指定すると、E_PAR のエラーになる。
また、対応するデバイスドライバが TDA_TMO_U 属性のデバイスドライバでない(マイクロ秒単位に対応していない)場合には、デバイスドライバがマイクロ秒単位のタイムアウトを扱うことができない。この場合は、本APIの tmout_u で指定されたマイクロ秒
単位のタイムアウト時間が、ミリ秒単位の時間に切り上げられた上で、デバイスドライバに渡される。
このように、μT-Kernel/SMの中でパラメータの適切な変換を行うので、アプリケーション側では、デバイスドライバの属性がTDA_DEV_D かどうか、すなわちデバイスドライバが64ビット対応かどうかに関して意識する必要はない。

μT-Kernel 3.0仕様書

5.2.2.5

287 / 487

tk_srea_dev - デバイスの同期読込み

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_srea_dev(ID dd, W start, void *buf, SZ size, SZ *asize);
パラメータ
ID
W

dd
start

Device Descriptor
Start Location

void*
SZ
SZ*

buf
size
asize

BufferRead Size
Actual Size

デバイスディスクリプタ
読込み開始位置(≧0:固有データ, ＜0:属性
データ)
読み込んだデータを格納するバッファ
読み込むサイズ
読込みサイズを返す領域へのポインタ

Error CodeActual Size

エラーコード
実際の読込みサイズ

リターンパラメータ
ER
SZ

ercd
asize

エラーコード
E_ID
E_OACV
E_LIMIT
E_ABORTその他

dd が不正またはオープンされていない
オープンモードが不正(読込みが許可されていない)
最大リクエスト数を超えた
処理中止
デバイスドライバから返されたエラーコード

利用可能なコンテキスト
タスク部
○

準タスク部
○

関連するサービスプロファイルなし
解説
同期読込み。以下と等価である。
ER tk_srea_dev ( ID dd , W start , void * buf , SZ size , SZ * asize ){ERer , ioer ;er = tk_rea_dev (dd , start , buf , size , TMO_FEVR );if ( er > 0 ) {er = tk_wai_dev (dd , er , asize , & ioer , TMO_FEVR );if ( er > 0 ) er = ioer ;}タスク独立部×μT-Kernel 3.0仕様書

288 / 487

return er ;}TDA_DEV_D 属性のデバイスドライバに対して、本APIを使用しても構わない。その場合、μT-Kernel/SMの中でパラメータを適切に変換する。

μT-Kernel 3.0仕様書

5.2.2.6

289 / 487

tk_srea_dev_d - デバイスの同期読込み(64ビット)

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_srea_dev_d(ID dd, D start_d, void *buf, SZ size, SZ *asize);
パラメータ
ID
D

dd
start_d

Device Descriptor
Start Location

void*
SZ
SZ*

buf
size
asize

BufferRead Size
Actual Size

デバイスディスクリプタ
読込み開始位置(64ビット, ≧0:固有データ,＜0:属性データ)読み込んだデータを格納するバッファ
読み込むサイズ
読込みサイズを返す領域へのポインタ

Error CodeActual Size

エラーコード
実際の読込みサイズ

リターンパラメータ
ER
SZ

ercd
asize

エラーコード
E_ID
E_OACV
E_LIMIT
E_ABORTその他

dd が不正またはオープンされていない
オープンモードが不正(読込みが許可されていない)
最大リクエスト数を超えた
処理中止
デバイスドライバから返されたエラーコード

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_LARGEDEV

大容量デバイス(64ビット)のサポート

解説
tk_srea_dev のパラメータである start を、64ビットの start_d としたAPIである。
パラメータが start_d となった点を除き、本APIの仕様は tk_srea_dev と同じである。詳細は tk_srea_dev の説明を参照のこと。

μT-Kernel 3.0仕様書

290 / 487

補足事項
対応するデバイスドライバが TDA_DEV_D 属性のデバイスドライバでない場合に、開始位置 start_d としてWに入りきらない値を指定すると、E_PAR のエラーになる。
このように、μT-Kernel/SMの中でパラメータの適切な変換を行うので、アプリケーション側では、デバイスドライバの属性がTDA_DEV_D かどうか、すなわちデバイスドライバが64ビット対応かどうかに関して意識する必要はない。

μT-Kernel 3.0仕様書

5.2.2.7

291 / 487

tk_wri_dev - デバイスの書込み開始

C言語インタフェース#include <tk/tkernel.h>
ID reqid = tk_wri_dev(ID dd, W start, CONST void *buf, SZ size, TMO tmout);
パラメータ
ID
W

dd
start

Device Descriptor
Start Location

CONST void*
SZ
TMO

buf
size
tmout

BufferWrite Size
Timeout

デバイスディスクリプタ
書込み開始位置(≧0:固有データ, ＜0:属性データ)
書き込むデータを格納したバッファ
書き込むサイズ
要求受付待ちタイムアウト時間(ミリ秒)

Request ID
Error Code

リクエストID
エラーコードリターンパラメータ
ID

reqid
または

エラーコード
E_ID
E_OACV
E_RONLY
E_LIMIT
E_TMOUTE_ABORTその他

dd が不正またはオープンされていない
オープンモードが不正(書込みが許可されていない)
書き込めないデバイス
最大リクエスト数を超えた
他の要求を処理中で受け付けられない
処理中止
デバイスドライバから返されたエラーコード

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
デバイスへ固有データまたは属性データの書込みを開始する。書込みを開始するのみで、書込み完了を待たずに呼出元へ戻る。書込みが完了するまで、buf を保持しなければならない。書込み完了は tk_wai_dev により待つ。書込み開始のための処理にかかる時間はデバイスドライバにより異なる。必ずしも即座に戻るとは限らない。
固有データの場合、start および size の単位はデバイスごとに決められる。属性データの場合、start は属性データ番号、size はバイト数となり、start のデータ番号の属性データに書き込む。通常、size は書き込む属性データのサイズと同じでなければならない。複数の属性データを一度に書き込むことはできない。size＝0を指定した場合、実際の書込みは行わず、現時点で書込み可能なサイズを調べる。

μT-Kernel 3.0仕様書

292 / 487

読込みまたは書込みの動作中である場合、新たな要求を受け付けられるか否かはデバイスドライバによる。新たな要求を受け付けられない状態の場合、要求受付待ちとなる。要求受付待ちのタイムアウト時間を tmout に指定する。tmout には TMO_POL
または TMO_FEVR を指定することもできる。なお、タイムアウトするのは要求受付までである。要求が受け付けられた後にはタイムアウトしない。
TDA_DEV_D や TDA_TMO_U 属性のデバイスドライバに対して、本APIを使用しても構わない。その場合、μT-Kernel/SMの中でパラメータを適切に変換する。たとえば、デバイスドライバの属性が TDA_TMO_U の場合、本APIの tmout で指定されたミリ秒
単位のタイムアウト時間が、マイクロ秒単位の時間に換算された上で、TDA_TMO_U 属性のデバイスドライバに渡される。

μT-Kernel 3.0仕様書

5.2.2.8

293 / 487

tk_wri_dev_du - デバイスの書込み開始(64ビットマイクロ秒単位)

C言語インタフェース#include <tk/tkernel.h>
ID reqid = tk_wri_dev_du(ID dd, D start_d, CONST void *buf, SZ size, TMO_U tmout_u);
パラメータ
ID
D

dd
start_d

Device Descriptor
Start Location

CONST void*
SZ
TMO_U

buf
size
tmout_u

BufferWrite Size
Timeout

デバイスディスクリプタ
書込み開始位置(64ビット, ≧0:固有デー
タ, ＜0:属性データ)書き込むデータを格納したバッファ
書き込むサイズ
要求受付待ちタイムアウト時間(マイクロ秒)

リターンパラメータ
ID

reqid
または

Request ID
Error Code

リクエストID
エラーコードエラーコード
E_ID
E_OACV
E_RONLY
E_LIMIT
E_TMOUTE_ABORTその他

dd が不正またはオープンされていない
オープンモードが不正(書込みが許可されていない)
書き込めないデバイス
最大リクエスト数を超えた
他の要求を処理中で受け付けられない
処理中止
デバイスドライバから返されたエラーコード

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_LARGEDEVTK_SUPPORT_USEC

大容量デバイス(64ビット)のサポート
マイクロ秒のサポート

解説
tk_wri_dev のパラメータである start および tmout を、64ビットの start_d および64ビットマイクロ秒単位の tmout_u としたAPIである。
パラメータが start_d および tmout_u となった点を除き、本APIの仕様は tk_wri_dev と同じである。詳細は tk_wri_dev のμT-Kernel 3.0仕様書

294 / 487

説明を参照のこと。
補足事項
対応するデバイスドライバが TDA_DEV_D 属性のデバイスドライバでない場合に、開始位置 start_d としてWに入りきらない値を指定すると、E_PAR のエラーになる。
また、対応するデバイスドライバが TDA_TMO_U 属性のデバイスドライバでない(マイクロ秒単位に対応していない)場合には、デバイスドライバがマイクロ秒単位のタイムアウトを扱うことができない。この場合は、本APIの tmout_u で指定されたマイクロ秒
単位のタイムアウト時間が、ミリ秒単位の時間に切り上げられた上で、デバイスドライバに渡される。
このように、μT-Kernel/SMの中でパラメータの適切な変換を行うので、アプリケーション側では、デバイスドライバの属性がTDA_DEV_D かどうか、すなわちデバイスドライバが64ビット対応かどうかに関して意識する必要はない。

μT-Kernel 3.0仕様書

5.2.2.9295 / 487

tk_swri_dev - デバイスの同期書込み

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_swri_dev(ID dd, W start, CONST void *buf, SZ size, SZ *asize);
パラメータ
ID
W

dd
start

Device Descriptor
Start Location

CONST void*
SZ
SZ*

buf
size
asize

BufferWrite Size
Actual Size

デバイスディスクリプタ
書込み開始位置(≧0:固有データ,＜0:属性データ)
書き込むデータを格納したバッファ
書き込むサイズ
書込みサイズを返す領域へのポインタ

ercd
asize

Error CodeActual Size

エラーコード
実際の書込みサイズ

リターンパラメータ
ER
SZ
エラーコード
E_ID
E_OACV
E_RONLY
E_LIMIT
E_ABORTその他

dd が不正またはオープンされていない
オープンモードが不正(書込みが許可されていない)
書き込めないデバイス
最大リクエスト数を超えた
処理中止
デバイスドライバから返されたエラーコード

利用可能なコンテキスト
タスク部
○

準タスク部
○

関連するサービスプロファイル
なし
解説
同期書込み。以下と等価である。
ER tk_swri_dev ( ID dd , W start , void * buf , SZ size , SZ * asize ){ERer , ioer ;er = tk_wri_dev (dd , start , buf , size , TMO_FEVR );if ( er > 0 ) {er = tk_wai_dev (dd , er , asize , & ioer , TMO_FEVR );if ( er > 0 ) er = ioer ;タスク独立部×μT-Kernel 3.0仕様書

296 / 487}
return er ;}TDA_DEV_D 属性のデバイスドライバに対して、本APIを使用しても構わない。その場合、μT-Kernel/SMの中でパラメータを適切に変換する。

μT-Kernel 3.0仕様書

297 / 487

5.2.2.10 tk_swri_dev_d - デバイスの同期書込み(64ビット)
C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_swri_dev_d(ID dd, D start_d, CONST void *buf, SZ size, SZ *asize);
パラメータ
ID
D

dd
start_d

Device Descriptor
Start Location

CONST void*
SZ
SZ*

buf
size
asize

BufferWrite Size
Actual Size

デバイスディスクリプタ
書込み開始位置(64ビット, ≧0:固有デー
タ, ＜0:属性データ)書き込むデータを格納したバッファ
書き込むサイズ
書込みサイズを返す領域へのポインタ

ercd
asize

Error CodeActual Size

エラーコード
実際の書込みサイズ

リターンパラメータ
ER
SZ
エラーコード
E_ID
E_OACV
E_RONLY
E_LIMIT
E_ABORTその他

dd が不正またはオープンされていない
オープンモードが不正(書込みが許可されていない)
書き込めないデバイス
最大リクエスト数を超えた
処理中止
デバイスドライバから返されたエラーコード

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_LARGEDEV

大容量デバイス(64ビット)のサポート

解説
tk_swri_dev のパラメータである start を、64ビットの start_d としたAPIである。
パラメータが start_d となった点を除き、本APIの仕様は tk_swri_dev と同じである。詳細は tk_swri_dev の説明を参照のこと。

μT-Kernel 3.0仕様書

298 / 487

補足事項
対応するデバイスドライバが TDA_DEV_D 属性のデバイスドライバでない場合に、開始位置 start_d としてWに入りきらない値を指定すると、E_PAR のエラーになる。
このように、μT-Kernel/SMの中でパラメータの適切な変換を行うので、アプリケーション側では、デバイスドライバの属性がTDA_DEV_D かどうか、すなわちデバイスドライバが64ビット対応かどうかに関して意識する必要はない。

μT-Kernel 3.0仕様書

299 / 487

5.2.2.11 tk_wai_dev - デバイスの要求完了待ち
C言語インタフェース#include <tk/tkernel.h>
ID creqid = tk_wai_dev(ID dd, ID reqid, SZ *asize, ER *ioer, TMO tmout);
パラメータ
ID
ID
SZ*

dd
reqid
asize

Device Descriptor
Request ID
Read/Write Actual Size

ER*
TMO

ioer
tmout

I/O Error
Timeout

デバイスディスクリプタ
リクエストID
読込み/書込みサイズを返す領域へのポイン
タ
入出力エラーを返す領域へのポインタ
タイムアウト時間(ミリ秒)Completed Request ID
Error CodeRead/Write Actual Size
I/O Error

完了したリクエストID
エラーコード
実際の読込み/書込みサイズ
入出力エラー

リターンパラメータIDcreqid
または

SZ
ER

asize
ioer

エラーコード
E_ID
E_OBJ
E_NOEXS
E_TMOUTE_ABORTその他

dd が不正またはオープンされていない、reqid が不正または dd に対する要求ではない
reqid の要求は他のタスクで完了待ちしている
処理中の要求はない(reqid＝0の場合のみ)
タイムアウト(処理継続中)
処理中止
デバイスドライバから返されたエラーコード

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
dd に対する reqid の要求の完了を待つ。reqid＝0 の場合は、dd に対する要求の内のいずれかが完了するのを待つ。なお、現時点で処理中の要求のみが完了待ちの対象となる。tk_wai_dev の呼出後に要求された処理は完了待ちの対象とならない。
複数の要求を同時に処理している場合、その要求の完了の順序は必ずしも要求した順序ではなく、デバイスドライバに依存する。ただし、要求した順序で処理した場合と結果が矛盾しないような順序で処理されることは保証される。例えば、ディスクからの読込みの場合、次のような処理順序の変更が考えられる。

μT-Kernel 3.0仕様書

300 / 487

要求順ブロック番号
14325
処理順ブロック番号12345
このように順序を入れ替えて処理することにより、シークや回転待ちを減らすことができ、より効率的にディスクアクセスができる。
tmout に 完 了 待 ち の タ イ ム ア ウ ト 時 間 を 指 定 す る。TMO_POL ま た は TMO_FEVR を 指 定 す る こ と も で き る。 タ イ ム ア ウ ト(E_TMOUT)した場合は要求された処理を継続中なので、再度 tk_wai_dev により完了を待つ必要がある。reqid > 0
かつ tmout＝TMO_FEVR の場合はタイムアウトすることはなく、必ず処理が完了する。
要求された処理に対して、デバイスドライバから処理結果のエラー(入出力エラーなど)が返った場合、そのエラーコードは、戻値ではなく ioer に格納される。具体的には、tk_wai_dev の処理のために呼び出された完了待ち関数 waitfn の中で、要求パケットT_DEVREQの error に格納されたエラーコードが、処理結果のエラーとして ioer に返される。
一方、戻値には、要求の完了待ちが正しくできなかった場合にエラーを返す。戻値にエラーが返された場合、ioer の内容は無意味である。また、戻値にエラーが返された場合は処理を継続中なので、再度 tk_wai_dev により完了を待つ必要がある。詳細は「項5.2.3.2.4. 「waitfn - 完了待ち関数」」を参照のこと。
tk_wai_dev で完了待ち中にタスク例外が発生すると、reqid の要求を中止して処理を完了させる。中止した処理の結果がどのようになるかは、デバイスドライバに依存する。ただし、reqid＝0の場合は、要求を中止することなくタイムアウトと同様に扱われる。この場合は、E_TMOUT ではなく E_ABORT を返す。
同じリクエストIDに対して、複数のタスクから同時に完了待ちすることはできない。reqid＝0で待っているタスクがあれば、同
じ dd に対して他のタスクは完了待ちできない。同様に、reqid > 0で待っているタスクがあれば、他のタスクで reqid＝0の完了待ちはできない。
TDA_TMO_U 属性のデバイスドライバに対して、本APIを使用しても構わない。その場合、μT-Kernel/SMの中でパラメータを適切に変換する。たとえば、デバイスドライバの属性が TDA_TMO_U の場合、本APIの tmout で指定されたミリ秒単位のタイム
アウト時間が、マイクロ秒単位の時間に換算された上で、TDA_TMO_U 属性のデバイスドライバに渡される。

μT-Kernel 3.0仕様書

301 / 487

5.2.2.12 tk_wai_dev_u - デバイスの要求完了待ち(マイクロ秒単位)
C言語インタフェース#include <tk/tkernel.h>
ID creqid = tk_wai_dev_u(ID dd, ID reqid, SZ *asize, ER *ioer, TMO_U tmout_u);
パラメータ
ID
ID
SZ*

dd
reqid
asize

Device Descriptor
Request ID
Read/Write Actual Size

ER*
TMO_U

ioer
tmout_u

I/O Error
Timeout

デバイスディスクリプタ
リクエストID
読込み/書込みサイズを返す領域へのポイン
タ
入出力エラーを返す領域へのポインタ
タイムアウト時間(マイクロ秒)

Completed Request ID
Error CodeRead/Write Actual Size
I/O Error

完了したリクエストID
エラーコード
実際の読込み/書込みサイズ
入出力エラー

リターンパラメータIDcreqid
または

SZ
ER

asize
ioer

エラーコード
E_ID
E_OBJ
E_NOEXS
E_TMOUTE_ABORTその他

dd が不正またはオープンされていない、reqid が不正または dd に対する要求ではない
reqid の要求は他のタスクで完了待ちしている
処理中の要求はない(reqid＝0の場合のみ)
タイムアウト(処理継続中)
処理中止
デバイスドライバから返されたエラーコード

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_USEC

マイクロ秒のサポート

解説
tk_wai_dev のパラメータである tmout を、64ビットマイクロ秒単位の tmout_u としたAPIである。
パラメータが tmout_u となった点を除き、本APIの仕様は tk_wai_dev と同じである。詳細は tk_wai_dev の説明を参照のこと。

μT-Kernel 3.0仕様書

302 / 487

補足事項
対応するデバイスドライバが TDA_TMO_U 属性のデバイスドライバでない(マイクロ秒単位に対応していない)場合には、デバイ
スドライバがマイクロ秒単位のタイムアウトを扱うことができない。この場合は、本APIの tmout_u で指定されたマイクロ秒単位のタイムアウト時間が、ミリ秒単位の時間に切り上げられた上で、デバイスドライバに渡される。
このように、μT-Kernel/SMの中でパラメータの適切な変換を行うので、アプリケーション側では、デバイスドライバの属性がTDA_TMO_U かどうか、すなわちデバイスドライバがマイクロ秒単位に対応かどうかに関して意識する必要はない。

μT-Kernel 3.0仕様書

303 / 487

5.2.2.13 tk_sus_dev - デバイスのサスペンド
C言語インタフェース#include <tk/tkernel.h>
INT dissus = tk_sus_dev(UINT mode);
パラメータ
UINT

mode

Mode

モード

Suspend Disable RequestCount
Error Code

サスペンド禁止要求カウント数

リターンパラメータ
INT

dissusまたは

エラーコードエラーコードE_BUSY
E_QOVR

サスペンド禁止中
サスペンド禁止要求カウントオーバー

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_LOWPOWER

省電力機能のサポート

解説
mode にしたがって処理を行い、その処理を行ったあとのサスペンド禁止要求カウント数を戻値に返す。
mode := ( (TD_SUSPEND | [TD_FORCE]) || TD_DISSUS || TD_ENASUS || TD_CHECK)# define# define# define# define# define

TD_SUSPEND
TD_DISSUS
TD_ENASUS
TD_CHECK
TD_FORCE

0 x0001
0 x0002
0 x0003
0 x0004
0 x8000/* サスペンド *//* サスペンドを禁止 *//* サスペンドを許可 *//* サスペンド禁止要求カウント取得 *//* 強制サスペンド指定 */TD_SUSPEND
サスペンド
サスペンド許可状態であればサスペンドする。
サスペンド禁止状態であれば E_BUSY を返す。

μT-Kernel 3.0仕様書

304 / 487

TD_SUSPEND|TD_FORCE
強制サスペンド
サスペンド禁止状態であってもサスペンドする。
TD_DISSUS
サスペンド禁止
サスペンドを禁止する。
TD_ENASUS
サスペンド許可
サスペンドを許可する。
TD_CHECK
サスペンド禁止カウント取得
サスペンド禁止要求を行っている回数の取得のみ行う。
サスペンドは、次の手順によって行われる。
1. 各サブシステムのサスペンド開始前の処理
tk_evt_ssy(0, TSEVT_SUSPEND_BEGIN, 0)
2. 各デバイスのサスペンド処理
3. 各サブシステムのサスペンド完了後の処理
tk_evt_ssy(0, TSEVT_SUSPEND_DONE, 0)
4. サスペンド状態へ移行
tk_set_pow(TPW_DOSUSPEND)
リジューム(サスペンドからの復帰)は、次の手順によって行われる。
1. サスペンド状態から復帰
tk_set_pow(TPW_DOSUSPEND) から戻る
2. 各サブシステムのリジューム開始前の処理
tk_evt_ssy(0, TSEVT_RESUME_BEGIN, 0)
3. 各デバイスのリジューム処理
4. 各サブシステムのリジューム完了後の処理
tk_evt_ssy(0, TSEVT_RESUME_DONE, 0)
サスペンド禁止は、その要求回数がカウントされる。同じ回数だけサスペンド許可を要求しないとサスペンドは許可されない。
システム起動時はサスペンド許可(サスペンド禁止要求カウント＝0)である。サスペンド禁止要求カウントの上限は実装依存だが、最低255回まではカウントできるものとする。上限を超えた場合は E_QOVR を返す。

μT-Kernel 3.0仕様書

305 / 487

5.2.2.14 tk_get_dev - デバイスのデバイス名取得
C言語インタフェース#include <tk/tkernel.h>
ID pdevid = tk_get_dev(ID devid, UB *devnm);
パラメータ
ID
UB*

devid
devnm

Device ID
Device Name

デバイスID
デバイス名の格納領域へのポインタ

Device ID of Physical Device
Error CodeDevice Name

物理デバイスのデバイスID
エラーコードデバイス名

リターンパラメータ
ID

pdevid
または

UB

devnm

エラーコードE_NOEXS

devid のデバイスは存在しない

利用可能なコンテキスト
タスク部
○

準タスク部
○

関連するサービスプロファイル
なし
解説
devid で示すデバイスのデバイス名を取得し devnm に格納する。
devid は物理デバイスのデバイスIDまたは論理デバイスのデバイスIDである。
devid が物理デバイスであれば、devnm には物理デバイス名が格納される。
devid が論理デバイスであれば、devnm には論理デバイス名が格納される。
devnm は L_DEVNM+1 バイト以上の領域が必要である。
戻値には、devid のデバイスが属する物理デバイスのデバイスIDを返す。

タスク独立部×μT-Kernel 3.0仕様書

306 / 487

5.2.2.15 tk_ref_dev - デバイスのデバイス情報取得
C言語インタフェース#include <tk/tkernel.h>
ID devid = tk_ref_dev(CONST UB *devnm, T_RDEV *rdev);
パラメータ
CONST UB*
T_RDEV*

devnm
rdev

Device Name
Packet to Refer Device
Information

デバイス名
デバイス情報を返す領域へのポインタ

Device ID
Error Code

デバイスID
エラーコードDevice Attribute
Block Size of Device-specific
Data
Subunit Count
Subunit Number

デバイス属性
固有データのブロックサイズ(-1:不明)

リターンパラメータ
ID

devid
または

rdev の内容
ATR
SZ

devatr
blksz

INT
INT

nsub
subno

サブユニット数
0:物理デバイス 1〜nsub:サブユニット番号+1──(以下に実装独自に他の情報を追加してもよい)──

エラーコードE_NOEXS

devnm のデバイスは存在しない

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
devnm で示すデバイスのデバイス情報を取得し、rdev に格納する。rdev＝NULL とした場合には、デバイス情報は格納されない。
nsub は、devnm で示すデバイスが属する物理デバイスのサブユニット数である。
戻値に devnm のデバイスのデバイスIDを返す。

μT-Kernel 3.0仕様書

307 / 487

5.2.2.16 tk_oref_dev - デバイスのデバイス情報取得
C言語インタフェース#include <tk/tkernel.h>
ID devid = tk_oref_dev(ID dd, T_RDEV *rdev);
パラメータ
ID
dd
T_RDEV* rdev

Device Descriptor
Packet to Refer Device
Information

デバイスディスクリプタ
デバイス情報を返す領域へのポインタ

Device ID
Error Code

デバイスID
エラーコードDevice Attribute
Block Size of Device-specific
Data
Subunit Count
Subunit Number

デバイス属性
固有データのブロックサイズ(-1:不明)

リターンパラメータ
ID

devid
または

rdev の内容
ATR
SZ

devatr
blksz

INT
INT

nsub
subno

サブユニット数
0:物理デバイス 1〜nsub:サブユニット番号+1

──(以下に実装独自に他の情報を追加してもよい)──

エラーコードE_ID

dd が不正またはオープンされていない

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
dd で示すデバイスのデバイス情報を取得し、rdev に格納する。rdev＝NULL とした場合には、デバイス情報は格納されない。
nsub は、dd で示すデバイスが属する物理デバイスのサブユニット数である。
戻値に dd のデバイスのデバイスIDを返す。

μT-Kernel 3.0仕様書

308 / 487

5.2.2.17 tk_lst_dev - 登録済みデバイス一覧の取得
C言語インタフェース#include <tk/tkernel.h>
INT remcnt = tk_lst_dev(T_LDEV *ldev, INT start, INT ndev);
パラメータ
T_LDEV* ldev
INT
start
INT
ndev

List of Devices
Starting Number
Number of Devices

登録デバイス情報の格納領域(配列)
開始番号
取得数

Remaining Device Count
Error Code

残りの登録数
エラーコードリターンパラメータ
INT

remcntまたはldev の内容
ATR
SZ

devatrblksz

Device Attribute
Block Size of Device-specific
Data
INT
nsub
Subunit Count
UB
devnm[L_DEVNM]
Physical Device Name──(以下に実装独自に他の情報を追加してもよい)──

デバイス属性
固有データのブロックサイズ(-1:不明)
サブユニット数
物理デバイス名

エラーコードE_NOEXS

start が登録数を超えている

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
登録済みのデバイスの情報を取得する。登録デバイスは物理デバイス単位で管理される。したがって、登録デバイス情報も物
理デバイス単位で取得される。
登録デバイスの数がNの時、登録デバイスに0〜N-1の連番を振る。この連番にしたがって、start 番目から ndev 個の登録情報を取得し、ldev に格納する。ldev は ndev 個の情報を格納するのに十分な大きさの領域でなければならない。戻値には、start 以降の残りの登録数(N-start)を返す。

μT-Kernel 3.0仕様書

309 / 487

start 以降の残りが ndev 個に満たない場合は、残りのすべてを格納する。戻値≦ndev であれば、すべての登録情報が取得できたことを示す。なお、この連番はデバイスの登録・抹消があると変化する。したがって、複数回に分けて取得すると、正確な情報が得られない場合がある。

μT-Kernel 3.0仕様書

310 / 487

5.2.2.18 tk_evt_dev - デバイスにドライバ要求イベントを送信
C言語インタフェース#include <tk/tkernel.h>
INT retcode = tk_evt_dev(ID devid, INT evttyp, void *evtinf);
パラメータ
ID
INT
void*

devid
evttypevtinfDevice ID
Event TypeEvent Information

イベント送信先デバイスID
ドライバ要求イベントタイプ
イベントタイプ別の情報

Return Code from eventfn
Error Codeeventfn からの戻値
エラーコードリターンパラメータ
INT

retcodeまたは

エラーコードE_NOEXS
E_PAR
その他

devid のデバイスは存在しない
デバイス管理内部イベント(evttyp < 0)は指定できない
デバイスドライバから返されたエラーコード

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
devid のデバイス(デバイスドライバ)に、ドライバ要求イベントを送信する。
ドライバ要求イベントの機能(処理内容)および evtinf の内容はイベントタイプごとに定義される。ドライバ要求イベントについては、「項5.2.3.2.6. 「eventfn - イベント関数」」を参照のこと。

μT-Kernel 3.0仕様書

5.2.3 デバイスドライバの登録
5.2.3.1

デバイスドライバの登録方法

デバイスドライバは、物理デバイスごとに登録する。

311 / 487

μT-Kernel 3.0仕様書

5.2.3.1.1

312 / 487

tk_def_dev - デバイスの登録

C言語インタフェース#include <tk/tkernel.h>
ID devid = tk_def_dev(CONST UB *devnm, CONST T_DDEV *ddev, T_IDEV *idev);
パラメータ
CONST UB*CONST T_DDEV*
T_IDEV*

devnm
ddev
idev

Physical Device Name
Define Device
Initial Device Information

物理デバイス名
デバイス登録情報
デバイス初期情報

Device ID
Error Code

デバイスID
エラーコードリターンパラメータ
ID

devid
または

idev の内容
ID

evtmbfid

Event Notification
Message Buffer ID
──(以下に実装独自に他の情報を追加してもよい)──

事象通知用メッセージバッファID

エラーコードE_LIMITE_NOEXS

登録可能な最大数を超えた
devnm のデバイスは存在しない(ddev＝NULL の場合)利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイルなし
解説
devnm のデバイス名でデバイス(デバイスドライバ)を登録し、登録したデバイスのデバイスIDを戻値に返す。devnm のデバイスがすでに登録されているときは、新しい登録情報で更新する。更新の場合は、デバイスIDは変更されない。
ddev でデバイス登録情報を指定する。ddev＝NULL の場合は、devnm のデバイス登録を抹消する。
ddev は次の形式の構造体である。
typedef struct t_ddev {void* exinf ;ATRdrvatr ;ATR
devatr ;/* 拡張情報 *//* ドライバ属性 *//* デバイス属性 */μT-Kernel 3.0仕様書

313 / 487

INT
nsub ;/* サブユニット数 */SZ
blksz ;/* 固有データのブロックサイズ ( -1:不明) */FP
openfn ;/* オープン関数 */FP
closefn ; /* クローズ関数 */FP
execfn ;/* 処理開始関数 */FP
waitfn ;/* 完了待ち関数 */FP
abortfn ; /* 中止処理関数 */FP
eventfn ; /* イベント関数 *//* 以下に実装独自の情報が追加される場合がある */} T_DDEV ;exinf は、任意の情報の格納に使用できる。この値は、各処理関数に渡される。内容に関してデバイス管理では関知しない。
drvatr は、デバイスドライバの属性に関する情報を設定する。下位側がシステム属性を表し、上位側が実装独自属性を表す。
実装独自属性は、T_DDEVに実装独自データを追加する場合に有効フラグを定義するためなどに使用する。
drvatr := [TDA_OPENREQ] ｜ [TDA_TMO_U] ｜ [TDA_DEV_D]# define TDA_OPENREQ# define TDA_TMO_U# define TDA_DEV_D

0 x0001
0 x0002
0 x0004/* 毎回オープン/クローズ *//* マイクロ秒単位タイムアウト時間使用 *//* 64ビットデバイス */drvatr では、以下のドライバ属性を組み合わせて指定することができる。
TDA_OPENREQ
デバイスが多重オープンされた場合、通常は最初のオープン時に openfn が呼び出され、最後のクローズ時に closefn が呼び出される。TDA_OPENREQ を指定した場合、多重オープンの場合でもすべてのオープン／クローズ時に openfn/closefn が呼び出される。
TDA_TMO_U
マイクロ秒単位タイムアウト時間を使用することを示す。
この場合、ドライバ処理関数のタイムアウト指定 tmout がTMO_U型(マイクロ秒単位)となる。
TDA_DEV_D
64ビットデバイスを使用することを示す。この場合、ドライバ処理関数の要求パケット devreq の型がT_DEVREQ_Dとなる。
TDA_TMO_U および TDA_DEV_D を指定した場合、ドライバ処理関数の一部の引数の型が変化する。このような引数の型を変化させるドライバ属性を複数組み合わせて指定した場合は、指定されたすべての型変化を行った引数を持つドライバ処理関数となる。
devatr は、デバイス属性を設定する。デバイス属性の詳細については前述。
nsub は、サブユニット数を設定する。サブユニットがない場合は0とする。
blksz は、固有データのブロックサイズをバイト数で設定する。ディスクデバイスの場合は、物理ブロックサイズとなる。シリアル
回線などは１バイトとなる。固有データのないデバイスでは0とする。未フォーマットのディスクなど、ブロックサイズが不明の場
合は-1とする。blksz≦0の場合は、固有データにアクセスできない。tk_rea_dev, tk_wri_dev で固有データをアクセスする場
合に、size * blksz がアクセスする領域サイズ、つまり buf のサイズとならなければならない。
openfn, closefn, execfn, waitfn, abortfn, eventfn は、ドライバ処理関数のエントリーアドレスを設定する。ドライバ処理関数の詳細については、「項5.2.3.2. 「デバイスドライバインタフェース」」を参照。
idev にデバイス初期情報が返される。ここには、デバイスドライバ起動時のデフォルトとして設定するための情報などが返されるので、必要に応じて利用する。idev＝NULL とした場合には、デバイス初期情報は格納されない。
evtmbfid は、システムデフォルトの事象通知用メッセージバッファIDである。システムデフォルトの事象通知用メッセージバッ
ファがない場合は0が設定される。
デバイス登録および抹消が行われたとき、各サブシステムに対して次のように通知が行われる。devid は登録・抹消された、物理デバイスのデバイスIDである。

μT-Kernel 3.0仕様書

デバイス登録・更新時
tk_evt_ssy(0, TSEVT_DEVICE_REGIST, devid)
デバイス抹消時
tk_evt_ssy(0, TSEVT_DEVICE_DELETE, devid)

314 / 487

μT-Kernel 3.0仕様書

5.2.3.1.2

315 / 487

tk_ref_idv - デバイス初期情報の取得

C言語インタフェース#include <tk/tkernel.h>ER ercd = tk_ref_idv(T_IDEV *idev);
パラメータ
T_IDEV*

idev

Packet to Refer Initial Device
Information

デバイス初期情報を返す領域へのポインタ

Error Code

エラーコードリターンパラメータER

ercd

idev の内容
ID

evtmbfid

Event Notification Message
Buffer ID
──(以下に実装独自に他の情報を追加してもよい)──

事象通知用メッセージバッファID

エラーコードE_MACV

メモリアクセス権違反

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
デバイス初期情報を取得する。tk_def_dev で得られるものと同じ内容である。
補足事項
E_MACV のエラーは、多くのシステムコールで共通に発生する可能性があり、通常はシステムコール別のエラーコードには記載していない。しかし、本APIの場合は代表的なエラーが E_MACV のみであるため、エラーコード欄にこのエラーを記載している。

μT-Kernel 3.0仕様書

5.2.3.2

316 / 487

デバイスドライバインタフェース

デバイスドライバインタフェースは、デバイス登録時に指定した処理関数(ドライバ処理関数)群によって構成される。
オープン関数ER openfn(ID devid, UINT omode, void *exinf);
クローズ関数ER closefn(ID devid, UINT option, void *exinf);
処理開始関数ER execfn(T_DEVREQ *devreq, TMO tmout, void *exinf);
完了待ち関数INT waitfn(T_DEVREQ *devreq, INT nreq, TMO tmout, void *exinf);
中止処理関数ER abortfn(ID tskid, T_DEVREQ *devreq, INT nreq, void *exinf);
イベント関数INT eventfn(INT evttyp, void *evtinf, void *exinf);
ドライバ属性に TDA_TMO_U を指定した場合、次のドライバ処理関数のタイムアウト指定 tmout がTMO_U型(マイクロ秒単位)となる。
処理開始関数ER execfn(T_DEVREQ *devreq, TMO_U tmout_u, void *exinf);
完了待ち関数INT waitfn(T_DEVREQ *devreq, INT nreq, TMO_U tmout_u, void *exinf);
ドライバ属性に TDA_DEV_D を指定した場合、次のドライバ処理関数の要求パケット devreq の型がT_DEVREQ_Dとなる。
処理開始関数ER execfn(T_DEVREQ_D *devreq_d, TMO tmout, void *exinf);
完了待ち関数INT waitfn(T_DEVREQ_D *devreq_d, INT nreq, TMO tmout, void *exinf);
中止処理関数ER abortfn(ID tskid, T_DEVREQ_D *devreq_d, INT nreq, void *exinf);
ドライバ属性に TDA_TMO_U と TDA_DEV_D を指定した場合、指定されたすべての型変化を行った引数を持つドライバ処理関数となる。
処理開始関数ER execfn(T_DEVREQ_D *devreq_d, TMO_U tmout_u, void *exinf);
完了待ち関数INT waitfn(T_DEVREQ_D *devreq_d, INT nreq, TMO_U tmout_u, void *exinf);
ドライバ処理関数は、デバイス管理によって呼び出され、準タスク部として実行される。これらのドライバ処理関数は、再入可能(reentrant)でなければならない。また、ドライバ処理関数が排他的に呼び出されることは保証されない。例えば、複数のタスクから同じデバイスに対して同時に要求があった場合、それぞれのタスクが同時にドライバ処理関数を呼び出すことがある。
デバイスドライバ側は、必要に応じて排他制御などを行う必要がある。
デバイスドライバへの入出力要求は、リクエストIDに対応した下記の要求パケットにより行う。

μT-Kernel 3.0仕様書

317 / 487/*
* デバイス要求パケット: 32ビット用* In : ドライバ処理関数への入力パラメータ(μT - Kernel / SMのデバイス管理で設定)* Out : ドライバ処理関数からの出力パラメータ(ドライバ処理関数で設定)* X:
上記以外のパラメータ*/
typedef struct t_devreq {struct t_devreq * next ;/* In :要求パケットのリンク ( NULL :終端) */void* exinf ;/* X :拡張情報 */ID
devid ;/* In :対象デバイスID */INT
cmd :4;/* In :要求コマンド */BOOLabort :1;/* In :中止要求を行った時 TRUE */W
start ;/* In :開始データ番号 */SZsize ;/* In :要求サイズ */void* buf ;/* In :入出力バッファアドレス */SZ
asize ;/* Out :結果サイズ */ERerror ;/* Out :結果エラー *//* 以下に実装独自の情報が追加される場合がある */} T_DEVREQ ;/** デバイス要求パケット: 64ビット用* In : ドライバ処理関数への入力パラメータ(μT - Kernel / SMのデバイス管理で設定)* Out : ドライバ処理関数からの出力パラメータ(ドライバ処理関数で設定)* X:
上記以外のパラメータ*/
typedef struct t_devreq_d {struct t_devreq_d * next ; /* In :要求パケットのリンク ( NULL :終端) */void* exinf ;/* X :拡張情報 */ID
devid ;/* In :対象デバイスID */INT
cmd :4;/* In :要求コマンド */BOOLabort :1;/* In :中止要求を行った時 TRUE */D
start_d ;/* In :開始データ番号, 64ビット */SZsize ;/* In :要求サイズ */void* buf ;/* In :入出力バッファアドレス */SZ
asize ;/* Out :結果サイズ */ERerror ;/* Out :結果エラー *//* 以下に実装独自の情報が追加される場合がある */} T_DEVREQ_D ;In: はドライバ処理関数への入力パラメータであり、μT-Kernel/SMのデバイス管理で設定され、デバイスドライバ側で変更してはならない。入力パラメータ(In:)以外は、デバイス管理により最初に0クリアされる。その後はデバイス管理は変更しない。
Out: はドライバ処理関数から戻る際の出力パラメータであり、ドライバ処理関数の中で設定する。
next は、要求パケットをリンクするために使用する。デバイス管理内の要求パケットの管理に使用される他、完了待ち関数(waitfn),中止処理関数(abortfn)でも使用する。
exinf は、デバイスドライバ側で任意に使用できる。デバイス管理では内容には関知しない。
devid は、要求対象のデバイスIDが設定される。
cmd は、要求コマンドが設定される。
cmd := (TDC_READ || TDC_WRITE)# define TDC_READ# define TDC_WRITE

1
2/* 読込み要求 *//* 書込み要求 */abort は中止処理を行う場合、中止処理関数(abortfn)を呼び出す直前に TRUE を設定する。abort は中止処理を要求したことを示すフラグであり、処理が中止されたことを示すものではない。また、中止処理関数(abortfn)を呼び出さない場合でも

μT-Kernel 3.0仕様書

318 / 487

abort が TRUE に設定される場合がある。abort が TRUE に設定された要求がデバイスドライバに渡された場合は、中止処理を行う。
start, start_d, size は、tk_rea_dev, tk_rea_dev_du, tk_wri_dev, tk_wri_dev_du で指定された start, start_d, sizeがそのまま設定される。
buf は、tk_rea_dev, tk_rea_dev_du, tk_wri_dev, tk_wri_dev_du で指定された buf がそのまま設定される。仮想記憶をサポートするシステムでは、bufの指す領域が非常駐である場合や、タスク固有空間の場合があるため、取り扱いに注意が必要である。
asize は、tk_wai_dev の asize に返す値をデバイスドライバが設定する。
error は、tk_wai_dev の戻値として返すエラーコードをデバイスドライバが設定する。正常であれば E_OK を設定する。
T_DEVREQとT_DEVREQ_Dとの差異は、start あるいは start_d の部分の名称およびデータタイプのみである。
デバイス要求パケットの種類(T_DEVREQまたはT_DEVREQ_D)は、デバイス登録時のドライバ属性 TDA_DEV_D によって選択される。したがって、1つのドライバに対する要求パケットにT_DEVREQとT_DEVREQ_Dが混在することはない。

μT-Kernel 3.0仕様書

5.2.3.2.1

319 / 487

openfn - オープン関数

C言語インタフェース
ER ercd = openfn(ID devid, UINT omode, void *exinf);
パラメータ
ID
UINT
void*

devid
omode
exinf

Device ID
Open Mode
Extended Information

オープンするデバイスのデバイスID
オープンモード(tk_opn_dev と同じ)
デバイス登録時に指定した拡張情報

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコードその他

デバイスドライバの返すエラーコード

解説
tk_opn_dev が呼び出されたときに、オープン関数 openfn が呼び出される。
openfn では、デバイスの使用開始のための処理を行う。処理内容はデバイスに依存し、何もする必要がなければ何もしなくてもよい。また、オープンされているか否かをデバイスドライバで記憶する必要もなく、オープンされていない(openfn が呼び出されていない)という理由だけで、他の処理関数が呼び出されたときエラーにする必要もない。オープンされていない状態で他の処理関数が呼び出された場合でも、デバイスドライバの動作に問題がなければ要求を処理してしまって構わない。
openfn でデバイスの初期化等を行う場合でも、待ちを伴うような処理は原則として行わない。できる限り速やかに処理を行い openfn から戻らなければならない。例えば、シリアル回線のように通信モードを設定する必要があるようなデバイスでは、tk_wri_dev により通信モードが設定されたときにデバイスの初期化を行えばよい。openfn ではデバイスの初期化を行う必要はない。
同じデバイスが多重オープンされた場合、通常は最初のオープン時のみ呼び出されるが、デバイス登録時にドライバ属性として TDA_OPENREQ が指定された場合は、すべてのオープン時に呼び出される。
多重オープンやオープンモードに関する処理はデバイス管理で行われるため、openfn ではそれらに関する処理は特に必要ない。omode も参考情報として渡されるだけで、omode に関する処理を行う必要はない。
openfn は、tk_opn_dev の発行タスクの準タスク部として実行される。すなわち、tk_opn_dev の発行タスクを要求タスクとする準タスク部のコンテキストで実行される。

μT-Kernel 3.0仕様書

5.2.3.2.2

320 / 487

closefn - クローズ関数

C言語インタフェース
ER ercd = closefn(ID devid, UINT option, void *exinf);
パラメータ
ID
UINT
void*

devid
optionexinf

Device ID
Close Option
Extended Information

クローズするデバイスのデバイスID
クローズオプション(tk_cls_dev と同じ)
デバイス登録時に指定した拡張情報

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコードその他

デバイスドライバの返すエラーコード

解説
tk_cls_dev が呼び出されたときに、クローズ関数 closefn が呼び出される。
closefn では、デバイスの使用終了のための処理を行う。処理内容はデバイスに依存し、何もする必要がなければ何もしなくてもよい。
メディアの取り外しが可能なデバイスの場合、option に TD_EJECT が指定されていたならメディアの排出を行う。
closefn でデバイスの終了処理やメディアの排出を行う場合でも、待ちを伴うような処理は原則として行わない。できる限り速やかに処理を行い closefn から戻らなければならない。メディアの排出に時間がかかる場合、排出の完了を待たずに closefn
から戻っても構わない。
同じデバイスが多重オープンされていた場合、通常は最後のクローズ時のみ呼び出されるが、デバイス登録時にドライバ属
性として TDA_OPENREQ が指定された場合は、すべてのクローズ時に呼び出される。ただし、この場合も最後のクローズにしかoption に TD_EJECT が指定されることはない。
多重オープンやオープンモードに関する処理はデバイス管理で行われるため、closefn ではそれらに関する処理は特に必要ない。
closefn は、tk_cls_dev の発行タスクの準タスク部として実行される。

μT-Kernel 3.0仕様書

5.2.3.2.3

321 / 487

execfn - 処理開始関数

C言語インタフェース/* 処理開始関数(32ビット要求パケット、ミリ秒タイムアウト) */ER ercd = execfn(T_DEVREQ *devreq, TMO tmout, void *exinf);/* 処理開始関数(64ビット要求パケット、ミリ秒タイムアウト) */ER ercd = execfn(T_DEVREQ_D *devreq_d, TMO tmout, void *exinf);/* 処理開始関数(32ビット要求パケット、マイクロ秒タイムアウト) */ER ercd = execfn(T_DEVREQ *devreq, TMO_U tmout_u, void *exinf);/* 処理開始関数(64ビット要求パケット、マイクロ秒タイムアウト) */ER ercd = execfn(T_DEVREQ_D *devreq_d, TMO_U tmout_u, void *exinf);
パラメータ
T_DEVREQ*
T_DEVREQ_D*
TMO
TMO_U

devreqdevreq_d
tmout
tmout_u

Device Request Packet
Device Request Packet
Timeout
Timeout

void*

exinf

Extended Information

要求パケット(32ビット)
要求パケット(64ビット)
要求受付待ちタイムアウト時間(ミリ秒)
要求受付待ちタイムアウト時間(マイクロ秒)
デバイス登録時に指定した拡張情報

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコードその他

デバイスドライバの返すエラーコード

解説
tk_rea_dev または tk_wri_dev が呼び出されたときに、処理開始関数 execfn が呼び出される。
devreq の要求の処理を開始する。処理を開始するのみで、完了を待たずに呼出元へ戻る。処理開始のためにかかる時間は
デバイスドライバに依存する。必ずしも即座に完了するとは限らない。
新たな要求を受け付けられない状態のときは、要求受付待ちとなる。tmout に指定した時間以内に新たな要求を受け付けられなければ、タイムアウトする。tmout には、TMO_POL または TMO_FEVR を指定することもできる。タイムアウトした場合、execfn の
戻値に E_TMOUT を返す。要求パケットの error は変更しない。タイムアウトするのは要求を受け付けるまでで、要求を受け付けた後はタイムアウトしない。
execfn の戻値にエラーを返した場合は、要求が受け付けられなかったものとして、要求パケットは消滅する。
処理を中止する場合、その要求の受け付け前(処理開始前)であれば execfn の戻値に E_ABORT を返す。この場合、要求パケットは消滅する。要求受け付け後(処理開始後)の場合は、E_OK を返す。この場合、要求パケットは waitfn を実行し処理完了が確認されるまで消滅しない。

μT-Kernel 3.0仕様書

322 / 487

中止要求があった場合、execfn からできる限り速やかに戻らなければならない。処理を中止しなくてもすぐに終るのであれば中止しなくてもよい。
execfn は、tk_rea_dev, tk_wri_dev, tk_srea_dev, tk_swri_dev の発行タスクの準タスク部として実行される。
デバイス登録時のドライバ属性として TDA_DEV_D が指定されたデバイスドライバにおいて、tk_rea_dev または tk_wri_dev
が呼び出されたときに、処理開始関数(64ビット要求パケット、ミリ秒タイムアウト) execfn が呼び出される。この場合、パラメータの要求パケットが64ビットのT_DEVREQ_D* devreq_d となった点を除き、関数の仕様は32ビット要求パケット、ミリ秒タ
イムアウトの execfn と同じである。
デバイス登録時のドライバ属性として TDA_TMO_U が指定されたデバイスドライバにおいて、tk_rea_dev または tk_wri_dev
が呼び出されたときに、処理開始関数(32ビット要求パケット、マイクロ秒タイムアウト) execfn が呼び出される。この場合、パラメータのタイムアウト指定がマイクロ秒単位のTMO_U tmout_u となった点を除き、関数の仕様は32ビット要求パケット、ミ
リ秒タイムアウトの execfn と同じである。
デバイス登録時のドライバ属性として TDA_DEV_D および TDA_TMO_U が指定されたデバイスドライバにおいて、tk_rea_dev ま
たは tk_wri_dev が呼び出されたときに、処理開始関数(64ビット要求パケット、マイクロ秒タイムアウト) execfn が呼び出される。この場合、パラメータの要求パケットが64ビットのT_DEVREQ_D* devreq_d、パラメータのタイムアウト指定がマイクロ秒単位のTMO_U tmout_u となった点を除き、関数の仕様は32ビット要求パケット、ミリ秒タイムアウトの execfn と同じである。

μT-Kernel 3.0仕様書

5.2.3.2.4

323 / 487

waitfn - 完了待ち関数

C言語インタフェース/* 完了待ち関数(32ビット要求パケット、ミリ秒タイムアウト) */INT creqno = waitfn(T_DEVREQ *devreq, INT nreq, TMO tmout, void *exinf);/* 完了待ち関数(64ビット要求パケット、ミリ秒タイムアウト) */INT creqno = waitfn(T_DEVREQ_D *devreq_d, INT nreq, TMO tmout, void *exinf);/* 完了待ち関数(32ビット要求パケット、マイクロ秒タイムアウト) */INT creqno = waitfn(T_DEVREQ *devreq, INT nreq, TMO_U tmout_u, void *exinf);/* 完了待ち関数(64ビット要求パケット、マイクロ秒タイムアウト) */INT creqno = waitfn(T_DEVREQ_D *devreq_d, INT nreq, TMO_U tmout_u, void *exinf);
パラメータ
T_DEVREQ*
T_DEVREQ_D*
INT
TMO
TMO_U
void*

devreqdevreq_d
nreq
tmout
tmout_u
exinf

Device Request Packet
Device Request Packet
Number of Requests
Timeout
Timeout
Extended Information

要求パケットのリスト(32ビット)
要求パケットのリスト(64ビット)
要求パケットの数
タイムアウト時間(ミリ秒)
タイムアウト時間(マイクロ秒)
デバイス登録時に指定した拡張情報

creqnoCompleted Request Packet
NumberError Code

完了した要求パケットの番号

リターンパラメータ
INTまたはエラーコードエラーコードその他

デバイスドライバの返すエラーコード

解説
tk_wai_dev が呼び出されたときに、完了待ち関数 waitfn が呼び出される。
devreq は devreq->next で接続された要求パケットのリストで、devreq から nreq 個分の要求パケットについて、その内のいずれかが完了するのを待つ。リストの最後の next は必ずしも NULL になっているとは限らないため、必ず nreq の指定に従う。
戻値に完了した要求パケットの番号(devreq から何番目か)を返す。最初が0番目で最後が nreq-1番目となる。なお、完了とは、正常終了／異常(エラー)終了／中止のいずれかである。
tmout に完了待ちのタイムアウト時間を指定する。TMO_POL または TMO_FEVR を指定することもできる。タイムアウトした場合は、要求された処理は継続中である。タイムアウトの場合、waitfn の戻値に E_TMOUT を返す。要求パケットの error は変更しない。なお、要求された処理を継続中で waitfn から戻るときは、waitfn の戻値に必ずエラーを返す。戻値にエラーを返したにもかかわらず処理が完了していてはいけないし、処理継続中であればエラー以外を返してもいけない。waitfn の戻値に

μT-Kernel 3.0仕様書

324 / 487

エラーが返されている限り、その要求は処理中として要求パケットは消滅しない。waitfn の戻値に処理を完了した要求パケッ
トの番号が返されたとき、その要求の処理は完了したものとして要求パケットは消滅する。
入出力エラーなどデバイスに関するエラーを、要求パケットの error に格納する。waitfn の戻値には、完了待ちが正しくできなかった場合のエラーを返す。waitfn の戻値が tk_wai_dev の戻値となり、要求パケットの error が ioer に戻される。
waitfn による完了待ちの間に中止処理関数 abortfn が実行された時の中止の処理は、単一要求の完了待ちだった場合(waitfn の nreq＝1)と、複数要求の完了待ちだった場合(waitfn の nreq > 1)で異なっている。単一要求の完了待ちだった
場合は、処理中の要求を中止する。一方、複数要求の完了待ちだった場合は、特別な扱いとして、waitfn による待ちの解除のみを行い、要求に対する処理自体は中止しない。すなわち、中止処理関数 abortfn が実行されても、要求パケットの abort は
FALSE のままであり、要求に対する処理は継続する。待ち解除となった waitfn からは、戻値に E_ABORT を返す。
完了待ち要求の中には、中止要求が要求パケットの abort にセットされている場合がある。このような場合、単一要求の完了待ちではその要求の中止処理を行わなければならない。複数要求の完了待ちでも中止処理を行うのが望ましいが、abort フ
ラグを無視しても構わない。
なお、中止処理では waitfn からできる限り速やかに戻ることが重要であり、処理を中止しなくてもすぐに処理が終るのであれ
ば中止しなくてもよい。
処理が中止された場合は、要求パケットの error に E_ABORT を返すことを原則とするが、そのデバイスの特性に合わせて
E_ABORT 以外のエラーを返してもよい。また、中止される直前までの処理を有効として E_OK としてもよい。なお、中止要求があっても正常に最後まで処理したのなら E_OK を返す。
waitfn は、tk_wai_dev, tk_srea_dev, tk_swri_dev の発行タスクの準タスク部として実行される。
デバイス登録時のドライバ属性として TDA_DEV_D が指定されたデバイスドライバにおいて、tk_wai_dev が呼び出されたときに、完了待ち関数(64ビット要求パケット、ミリ秒タイムアウト) waitfn が呼び出される。この場合、パラメータの要求パケットが64ビットのT_DEVREQ_D* devreq_d となった点を除き、関数の仕様は32ビット要求パケット、ミリ秒タイムアウトの waitfnと同じである。
デバイス登録時のドライバ属性として TDA_TMO_U が指定されたデバイスドライバにおいて、tk_wai_dev が呼び出されたときに、完了待ち関数(32ビット要求パケット、マイクロ秒タイムアウト) waitfn が呼び出される。この場合、パラメータのタイムア
ウト指定がマイクロ秒単位のTMO_U tmout_u となった点を除き、関数の仕様は32ビット要求パケット、ミリ秒タイムアウトのwaitfn と同じである。
デバイス登録時のドライバ属性として TDA_DEV_D および TDA_TMO_U が指定されたデバイスドライバにおいて、tk_wai_dev が呼び出されたときに、完了待ち関数(64ビット要求パケット、マイクロ秒タイムアウト) waitfn が呼び出される。この場合、パラメータの要求パケットが64ビットのT_DEVREQ_D* devreq_d、パラメータのタイムアウト指定がマイクロ秒単位のTMO_U
tmout_u となった点を除き、関数の仕様は32ビット要求パケット、ミリ秒タイムアウトの waitfn と同じである。

μT-Kernel 3.0仕様書

5.2.3.2.5

325 / 487

abortfn - 中止処理関数

C言語インタフェース/* 中止処理関数(32ビット要求パケット) */ER ercd = abortfn(ID tskid, T_DEVREQ *devreq, INT nreq, void *exinf);/* 中止処理関数(64ビット要求パケット) */ER ercd = abortfn(ID tskid, T_DEVREQ_D *devreq_d, INT nreq, void *exinf);
パラメータ
ID

tskid

Task ID

T_DEVREQ*
T_DEVREQ_D*
INT
void*

devreqdevreq_d
nreq
exinf

Device Request Packet
Device Request Packet
Number of Requests
Extended Information

execfn, waitfn を実行しているタスクのタ
スクID
要求パケットのリスト(32ビット)
要求パケットのリスト(64ビット)
要求パケットの数
デバイス登録時に指定した拡張情報

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコードその他

デバイスドライバの返すエラーコード

解説
現在実行中の処理開始関数 execfn や完了待ち関数 waitfn から速やかに戻らせたいときに、中止処理関数 abortfn が呼び出される。通常は、処理中の要求を中止して戻らせる。ただし、中止しなくてもすぐに処理が終るのであれば、必ずしも中止しなくてもよい。重要なのは、できる限り速やかに execfn, waitfn から戻ることである。
abortfn は、次のような場合に呼び出される。
• タスク例外の発生によるブレーク関数の実行時に、タスク例外の発生したタスクによる処理中の要求があった場合、そのタ
スクによる処理中の要求を中止する。
• tk_cls_dev によるデバイスクローズ時に、クローズするデバイスディスクリプタによる処理中の要求があった場合、そのデバ
イスディスクリプタによる処理中の要求を中止する。
tskid は、devreq で指定した要求を実行中のタスクである。つまり、execfn, waitfn を実行しているタスクである。devreq,
nreq は、execfn, waitfn の引数として指定したものと同じである。ただし、execfn の場合は常に nreq＝1である。
abortfn は、execfn, waitfn を実行しているタスクとは別のタスクから呼び出される。両者は並行して実行されるため、必要に応じて排他制御等を行う必要がある。また、execfn, waitfn の呼出直前や execfn, waitfn から戻る途中に abortfn が呼び出される可能性もある。このような場合においても正しく動作するように配慮する必要がある。abortfn を呼び出す前に、中止
処理対象の要求パケットの abort フラグに TRUE が設定されるので、execfn, waitfn はこれにより中止要求の有無を知ることもできる。また、abortfn では、任意のオブジェクトに対する tk_dis_wai を使用することができる。
複数要求待ち(nreq > 1)の waitfn 実行中の場合は、特別な扱いとなり他の場合とは次の点で異なる。
• 要求の処理を中止することはせず、完了待ちのみ中止(待ちを解除)する。

μT-Kernel 3.0仕様書

326 / 487

• 要求パケットの abort フラグはセットされない(abort＝FALSE のまま)。
なお、execfn, waitfn の実行中でないときに要求を中止させる場合には、abortfn を呼び出すことなく、要求パケットの abort
フラグがセットされる。abort フラグがセットされた状態で execfn が呼び出されたときは、要求を受け付けない。waitfn が呼び出されたときは、abortfn が呼び出された場合と同様の中止処理を行う。
execfn により処理を開始した要求が、waitfn による完了待ちでない状態で中止された場合は、後で waitfn が呼び出されたときに中止されて処理が完了したことを知らせる。処理が中止されても、waitfn により完了が確認されるまでは要求自体は消滅しない。
abortfn は中止処理を開始するのみで、中止が完了するまで待たずに速やかに戻る。
タスク例外の際に実行される abortfn は、タスク例外を発生させた tk_ras_tex の発行タスクの準タスク部として実行される。
また、デバイスクローズ時に実行される abortfn は、tk_cls_dev の発行タスクの準タスク部として実行される。
デバイス登録時のドライバ属性として TDA_DEV_D が指定されたデバイスドライバにおいて、現在実行中の処理開始関数
execfn や完了待ち関数 waitfn から速やかに戻らせたいときに、中止処理関数(64ビット要求パケット) abortfn が呼び出される。この場合、パラメータの要求パケットが64ビットのT_DEVREQ_D* devreq_d となった点を除き、関数の仕様は32ビット
要求パケットの abortfn と同じである。

μT-Kernel 3.0仕様書

5.2.3.2.6

327 / 487

eventfn - イベント関数

C言語インタフェース
INT retcode = eventfn(INT evttyp, void *evtinf, void *exinf);
パラメータ
INT
void*
void*

evttypevtinfexinf

Event TypeEvent Information
Extended Information

ドライバ要求イベントタイプ
イベントタイプ別の情報
デバイス登録時に指定した拡張情報

Return CodeError Code

イベントタイプ別に定義された戻値
エラーコードリターンパラメータ
INT

retcodeまたは

エラーコードその他

デバイスドライバの返すエラーコード

解説
アプリケーションインタフェースによる通常のデバイス入出力処理とは別の要因によって、デバイスやシステムの状態変化が発生し、それに対してデバイスドライバ側で何らかの処理を要する場合に、ドライバ要求イベントが発生し、イベント関数
eventfn が呼び出される。
ドライバ要求イベントは、電源管理のためのサスペンド／リジューム時(tk_sus_dev 参照)や、USBのような活線挿抜可能な機器の接続時に発生する。
たとえば、tk_sus_dev によってシステムがサスペンドする時には、μT-Kernelの内部で(tk_sus_dev の処理の中で)、サスペ
ンドのドライバ要求イベント(TDV_SUSPEND)を発生し、evttyp＝TDV_SUSPEND として各デバイスのイベント関数を呼び出す。各デバイスのイベント関数の中では、この呼出に応じて、サスペンド時に必要な状態保存などの処理を行う。
ドライバ要求イベントタイプには下記のものがある。
# define# define# define# define

TDV_SUSPEND
TDV_RESUMETDV_CARDEVT
TDV_USBEVT

( -1)
( -2)
1
2

/* サスペンド *//* リジューム *//* reserved *//* USBイベント */上記の値が負のドライバ要求イベントは、サスペンド／リジューム時の処理など、μT-Kernel/SMのデバイス管理内部からの呼出によるものである。
一方、上記の値が正のドライバ要求イベント(TDV_USBEVT)は、tk_evt_dev の呼出によって発生するものであり、μT-Kernelの動作とは直接関係しない参考仕様である。これらのドライバ要求イベントは、USBなどのバスドライバを実装するために、必要に応じて利用する。
イベント関数で行う処理は、イベントタイプごとに定義される。サスペンド／リジュームについては「項5.2.3.4. 「各デバイスのサスペンド／リジューム処理」」を参照。
tk_evt_dev による呼出の場合、eventfn の戻値はそのまま tk_evt_dev の戻値となる。
イベント関数への要求は、他の要求の処理中であっても受け付け、できる限り速やかに処理しなければならない。
eventfn は、イベント発生の原因となった tk_evt_dev や tk_sus_dev の発行タスクの準タスク部として実行される。

μT-Kernel 3.0仕様書

328 / 487

補足事項
USBイベントで想定している動作は以下のとおりである。
ただし、以下の説明はUSBの機器を扱うデバイスドライバの実装例の説明であり、μT-Kernelの仕様の範囲には含まれない。
USB機器の接続時には、そのUSB機器に対して、実際の入出力処理を行うクラスドライバを動的に対応付ける必要がある。
たとえば、USBメモリなどのストレージを接続した場合には、マスストレージクラス用のデバイスドライバがその機器の入出力処理を行うが、USBカメラを接続した場合には、ビデオクラス用のデバイスドライバがその機器の入出力処理を行う。どのデバ
イスドライバを使うべきかは、USB機器が接続されるまで分からない。
この時、USB機器とクラスドライバとの対応付けの処理を行うための手段として、USB接続のドライバ要求イベントと、各デバ
イスドライバのイベント関数を利用する。具体的には、USBポートを監視していたUSBバスドライバ(USBマネージャ)が、新しいUSB機器の接続を検出した場合に、クラスドライバの候補となる各デバイスドライバに対して、USB接続のドライバ要求イベント(TDV_USBEVT)を送り、各デバイスのイベント関数を呼び出す。
各デバイスのイベント関数では、この TDV_USBEVT に応答する形で、新しく接続されたUSB機器への対応の可否を返す。USB
バスドライバでは、その戻値を見て、実際のクラスドライバとの対応付けを決定する。

μT-Kernel 3.0仕様書

5.2.3.3

329 / 487

デバイス事象通知

デバイスドライバは、各デバイスで発生した事象を、デバイス事象通知のメッセージとして特定のメッセージバッファ(事象通知用メッセージバッファ)へ送信する。事象通知用メッセージバッファのIDは、各デバイスに対する TDN_EVENT の属性データとして参照あるいは設定される。
デバイス登録の直後には、システムデフォルトの事象通知用メッセージバッファを使用する。デバイスドライバの起動時には、tk_def_dev によってデバイスの登録を行うが、このAPIのリターンパラメータとしてシステムデフォルトの事象通知用メッ
セージバッファのID値が返されるので、デバイスドライバではその値を保持し、属性データ TDN_EVENT の初期値とする。
なお、システムデフォルトの事象通知用メッセージバッファは、システム起動時に生成され、そのサイズとメッセージ最大長は、システム構成情報の TDEvtMbfSz により定義される。
デバイス事象通知で使用するメッセージの形式は以下のようになる。事象通知のメッセージの内容やサイズは、事象タイプごとに異なる。
◇デバイス事象通知の基本形式
typedef struct t_devevt {TDEvtTypevttyp ;/* 事象タイプ *//* 以下に事象タイプ別の情報が付加される */} T_DEVEVT ;◇デバイスID付きのデバイス事象通知の形式
typedef struct t_devevt_id {TDEvtTypevttyp ;/* 事象タイプ */IDdevid ;/* デバイスID *//* 以下に事象タイプ別の情報が付加される */} T_DEVEVT_ID ;◇拡張情報付きのデバイス事象通知の形式
typedef struct t_devevt_ex {TDEvtTypevttyp ;/* 事象タイプ */IDdevid ;/* デバイスID */UB
exdat [16];/* 拡張情報 *//* 以下に事象タイプ別の情報が付加される */} T_DEVEVT_EX ;デバイス事象通知の事象タイプは、以下のように大分類される。
a. 基本事象通知(事象タイプ 0x0001〜0x002F)
デバイスからの基本的な事象の通知
b. システム事象通知(事象タイプ 0x0030〜0x007F)
電源制御などシステム全体に関係する事象の通知
c. 拡張情報付き事象通知(事象タイプ 0x0080〜0x00FF)
拡張情報を持つデバイスからの事象の通知
d. ユーザ定義事象通知(事象タイプ 0x0100〜0xFFFF)
ユーザが内容を任意に定義可能な事象の通知
事象タイプのうち、代表的なものは以下の通りである。

μT-Kernel 3.0仕様書

typedef enum tdevttyp {TDE_unknown= 0,
TDE_MOUNT= 0 x01 ,TDE_EJECT= 0 x02 ,TDE_POWEROFF= 0 x31 ,TDE_POWERLOW= 0 x32 ,TDE_POWERFAIL= 0 x33 ,TDE_POWERSUS= 0 x34} TDEvtTyp ;330 / 487/* 未定義 *//* メディア挿入 *//* メディア排出 *//* 電源スイッチオフ *//* 電源残量警告 *//* 電源異常 *//* 自動サスペンド */事象通知用メッセージバッファが一杯で事象通知を送信できない場合は、その事象が通知されないことで事象通知の受信側の動作に悪影響が出ないようにしなければならない。メッセージバッファが空くまで待ってから事象通知を行ってもよいが、その場合も原則として事象通知以外のデバイスドライバの処理が滞ってはならない。なお、事象通知の受信側は、できる限りメッ
セージバッファが溢れることがないように処理しなければならない。

μT-Kernel 3.0仕様書

5.2.3.4

331 / 487

各デバイスのサスペンド／リジューム処理

イベント関数(eventfn)へのサスペンド／リジュームイベント(TDV_SUSPEND/TDV_RESUME)の発行により、各デバイスドライバはデバイスのサスペンド／リジューム処理を行う。サスペンド／リジュームイベントは、物理デバイスに対してのみ発行される。
5.2.3.4.1

デバイスのサスペンド処理

サスペンド処理を開始するためのイベントは次の通りである。
evttyp = TDV_SUSPEND
evtinf = NULL (なし)
サスペンドイベント(TDV_SUSPEND)の発行により、次のような手順でサスペンド処理を行う。
1. 現在処理中の要求があれば、完了するまで待つか、中断または中止する。どの方法を選択するかはデバイスドライバの実装に依存する。ただし、できるだけ速やかにサスペンドする必要があるため、完了までに時間がかかる場合は中断または中止としなければならない。
サスペンドイベントは物理デバイスに対してのみ発行されるが、そのデバイスに含まれるすべての論理デバイスに対しても、同様に処理する。
中断：処理を一時的に中断し、リジューム後に続きを行う。
中止：中止処理関数(abortfn)による中止と同様に、処理を中止する。リジューム後も再開されない。
2. リジュームイベント以外の新たな要求を受け付けないようにする。
3. デバイスの電源を切るなどのサスペンド処理を行う。
中止はアプリケーションへの影響が大きいと考えられるため極力避けたい。シリアル回線からの長期の入力待ちなどで、かつ中断とするのが難しい場合以外は中止としない。通常は、終了まで待つか、可能であれば中断とする。
サスペンド期間中にデバイスドライバへ来た要求は、リジュームまで待たせてリジューム後に受け付け処理する。ただし、デバイスへのアクセスを伴わない処理など、サスペンド中でも可能な処理は受け付けてもよい。
5.2.3.4.2

デバイスのリジューム処理

リジューム処理を開始するためのイベントは次の通りである。
evttyp = TDV_RESUME
evtinf = NULL (なし)
リジュームイベント(TDV_RESUME)の発行により、次のような手順でリジューム処理を行う。
1. デバイスの電源を入れデバイスの状態を復帰させるなどのリジューム処理を行う。
2. 中断していた処理があれば再開する。
3. 要求受け付けを再開する。

μT-Kernel 3.0仕様書

332 / 487

5.3 割込み管理機能
μT-Kernel/SMの割込み管理機能は、外部割込みの禁止や許可、割込み禁止状態の取得、割込みコントローラの制御などを行うための機能である。
割込み関係はハードウェア依存度が高く、システムごとに異なっているため共通化することが難しい。下記を標準仕様として定めるが、システムによってはこの通りに実装することが難しい場合がある。できる限り標準仕様に合わせた実装を求めるが、実装不可能なものは実装しなくてもよい。標準仕様とは別の機能を追加することも許されるが、その場合は関数名などは標準仕様と異なるものでなければならない。ただし、DI, EI, isDI は標準仕様にしたがって、必ず実装しなければならない。
割込み管理機能は、ライブラリ関数またはC言語のマクロで提供され、これらはタスク独立部およびディスパッチ禁止・割込み禁止の状態から呼び出すことができる。

μT-Kernel 3.0仕様書

333 / 487

5.3.1 CPU割込み制御
CPU内の外部割込みフラグや割込みマスクレベルを設定する。一般的には、割込みコントローラの制御は行わない。
DI ではすべての外部割込みを禁止し、EI で許可する。DI を発行してから、EI を発行するまで、外部割込み禁止の状態となる。この状態の間は、他の処理に割り込まれることはなく、割込みによるディスパッチも発生しないので、不可分に処理を実行することができる。
CPU割込み制御のAPIおよび外部割込み禁止の状態には以下の制約がある。
• CPU割込み制御のAPIは、CPU内の外部割込みフラグや割込みマスクレベルを直接設定するC言語のマクロとして実装される。このため、ハードウェアを制御できる保護レベルでなければ実行できない。具体的な保護レベルは実装依存である。
• CPU割込み制御のAPIは、CPU内の外部割込みフラグや割込みマスクレベルを設定するのみである。このため、一部の実装を除き、一般にはこれらのAPIを実行しても遅延ディスパッチは起こらない。
• 外部割込み禁止の状態では、使用できるAPIが制限される。待ち状態に入るAPIを実行することはできず、E_CTXのエラーとなるべきであるが、この場合のエラーチェックは実装依存である。μT-Kernel/SMの割込み管理機能およびI/Oポートア
クセスサポート機能のAPIは、外部割込み禁止の状態でも発行可能である。これら以外のAPIが外部割込み禁止の状態で使用可能かどうかは、実装依存である。
• 外部割込み禁止の状態では、システムタイマの割込みも禁止される。このため、タイムアウトやタイムイベントハンドラの処理なども実行されない。
補足事項
CPU割込み制御のAPIは、デバイスドライバなどにおいて、ハードウェアやそれに近い部分の制御を行う際に、外部割込み
を一時的に禁止して不可分な処理を実行するために使用することを想定している。しかし、外部割込みを禁止するとシステ
ムの応答性が低下し、リアルタイム性能にも影響を与えるため、できるだけ速やかに処理を行い、外部割込み禁止の状態を抜ける必要がある。
DIに よ る 外 部 割 込 み 禁 止 の 状 態 は、 タ ス ク 独 立 部 に 近 い 状 態 で あ り、 こ の 間 に デ ィ ス パ ッ チ を 起 こ す よ う な
API(例:tk_wup_tsk)を発行した場合にも、ディスパッチは起こらない。また、その後、外部割込み許可の状態に戻すた
めにEIを発行しても、一般にはEIにおける遅延ディスパッチが起こらない(一部の実装を除く)。その結果として、EIの実行後も、高優先度の実行可能状態のタスクがあるにも関わらず、低優先度のタスクが実行状態を続けるという不正な状態になることがある。
DIとEIの 間 に デ ィ ス パ ッ チ を 起 こ す よ う な API を 発 行 す る 場 合 に は、 上 記 の よ う な 不 正 な 状 態 に な る の を 防 ぐ ために、外部割込み禁止の区間をtk_dis_dspとtk_ena_dspで挟むことを推奨する。すなわち、tk_dis_dsp→DI→ディ
スパッチを起こすAPI→EI→tk_ena_dspの順にAPIを発行する。この場合、DIとEIの間は割込みもディスパッチも禁止、tk_dis_dspとtk_ena_dspの間はディスパッチのみ禁止となるが、最後のtk_ena_dspで遅延ディスパッチが起こるた
め、その時点で上記のような不正な状態は解消する。このようにしてAPIを発行することにより、実装に依存しない動作が可能である。

μT-Kernel 3.0仕様書

5.3.1.1

334 / 487

DI - 外部割込み禁止

C言語インタフェース#include <tk/tkernel.h>DI (UINT intsts);
パラメータ
UINT

intstsInterrupt Status

CPUの外部割込みフラグを保存する変数

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

解説
CPU内の外部割込みフラグを制御し、すべての外部割込みを禁止する。また、割込みを禁止する前のフラグの状態を intstsに保存する。
intsts はポインタではなく、変数を直接記載する。一般に、本APIはC言語のマクロで実装される。
外部割込み禁止の状態で発行可能なAPIについては、項5.3.1. 「CPU割込み制御」 の冒頭の説明を参照のこと。

μT-Kernel 3.0仕様書

5.3.1.2

335 / 487

EI - 外部割込み許可

C言語インタフェース#include <tk/tkernel.h>
EI (UINT intsts);
パラメータ
UINT

intstsInterrupt Status

CPUの外部割込みフラグを保存した変数

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

解説
CPU内の外部割込みフラグを制御し、intsts の状態に戻す。すなわち、これ以前に実行された DI(intsts) で割込みを禁止
する前の状態に戻す。
DI(intsts) の実行前の状態が外部割込み許可であった場合には、その後の EI(intsts) の実行により、再度外部割込みを許可した状態となる。一方、DI(intsts) で割込みを禁止する以前から割込み禁止状態であった場合には、EI(intsts) を実行しても割込みは許可されない。ただし、intsts として0を指定した場合は、CPU内の外部割込みフラグが割込み許可状態となる。
intsts は、DI で保存した値または0のいずれかでなければならない。それ以外の値を指定した場合の動作は保証されない。
実行効率を重視しオーバーヘッドを最小限とするため、一般に本APIはアセンブラやマクロで実装される。また、CPU内の外部
割込みフラグを制御するだけであり、それ以外の処理は行わず、エラー情報も返さない。したがって、一部の実装を除き、一般には本APIを実行しても遅延ディスパッチは起こらない。

μT-Kernel 3.0仕様書

5.3.1.3

336 / 487

isDI - 外部割込み禁止状態の取得

C言語インタフェース#include <tk/tkernel.h>
BOOL disint = isDI(UINT intsts);
パラメータ
UINT

intstsInterrupt Status

CPUの外部割込みフラグを保存した変数

Interrupts Disabled Status

外部割込み禁止状態

リターンパラメータ
BOOLdisint

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部
○

解説
以前に実行された DI によって intsts に保存されていたCPU内の外部割込みフラグの状態を調べ、割込み禁止と判断される状態であった場合にはTRUE(0以外の値)を、割込み許可と判断される状態であった場合にはFALSEを返す。
intsts は、DI で保存した値でなければならない。それ以外の値を指定した場合の動作は保証されない。
実行効率を重視しオーバーヘッドを最小限とするため、一般に本APIはアセンブラやマクロで実装される。
isDIの使用例
void foo (){UINTintsts ;DI ( intsts );if ( isDI ( intsts ) ) {/* 上記の DI () が呼び出された時点で既に割込み禁止であった */} else {/* 上記の DI () が呼び出された時点では割込み許可であった */}EI ( intsts );}μT-Kernel 3.0仕様書

5.3.1.4

337 / 487

SetCpuIntLevel - CPU内割込みマスクレベルの設定

C言語インタフェース#include <tk/tkernel.h>void SetCpuIntLevel(INT level);
パラメータ
INT

level

Interrupt Mask Level

割込みマスクレベル

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_CPUINTLEVEL

CPU内割込みマスクレベルのサポート

解説
CPU内の割込みマスクレベルを設定し、levelよりも低い割込み優先度を持つ割込みを禁止する。逆に、levelと同一またはより高い割込み優先度を持つ割込みは許可される。
level に INTLEVEL_DI を指定した場合は、すべての優先度の外部割込みを禁止した状態となるように割込みコントローラ内の割込みマスクレベルを設定する。これは一般に、DIを実行した後の状態と同じである。
また、level に INTLEVEL_EI を指定した場合は、すべての優先度の外部割込みを許可した状態となるように割込みコントロー
ラ内の割込みマスクレベルを設定する。これは一般に、EI(0)を実行した後の状態と同じである。
本APIの実行によって割込みを禁止している間は、割込みハンドラ実行中と同じように、割込み禁止が解除されるまでディスパッチを遅延する場合がある。
指定可能なlevelの範囲、INTLEVEL_DIの具体値は実装定義である。また、割込み優先度の高低と割込みレベルの数値の大小との関係も実装定義である。一般に、これらの仕様はCPUのアーキテクチャに依存して決められる。
実行効率を重視しオーバーヘッドを最小限とするため、一般に本APIはアセンブラやマクロで実装される。また、CPU内の外部
割込みフラグを制御するだけであり、それ以外の処理は行わず、エラー情報も返さない。したがって、一部の実装を除き、一般には本APIを実行しても遅延ディスパッチは起こらない。

μT-Kernel 3.0仕様書

338 / 487

補足事項
「割込みマスクレベル」とは、割込みを許可(マスク)する外部割込み優先度(割込みレベル)の下限を示す値である。割込みマス
クレベルと同一またはより高い割込み優先度を持つ外部割込みが許可される。
本APIはCPU内の割込みマスクレベルを設定する機能であり、割込みコントローラ内の割込みマスクレベルを設定する
SetCtrlIntLevel とほぼ同一の機能である。ただし、前者は DI, EI で設定した割込み許可・禁止状態に影響を与えるのに対して、後者はそれらの状態とは無関係である点が異なる。
本APIでは、それ以前の状態とは無関係に、単純にCPU内の割込みマスクレベルの設定を行うだけである。本APIの実行により、禁止される割込みの範囲が増える場合と、減る場合の両方があるので注意されたい。

μT-Kernel 3.0仕様書

5.3.1.5

339 / 487

GetCpuIntLevel - CPU内割込みマスクレベルの取得

C言語インタフェース#include <tk/tkernel.h>
INT level = GetCpuIntLevel(void);
パラメータなし
リターンパラメータ
INT

level

Interrupt Mask Level

割込みマスクレベル

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_CPUINTLEVEL

CPU内割込みマスクレベルのサポート

解説
CPU内に設定されている割込みマスクレベルの現在値を取得し、リターンパラメータ level として返す。
level で指定可能な値の範囲は実装定義である。
補足事項
SetCpuIntLevel の解説および補足事項を参照のこと

μT-Kernel 3.0仕様書

5.3.2 割込みコントローラ制御
割込みコントローラを制御する。一般的には、CPUの割込みフラグに対しては何もしない。

340 / 487

μT-Kernel 3.0仕様書

5.3.2.1

341 / 487

EnableInt - 割込み許可

C言語インタフェース#include <tk/tkernel.h>void EnableInt(UINT intno);
void EnableInt(UINT intno, INT level);
パラメータ
UINT
INT

intno
level

Interrupt Number
Interrupt Priority Level

割込み番号
割込み優先度レベル

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_INTCTRL

割込みコントローラ制御機能のサポート

また、以下のサービスプロファイルが本APIに関係する。
TK_HAS_ENAINTLEVEL

第2引数に割込み優先度レベル(level)が指定可能

解説
割込み番号 intno の割込みを許可する。割込み優先度レベルを指定可能なシステムでは、level により割込み優先度レベルを指定する。
intno に指定可能な割込み番号は、tk_def_int で指定可能なもののうち、割り込みコントローラによって管理される割込みの番号に限定される。不正な intno を指定した場合の動作は保証されない。
level あり、または level なしの、いずれか一方を提供する。
補足事項
本APIでは、割込み関連機能の他のAPIと同様に、エラーのチェックは行わない。

μT-Kernel 3.0仕様書

5.3.2.2

342 / 487

DisableInt - 割込み禁止

C言語インタフェース#include <tk/tkernel.h>void DisableInt(UINT intno);
パラメータ
UINT

intno

Interrupt Number

割込み番号

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_INTCTRL

割込みコントローラ制御機能のサポート

解説
割込み番号 intno の割込みを禁止する。一般的には、割込み禁止中の割込みはペンディングされ、EnableInt により許可した時に割込みが発生する。割込み禁止中に発生した割込みを無効にしたい場合は、ClearInt を行う必要がある。
intno に指定可能な割込み番号は、tk_def_int で指定可能なもののうち、割り込みコントローラによって管理される割込みの番号に限定される。不正な intno を指定した場合の動作は保証されない。
補足事項
本APIでは、割込み関連機能の他のAPIと同様に、エラーのチェックは行わない。

μT-Kernel 3.0仕様書

5.3.2.3

343 / 487

ClearInt - 割込み発生のクリア

C言語インタフェース#include <tk/tkernel.h>void ClearInt(UINT intno);
パラメータ
UINT

intno

Interrupt Number

割込み番号

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_INTCTRL

割込みコントローラ制御機能のサポート

解説
intno の割込みが発生していればクリアする。
intno に指定可能な割込み番号は、tk_def_int で指定可能なもののうち、割り込みコントローラによって管理される割込みの番号に限定される。不正な intno を指定した場合の動作は保証されない。
補足事項
本APIでは、実行効率を重視しオーバーヘッドを最小限とするために、エラーのチェックは行わない。

μT-Kernel 3.0仕様書

5.3.2.4

344 / 487

EndOfInt - 割込みコントローラにEOI発行

C言語インタフェース#include <tk/tkernel.h>void EndOfInt(UINT intno);
パラメータ
UINT

intno

Interrupt Number

割込み番号

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_INTCTRL

割込みコントローラ制御機能のサポート

解説
割込みコントローラにEOI(End Of Interrupt)を発行する。intno は EOI 発行対象の割込みでなければならない。一般的には、割込みハンドラの最後で実行する必要がある。
intno に指定可能な割込み番号は、tk_def_int で指定可能なもののうち、割り込みコントローラによって管理される割込みの番号に限定される。不正な intno を指定した場合の動作は保証されない。
補足事項
本APIでは、実行効率を重視しオーバーヘッドを最小限とするために、エラーのチェックは行わない。

μT-Kernel 3.0仕様書

5.3.2.5

345 / 487

CheckInt - 割込み発生の検査

C言語インタフェース#include <tk/tkernel.h>
BOOL rasint = CheckInt(UINT intno);
パラメータ
UINT

intno

Interrupt Number

割込み番号Interrupts Raised Status

外部割込み発生状態

リターンパラメータ
BOOL

rasint

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_INTCTRL

割込みコントローラ制御機能のサポート

解説
割込み番号 intno の割込みが発生しているか調べる。intno の割込みが発生していれば TRUE(0以外の値)、発生していなけ
れば FALSE を返す。

μT-Kernel 3.0仕様書

5.3.2.6

346 / 487

SetIntMode - 割込みモード設定

C言語インタフェース#include <tk/tkernel.h>void SetIntMode(UINT intno, UINT mode);
パラメータ
UINT
UINT

intno
mode

Interrupt Number
Mode

割込み番号
割込みモードリターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_INTMODE

割込みモード設定機能のサポート

解説
割込み番号 intno で指定した割込みを mode で指定したモードに設定する。
intno に指定可能な割込み番号は、tk_def_int で指定可能なもののうち、割り込みコントローラによって管理される割込みの番号に限定される。不正な intno を指定した場合の動作は保証されない。
設定可能な機能や mode の指定方法は実装依存である。以下は、設定可能な機能の一例である。
mode := (IM_LEVEL || IM_EDGE) | (IM_HI || IM_LOW)# define# define# define# define

IM_LEVEL
IM_EDGE
IM_HI
IM_LOW

0 x0002
0 x0000
0 x0000
0 x0001/* レベルトリガ *//* エッジトリガ *//* Hレベル/立ち上がりエッジで割込み *//* Lレベル/立ち下がりエッジで割込み */不正な mode を指定した場合の動作は保証されない。
補足事項
本APIでは、割込み関連機能の他のAPIと同様に、エラーのチェックは行わない。

μT-Kernel 3.0仕様書

5.3.2.7

347 / 487

SetCtrlIntLevel - 割込みコントローラ内割込みマスクレベルの設定

C言語インタフェース#include <tk/tkernel.h>void SetCtrlIntLevel(INT level);
パラメータ
INT

level

Interrupt Mask Level

割込みマスクレベル

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_CTRLINTLEVEL

割込みコントローラ内割込みマスクレベルのサポート

解説
割込みコントローラ内の割込みマスクレベルを設定し、levelよりも低い割込み優先度を持つ割込みを禁止する。逆に、levelと同一またはより高い割込み優先度を持つ割込みは許可される。
level に INTLEVEL_DI を指定した場合は、すべての優先度の外部割込みを禁止した状態となるように割込みコントローラ内の割込みマスクレベルを設定する。
また、level に INTLEVEL_EI を指定した場合は、すべての優先度の外部割込みを許可した状態となるように割込みコントロー
ラ内の割込みマスクレベルを設定する。
本APIの実行によって割込みを禁止している間は、割込みハンドラ実行中と同じように、割込み禁止が解除されるまでディスパッチを遅延する場合がある。
指定可能なlevelの範囲、INTLEVEL_DIの具体値は実装定義である。また、割込み優先度の高低と割込みレベルの数値の大小との関係も実装定義である。一般に、これらの仕様はCPUのアーキテクチャに依存して決められる。
補足事項
SetCpuIntLevel の補足事項を参照のこと
本APIでは、それ以前の状態とは無関係に、単純に割込みコントローラ内のマスクレベルの設定を行うだけである。本APIの実行により、禁止される割込みの範囲が増える場合と、減る場合の両方があるので注意されたい。

μT-Kernel 3.0仕様書

本APIでは、実行効率を重視しオーバーヘッドを最小限とするために、エラーのチェックは行わない。

348 / 487

μT-Kernel 3.0仕様書

5.3.2.8

349 / 487

GetCtrlIntLevel - 割込みコントローラ内割込みマスクレベルの取得

C言語インタフェース#include <tk/tkernel.h>
INT level = GetCtrlIntLevel(void);
パラメータなし
リターンパラメータ
INT

level

Interrupt Mask Level

割込みマスクレベル

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_CTRLINTLEVEL

割込みコントローラ内割込みマスクレベルのサポート

解説
割込みコントローラ内に設定されている割込みマスクレベルの現在値を取得し、リターンパラメータ level として返す。
level で指定可能な値の範囲は実装定義である。
補足事項
SetCpuIntLevel の補足事項を参照のこと

μT-Kernel 3.0仕様書

350 / 487

5.4 I/Oポートアクセスサポート機能
I/Oポートアクセスサポート機能は、入出力デバイスへのアクセスや操作をサポートするための機能である。アドレスを指定したI/Oポートに対して、バイト単位やワード単位で読込みや書込みを行う機能、入出力デバイスの操作時などに使う短い時間の待ち(微小待ち)を実現する機能が含まれる。
I/Oポートアクセスサポート機能は、ライブラリ関数またはC言語のマクロで提供され、これらはタスク独立部およびディスパッ
チ禁止・割込み禁止の状態から呼び出すことができる。

μT-Kernel 3.0仕様書

351 / 487

5.4.1 I/Oポートアクセス
I/O空間とメモリ空間が独立しているシステムでは、I/Oポートアクセス関数はI/O空間のアクセスとなる。メモリマップドI/Oのみのシステムでは、I/Oポートアクセス関数はメモリ空間のアクセスとなる。メモリマップドI/Oのシステムにおいても、これらの関数を利用することにより、ソフトウェアの移植性や可読性が向上する。

μT-Kernel 3.0仕様書

5.4.1.1

352 / 487

out_b - I/Oポート書込み(バイト)C言語インタフェース#include <tk/tkernel.h>void out_b(INT port, UB data);
パラメータ
INT
UB

port
data

I/O Port Address
Write Data

I/Oポートアドレス
書き込むデータ(バイト)

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_IOPORT

I/Oポートアクセス機能のサポート

解説
port のアドレスで示されるI/Oポートに、バイト(8ビット)単位で data を書き込む。

タスク独立部
○

μT-Kernel 3.0仕様書

5.4.1.2

353 / 487

out_h - I/Oポート書込み(ハーフワード)

C言語インタフェース#include <tk/tkernel.h>void out_h(INT port, UH data);
パラメータ
INT
UH

port
data

I/O Port Address
Write Data

I/Oポートアドレス
書き込むデータ(ハーフワード)

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_IOPORT

I/Oポートアクセス機能のサポート

解説
port のアドレスで示されるI/Oポートに、ハーフワード(16ビット)単位で data を書き込む。

タスク独立部
○

μT-Kernel 3.0仕様書

5.4.1.3

354 / 487

out_w - I/Oポート書込み(ワード)C言語インタフェース#include <tk/tkernel.h>void out_w(INT port, UW data);
パラメータ
INT
UW

port
data

I/O Port Address
Write Data

I/Oポートアドレス
書き込むデータ(ワード)

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_IOPORT

I/Oポートアクセス機能のサポート

解説
port のアドレスで示されるI/Oポートに、ワード(32ビット)単位で data を書き込む。

タスク独立部
○

μT-Kernel 3.0仕様書

5.4.1.4

355 / 487

out_d - I/Oポート書込み(ダブルワード)

C言語インタフェース#include <tk/tkernel.h>void out_d(INT port, UD data);
パラメータ
INT
UD

port
data

I/O Port Address
Write Data

I/Oポートアドレス
書き込むデータ(ダブルワード)

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_IOPORTTK_HAS_DOUBLEWORD

I/Oポートアクセス機能のサポート
64ビットデータ型(D, UD, VD)のサポート

解説
port のアドレスで示されるI/Oポートに、ダブルワード(64ビット)の data を書き込む。
なお、ハードウェアの制約により、ダブルワード(64ビット)単位でI/0ポートを一括アクセスできないシステムにおいては、ダブルワード(64ビット)よりも短い単位に分割されて処理される。
仕様決定の理由
I/O用のデータバスが32ビット以下の場合など、ハードウェア構成の制約により、ダブルワード(64ビット)単位でのI/0ポートア
クセスができないシステムも多く存在する。このようなシステム上には、指定のビット幅のデータを一括して処理するという意
味での厳密な out_d や in_d の仕様は実装できないことになり、このAPIの本来の目的から言えば、out_d や in_d を未実装とするか、実行時にエラーを返すのが望ましい。しかしながら、実行時にバス構成等を判断してエラーを検出するのは現実的ではないし、64ビットのデータの書込みを32ビット以下の単位に分割して処理しても、問題にならないケースも多い。
このような状況から、out_d や in_d の仕様においては、64ビットのデータを一括して処理できないケースについても許容している。したがって、out_d や in_d で64ビットI/Oポートの一括アクセスが保証できるかどうかは実装依存である。64ビットI/O
ポートの一括アクセスが必要であれば、システムのハードウェア構成および out_d や in_d の処理方法の確認が必要である。

μT-Kernel 3.0仕様書

5.4.1.5

356 / 487

in_b - I/Oポート読込み(バイト)C言語インタフェース#include <tk/tkernel.h>
UB data = in_b(INT port);
パラメータ
INT

port

I/O Port Address

I/Oポートアドレス

Read Data

読み込んだデータ(バイト)

リターンパラメータ
UB

data

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_IOPORT

I/Oポートアクセス機能のサポート

解説
port のアドレスで示されるI/Oポートから、バイト(8ビット)単位で読み込んだデータを、リターンパラメータ data として返す。

μT-Kernel 3.0仕様書

5.4.1.6

357 / 487

in_h - I/Oポート読込み(ハーフワード)

C言語インタフェース#include <tk/tkernel.h>UH data = in_h(INT port);
パラメータ
INT

port

I/O Port Address

I/Oポートアドレス

Read Data

読み込んだデータ(ハーフワード)

リターンパラメータ
UHdata

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_IOPORT

I/Oポートアクセス機能のサポート

解説
port のアドレスで示されるI/Oポートから、ハーフワード(16ビット)単位で読み込んだデータを、リターンパラメータ data として返す。

μT-Kernel 3.0仕様書

5.4.1.7

358 / 487

in_w - I/Oポート読込み(ワード)C言語インタフェース#include <tk/tkernel.h>
UW data = in_w(INT port);
パラメータ
INT

port

I/O Port Address

I/Oポートアドレス

Read Data

読み込んだデータ(ワード)

リターンパラメータ
UW

data

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_IOPORT

I/Oポートアクセス機能のサポート

解説
port のアドレスで示されるI/Oポートから、ワード(32ビット)単位で読み込んだデータを、リターンパラメータ data として返す。

μT-Kernel 3.0仕様書

5.4.1.8359 / 487

in_d - I/Oポート読込み(ダブルワード)

C言語インタフェース#include <tk/tkernel.h>UD data = in_d(INT port);
パラメータ
INT

port

I/O Port Address

I/Oポートアドレス

Read Data

読み込んだデータ(ダブルワード)

リターンパラメータ
UDdata

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルがすべて有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_IOPORTTK_HAS_DOUBLEWORD

I/Oポートアクセス機能のサポート
64ビットデータ型(D, UD, VD)のサポート

解説
port のアドレスで示されるI/Oポートから、ダブルワード(64ビット)のデータを読み込み、リターンパラメータ data として返す。
なお、ハードウェアの制約により、ダブルワード(64ビット)単位でI/0ポートを一括アクセスできないシステムにおいては、ダブルワード(64ビット)よりも短い単位に分割されて処理される。
仕様決定の理由「項5.4.1.4. 「out_d - I/Oポート書込み(ダブルワード)」」を参照のこと。

μT-Kernel 3.0仕様書

360 / 487

5.4.2 微小待ち
5.4.2.1

WaitUsec - 微小待ち(マイクロ秒)

C言語インタフェース#include <tk/tkernel.h>void WaitUsec(UW usec);
パラメータ
UW

usec

Micro Seconds

待ち時間(マイクロ秒)

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_MICROWAIT

微小待ち機能のサポート

解説
指定された時間分(マイクロ秒)の微小待ちを行う。
この待ちは通常ビジーループで実装される。すなわちカーネルの待ち状態ではなく、実行状態のまま微小待ちは行われる。
RAM上で実行する場合、ROM上で実行する場合、メモリキャッシュがオンの場合、オフの場合など、実行環境の影響を受けやすい。したがって、これらの待ち時間はあまり正確ではない。

μT-Kernel 3.0仕様書

5.4.2.2

361 / 487

WaitNsec - 微小待ち(ナノ秒)

C言語インタフェース#include <tk/tkernel.h>void WaitNsec(UW nsec);
パラメータ
UW

nsec

Nano Seconds

待ち時間(ナノ秒)

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_MICROWAIT

微小待ち機能のサポート

解説
指定された時間分(ナノ秒)の微小待ちを行う。
この待ちは通常ビジーループで実装される。すなわちカーネルの待ち状態ではなく、実行状態のまま微小待ちは行われる。
RAM上で実行する場合、ROM上で実行する場合、メモリキャッシュがオンの場合、オフの場合など、実行環境の影響を受けやすい。したがって、これらの待ち時間はあまり正確ではない。

μT-Kernel 3.0仕様書

362 / 487

5.5 省電力機能
省電力機能は、システムの省電力を実現するための機能である。μT-Kernel/OSの中からコールバック型の関数として呼び出される。
省電力機能で定義されるAPIには、low_pow, off_pow があるが、これらは参考仕様であり、μT-Kernel内部でのみ使用する。デバイスドライバ、ミドルウェア、アプリケーションなどが本機能を直接呼び出して使うことはないので、本機能やそのAPIを独自の仕様とすることにより、より高度な省電力機能を実現しても構わない。ただし、本機能の参考仕様として定義されるAPIと同等程度の機能を実装するのであれば、プログラムの再利用性を高める意味で、参考仕様に合わせる方が望ましい。
本機能のAPIの呼出方法についても、実装定義である。単純な関数呼出でもよいし、トラップを使用してもよい。また、μTKernel以外のプログラムの中にこれらの機能を用意してもよい。ただし、拡張SVCなどのμT-Kernelの機能を利用する呼出方法は使用できない。

μT-Kernel 3.0仕様書

363 / 487

5.5.1 low_pow - システムを低消費電力モードに移行
C言語インタフェース
void low_pow(void);
パラメータなし
リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
×

準タスク部
×

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_LOWPOWER

省電力機能のサポート

解説
μT-Kernelのタスクディスパッチャの中から呼び出され、CPUのハードウェアを低消費電力モードに移行する処理を行う。
低消費電力モードに移行した後は、low_pow の処理の中で外部割込みの発生を待ち、外部割込みが発生したら、CPU周辺のハードウェアを通常モード(低消費電力ではないモード)に戻す処理を行ってから、low_pow の呼出元に復帰する。
low_pow の具体的な処理手順は以下の通りである。
1. CPUを低消費電力モードへ移行する。たとえば、クロック周波数を下げる。
2. 外部割込みの発生を待ってCPUを停止する。たとえば、そのような機能を持つCPU命令を実行する。
3. 外部割込みの発生によりCPUが実行を再開する。(ハードウェアによる処理)
4. CPUを通常モードに戻す。たとえば、通常のクロック周波数に戻す。
5. 呼出元に復帰する。呼出元は、実際にはμT-Kernel内部のディスパッチャである。
low_pow の実装にあたっては、以下の点に注意する必要がある。
• 割込み禁止状態で呼び出される。
• 割込みを許可してはいけない。
• 処理速度が割込み応答速度に影響するので、できる限り高速であることが要求される。

μT-Kernel 3.0仕様書

補足事項
タスクディスパッチャは、実行すべきタスクが無くなった場合に、消費電力を下げる目的で low_pow を呼び出す。

364 / 487

μT-Kernel 3.0仕様書

365 / 487

5.5.2 off_pow - システムをサスペンド状態に移行
C言語インタフェース
void off_pow(void);
パラメータなし
リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
×

準タスク部
×

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_LOWPOWER

省電力機能のサポート

解説
μT-Kernelの中から、powmode＝TPW_DOSUSPEND を指定した tk_set_pow の処理中に呼び出され、CPU周辺のハードウェア
をサスペンド状態(電源の切れた状態)に移行する処理を行う。
サスペンド状態に移行した後は、off_pow の処理の中でリジューム要因(電源再投入など)の発生を待ち、リジューム要因が発生したら、サスペンド状態を解除して off_pow の呼出元に復帰する。
off_pow の具体的な処理手順は以下の通りである。
1. CPUをサスペンド状態へ移行し、リジューム要因の発生を待つ。たとえば、クロックを停止する
2. リジューム要因の発生によりCPUが実行を再開する。(ハードウェアによる処理)
3. 必要に応じて、CPUやハードウェアの状態を通常の状態に戻す。サスペンド状態を解除する。(前項と一緒にハードウェ
アで処理される場合もある)
4. 呼出元に復帰する。呼出元は、実際にはμT-Kernel内部の tk_set_pow の処理部分である。
off_pow の実装にあたっては、以下の点に注意する必要がある。
• 割込み禁止状態で呼び出される。

μT-Kernel 3.0仕様書

366 / 487

• 割込みを許可してはいけない。
なお、周辺機器など各デバイスは、デバイスドライバによってサスペンド状態への移行および復帰を行う。詳細は tk_sus_dev
を参照。

μT-Kernel 3.0仕様書

367 / 487

5.6 システム構成情報管理機能
システム構成情報管理機能は、システム構成に関する各種の情報を保持・管理するための機能である。
システム構成情報の一部は標準定義として定めてあり、その中で最大タスク数やタイマ割込み間隔などの情報を定義するが、それ以外にもアプリケーションやサブシステム、デバイスドライバで任意に定義した情報を追加して利用できる。
システム構成情報の形式は、名称と定義データの組である。
名称
最大16文字の文字列で表される。文字コードはUS-ASCIIを使用する。
使用可能な文字(UB): a〜z A〜Z 0〜9 _
定義データ
数値(整数)の並びまたは文字列により定義される。
使用可能な文字(UB): 0x00〜0x1F,0x7F,0xFF(文字コード)を除く文字
システム構成情報の形式の例
名称
SysVer
SysName定義データ
30
microT-Kernel Version 3.00

システム構成情報をどの様に保持するかについては規定しないが、一般的にはメモリ(ROM/RAM)に保持する。したがって、あまり大量の情報を保持する目的には使用しない。
システム構成情報は、tk_get_cfn および tk_get_cfs によって取得できる。
なお、システムの実行中にシステム構成情報を追加・変更する機能はない。

μT-Kernel 3.0仕様書

368 / 487

5.6.1 システム構成情報の取得
システム構成情報を取得するためのAPIとして、tk_get_cfn と tk_get_cfs がある。これらの機能は、アプリケーションやサブシステム、デバイスドライバなどから利用可能であるほか、μT-Kernelの内部でも利用している。

μT-Kernel 3.0仕様書

5.6.1.1

369 / 487

tk_get_cfn - システム構成情報から数値列取得

C言語インタフェース#include <tk/tkernel.h>
INT ct = tk_get_cfn(CONST UB *name, W *val, INT max);
パラメータ
CONST UB*
W*
INT

name
val
max

Name
Value
Maximum Count

名称
数値列を格納する配列
val の配列の要素数

ct

Defined Numeric
Information Count
Error Code定義されている数値情報の個数

リターンパラメータ
INTまたはエラーコードエラーコードE_NOEXS

name の名称で情報が定義されていない

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_SYSCONF

システム構成情報管理機能のサポート

解説
システム構成情報から数値列の情報を取得する。name の名称で定義されている数値列の情報を、最大 max 個まで取得しval へ格納する。戻値に定義されている数値列情報の数を返す。戻値 > max であれば、すべての情報を格納しきれていないことを示す。max＝0を指定することで、val に格納せずに数値列の数を知ることができる。
name の名称の情報が定義されていないときは E_NOEXS を返す。name の名称で定義されている情報が文字列であった場合の動作は不定である。
この機能は、μT-Kernel/OSのシステムコールの呼出可能な保護レベルの制限を受けずに任意の保護レベルから呼び出すことができる。

μT-Kernel 3.0仕様書

5.6.1.2

370 / 487

tk_get_cfs - システム構成情報から文字列取得

C言語インタフェース#include <tk/tkernel.h>
INT rlen = tk_get_cfs(CONST UB *name, UB *buf, INT max);
パラメータ
CONST UB*
UB*
INT

name
buf
max

Name
BufferMaximum Length

名称
文字列を格納する配列
buf の最大長(バイト数)

rlen

Size of Defined Character
String Information
Error Code定義されている文字列情報の長さ(バイト数)
エラーコードリターンパラメータ
INTまたはエラーコードE_NOEXS

name の名称で情報が定義されていない

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_SYSCONF

システム構成情報管理機能のサポート

解説
システム構成情報から文字列の情報を取得する。name の名称で定義されている文字列の情報を、最大 max 文字まで取得
し、buf へ格納する。格納した文字列が max 文字未満であれば、最後に’\0’を格納する。戻値に定義されている文字列情報の長さ(’\0’は含まない)を返す。戻値 > max であれば、すべての情報を格納しきれていないことを示す。max＝0を指定することで、buf に格納せずに文字列の長さを知ることができる。
name の名称で情報が定義されていないときは E_NOEXS を返す。name の名称で定義されている情報が数値列であった場合の動作は不定である。
この機能は、μT-Kernel/OSのシステムコールの呼出可能な保護レベルの制限を受けずに任意の保護レベルから呼び出すことができる。

μT-Kernel 3.0仕様書

371 / 487

5.6.2 標準システム構成情報
下記の定義情報を標準として定める。標準定義の名称はTを前置する。
文字列
N
S

説明
数値列情報
文字列情報

• 製品情報文字列
S

標準定義の名称
TSysName

説明システム名称(製品名称)

標準定義の名称
TMaxTskId
TMaxSemId
TMaxFlgId
TMaxMbxId
TMaxMtxId
TMaxMbfId
TMaxMpfId
TMaxMplId
TMaxCycId
TMaxAlmId
TMaxSsyId
TMaxSsyPri

説明
最大タスク数
最大セマフォ数
最大イベントフラグ数
最大メールボックス数
最大ミューテックス数
最大メッセージバッファ数
最大固定長メモリプール数
最大可変長メモリプール数
最大周期起動ハンドラ数
最大アラームハンドラ数
最大サブシステム数
最大サブシステム優先度数

文字列
N

標準定義の名称
TSysStkSz

N

TSVCLimit

N

TTimPeriod

説明
デフォルトシステムスタックサイズ(バイト数)
システムコールの呼出可能な最も低い保護レベル
タイマ割込み間隔(ミリ秒単位)タイマ
割込み間隔(マイクロ秒単位)• 各オブジェクトの最大数
文字列
N
N
N
N
N
N
N
N
N
N
N
N
• その他

ミリ秒単位の時間とマイクロ秒単位の時間を合わせた時間が、実際のタイマ割込み間隔の時間となる。マイクロ秒単位の時間を省略した場合は0とみなされる。
たとえば、タイマ割込み間隔を5ミリ秒とする場合は、”TTimPeriod 5” あるいは ”TTimPeriod 0 5000” と記述する。タイマ
割込み間隔を1.5ミリ秒(1500マイクロ秒)とする場合は、”TTimPeriod 1 500” あるいは ”TTimPeriod 0 1500” と記述する。
• デバイス管理
文字列
N
N
N
N

標準定義の名称
TMaxRegDev
TMaxOpnDev
TMaxReqDev
TDEvtMbfSz

説明
最大デバイス登録数
最大デバイスオープン数
最大デバイスリクエスト数
事象通知用メッセージバッファのサイズ(バイト数)事象通知のメッセージ
最大長(バイト数)

μT-Kernel 3.0仕様書

372 / 487

TDEvtMbfSz が定義されなかった場合、またはメッセージバッファのサイズに負数が設定された場合は、事象通知用メッセー
ジバッファを使用しない。
上記の数値列情報で複数の数値が定義されるものは、説明の順序と同じ順序で配列に格納される。
複数の数値の格納順の例
tk_get_cfn (" TDEvtMbfSz ", val , 2)val[0] = 事象通知用メッセージバッファのサイズ
val[1] = 事象通知のメッセージ最大長

μT-Kernel 3.0仕様書

373 / 487

5.7 メモリキャッシュ制御機能
メモリキャッシュ制御機能は、キャッシュの制御やモード設定を行うための機能である。
μT-Kernelにおけるキャッシュについての考え方は、以下の通りである。
基本的には、アプリケーションもデバイスドライバも、キャッシュの存在を意識することなくプログラムしていれば、自動的に適切なキャッシュ制御が行われるべきである。特に、プログラムの移植性を考慮すると、キャッシュのようにシステムへの依存性が強いものは、できるだけアプリケーションプログラムと切り離して扱えるのがよい。そのため、μT-Kernelを使った実際の個々のシステムでは、μT-Kernel自身が自動的にキャッシュの制御を行う方針となっている。
具体的には、通常のプログラムやデータを入れるメモリ等の領域はキャッシュON、I/Oなどの領域はキャッシュOFFとなるようにμT-Kernelがキャッシュの設定を行う。したがって、通常のアプリケーションプログラムが明示的にキャッシュ制御の関数を呼ぶ必要はない。プログラムから意識的にキャッシュ制御を行わなくても、適切なキャッシュ制御が自動的に行われる。
ただし、μT-Kernelによるキャッシュ制御(いわば、デフォルト設定によるキャッシュ制御)だけでは、適切な対応ができない場合もある。たとえば、DMA転送の絡んだ入出力処理を行う場合や、カーネル管理外のメモリ領域を使う場合には、明示的なキ
ャッシュ制御が必要となることがある。また、プログラムを動的にロードあるいは生成(コンパイル)しながら実行するような場合には、データキャッシュと命令キャッシュを適切に同期させるためのキャッシュ制御が必要となることがある。このようなケースで利用することを想定した機能が、メモリキャッシュ制御機能である。

μT-Kernel 3.0仕様書

374 / 487

5.7.1 SetCacheMode - キャッシュモードの設定
C言語インタフェース#include <tk/tkernel.h>
SZ rlen = SetCacheMode(void *addr, SZ len, UINT mode);
パラメータ
void*
SZ
UINT

addr
len
mode

Start Address
LengthMode

先頭アドレス
領域サイズ(バイト数)
キャッシュモード

Result Length

キャッシュモードを設定できた領域のサイズ(バイト数)
エラーコードリターンパラメータ
SZ

rlen
または

Error Code

エラーコード
E_OK
E_PAR
E_NOSPT

正常終了
パラメータエラー(addr, len, mode が不正あるいは利用できない)
未サポート機能(mode で指定した機能が未サポート)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルがすべて有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_CACHECTRLTK_SUPPORT_SETCACHEMODE

メモリキャッシュ制御機能のサポート
キャッシュモード設定機能のサポート

また、以下のサービスプロファイルが本APIに関係する。
TK_SUPPORT_WBCACHETK_SUPPORT_WTCACHE

キャッシュモードにライトバック(CM_WB)が指定可能
キャッシュモードにライトスルー(CM_WT)が指定可能

解説
メモリ領域のキャッシュモードを設定する。具体的には、addr から len バイトのメモリ領域のキャッシュに対して、mode で指定した設定を行う。
mode := ( CM_OFF || CM_WB || CM_WT ) | [CM_CONT]μT-Kernel 3.0仕様書

375 / 487

CM_OFF キャッシュオフ
CM_WB
キャッシュオン(ライトバック)
CM_WTキャッシュオン(ライトスルー)
CM_CONT アドレス(物理アドレス)が連続した領域のみキャッシュ設定を行う...
/* 実装独自のモードを追加してもよい */mode に CM_OFF を指定した場合は、キャッシュをフラッシュ(書き戻し)した後に無効化して、キャッシュモードをオフに設定する。
mode に CM_WT を指定した場合は、キャッシュをフラッシュした後にキャッシュモードをライトスルーに設定する。
mode に CM_WB を指定した場合は、キャッシュモードをライトバックに設定する。この時にキャッシュフラッシュを行うかどうかは実装依存とする。
mode に CM_CONT を指定した場合は、addr からアドレス(物理アドレス)が連続した領域のみキャッシュモード設定を行う。指定した領域内にメモリ割り当てのない部分があった場合は、その直前で処理を中止し、処理が完了した領域のサイズを返す。CM_CONT を指定しなかった場合は、指定したすべての領域のキャッシュを処理し、処理が完了した領域のサイズを返す。
CPUや実装によっては、キャッシュモードの一部、あるいは全部の設定が不可能な場合がある。設定不可能なモードを指定した場合は、何も処理せず E_NOSPT を返す。
len は1以上とする。0以下の数を指定した場合はエラーコード E_PAR を返す。
補足事項
キャッシュモードの設定は、一般にはページなど大きな領域を単位として行われるため、addr がその領域の先頭ではない場
合であっても、addr が含まれる領域全体が設定対象となる。また、隣接した領域に対しても、意図しないキャッシュアクセスが発生する可能性があるので、使用には注意が必要である。
ハードウェア構成やCPUの持つキャッシュの機能に依存して、さらに詳細なキャッシュモードの設定を行いたい場合は、実装独自の mode を追加して利用する。たとえば、NORMAL CACHE OFF (Weakly Order), DEVICE CACHE OFF (Weakly Order),STRONG ORDER などのキャッシュモードを指定可能な場合がある。
利用できない mode を指定した場合のエラーが E_NOSPT となるか E_PAR となるかは実装依存である。

μT-Kernel 3.0仕様書

376 / 487

5.7.2 ControlCache - キャッシュの制御
C言語インタフェース#include <tk/tkernel.h>
SZ rlen = ControlCache(void *addr, SZ len, UINT mode);
パラメータ
void*
SZ
UINT

addr
len
mode

Start Address
LengthMode

先頭アドレス
領域サイズ(バイト数)
制御モード

Result Length

キャッシュモードを設定できた領域のサイズ(バイト数)
エラーコードリターンパラメータ
SZ

rlen
または

Error Code

エラーコード
E_OK
E_PAR
E_NOSPT

正常終了
パラメータエラー(addr, len, mode が不正)未サポート機能(mode で指定した機能が未サポート)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_CACHECTRL

メモリキャッシュ制御機能のサポート

解説
メモリ領域のキャッシュ制御(フラッシュあるいは無効化)を行う。具体的には、論理アドレス addr から len バイトのメモリ領域のキャッシュに対して、mode で指定した制御を行う。
mode := (CC_FLUSH | CC_INVALIDATE)
CC_FLUSH
キャッシュのフラッシュ(書き戻し)
CC_INVALIDATEキャッシュの無効化...
/* 実装独自のモード値を追加してもよい */CC_FLUSH と CC_INVALIDATE は同時に指定可能である。その場合はキャッシュをフラッシュした後に無効化する。

μT-Kernel 3.0仕様書

377 / 487

処理が成功すると、処理を行った領域のサイズを返す。
キャッシュモードや属性の異なる領域を跨ぐ範囲を指定してはいけない。例えば、キャッシュオンの領域とキャッシュオフの領域、保護レベルの異なる領域のような異なる属性の領域の境界を跨ぐ範囲を指定してはいけない。このような範囲を指定した場合の動作は保証されない。
キャッシュ制御はハードウェアに依存する部分が多いため、CPUやハードウェア、実装によってその機能の詳細は異なる。指定された領域を指定されたモードで制御するのが基本だが、指定された領域を含めて、より多くの領域に影響を与える場合がある。例えば、以下のような場合がある。
• 正確な指定範囲のみを制御(フラッシュあるいは無効化)するとは限らない。指定範囲を含む領域が制御されるが、CPUや
ハードウェア、実装によっては、それ以外の領域(例えば全メモリ)に対しても、フラッシュあるいは無効化が行われる場合がある。
• キャッシュオフの領域を指定した場合は、通常は何も行わない。しかしこのケースにおいても、指定範囲以外の領域のキャッ
シュのフラッシュあるいは無効化が行われる可能性がある。(常に全領域をフラッシュする処理を行うなど)• キャッシュのないシステムでは、何も行わない。
一般に、キャッシュの制御はキャッシュラインサイズ単位で行われる。このため隣接した領域に意図しないキャッシュアクセス
が発生する可能性があるので、使用には注意が必要である。

μT-Kernel 3.0仕様書

378 / 487

5.8 物理タイマ機能
物理タイマ機能は、複数のハードウェアタイマが使えるシステムにおいて、タイマ割込み間隔(TTimPeriod)よりも細かい単位の時間経過を条件とした処理を行う場合に有効な機能である。
物理タイマとは、一定の時間間隔で、0から1つずつカウント値が単調増加していくハードウェアのカウンタである。カウント値
が、物理タイマごとに指定された特定の値(上限値)に達すると、物理タイマ毎に指定されたハンドラ(物理タイマハンドラ)を起動するとともに、カウント値が0に戻る。
システムで利用可能なハードウェアタイマの数に応じて、複数個の物理タイマが利用できる。利用可能な物理タイマの個数は実装依存である。通常のμT-Kernelの実装では、時間管理機能を実現するためにハードウェアタイマを1つ使用するので、残りのハードウェアタイマを物理タイマ機能で使用することを想定している。
物理タイマ番号としては、1, 2, ...のように正の整数を小さい方から使う。たとえば、4個のハードウェアタイマがある場合、このう
ちの1個はμT-Kernelの時間管理機能で使うため、残り3個の物理タイマが利用でき、物理タイマ番号は1, 2, 3となる。
μT-Kernel/SMの物理タイマ機能において、個々の物理タイマと、それを使用するタスク等との対応を管理することはない。
複数のタスク等が1つの物理タイマを共用したい場合は、アプリケーション側で排他制御などの調整を行う必要がある。
補足事項
μT-Kernelの時間管理機能では、項5.6.2. 「標準システム構成情報」の「タイマ割込み間隔」(TTimPeriod)で指定された
時間間隔で起動されるハンドラの中で、カーネルがアラームハンドラや周期ハンドラの起動、タイムアウトの処理など、複数の要求に対する処理を行っている。これに対して、物理タイマ機能は、ハードウェアタイマの設定、カウント値の読み出し、割込み発生といったプリミティブな機能を標準化して提供するだけのものであり、時間管理機能のように複数の要求を処理するわけではない。こういった点から、従来の時間管理機能よりも抽象度が低く、ハードウェアの階層に近い機能であるという意味で、「物理タイマ(Physical Timer)」の名称とした。
上記のような位置付けから、物理タイマ機能はできるだけシンプルで最小限の仕様とし、オーバーヘッドの少ないライブラ
リ関数で実現することを想定している。動的なID番号ではなく静的に固定された物理タイマ番号を使う仕様や、要求元タスクとの対応の管理や複数タスクからの要求の調整を一切行わないといった仕様も、この方針を反映したものである。
物理タイマの関数は、タイマ(カウンタ)というデバイスを操作するためのAPIを標準化したものである。ただし、タイマというデバイスでは、細かい時間経過に応じて割込みハンドラを呼び出すなど、時間関連の動作に直接関わる部分が多く、この点で他のデバイス(ストレージや通信など)よりもカーネルとの結び付きが強い。こういった理由から、タイマについては、デバイ
スドライバの仕様として標準化するのではなく、μT-Kernel/SMの一部として仕様を標準化し、より汎用性の高い機能として提供する。
物理タイマ機能はμT-Kernel/SMの機能なので、μT-Kernel/SMの【全般的な注意・補足事項】が適用される。
物理タイマとして利用するハードウェアタイマは、32ビット以下を想定している。そのため、カウント値や上限値を表すデータ
タイプは32ビットのUWを使っている。将来、64ビットの関数を追加することは可能である。

μT-Kernel 3.0仕様書

379 / 487

5.8.1 物理タイマのユースケース
物理タイマ機能の有効性が高い例を以下に示す。
(a)実現すべき処理の例
2500マイクロ秒毎に行うべき周期的な処理Xと、1800マイクロ秒毎に行うべき周期的な処理Yがあるとする。これを、物理タイマで効率よく実現する。
(b)物理タイマ機能を使った実現方法
2つの物理タイマを使い、その一方は、ちょうど2500マイクロ秒毎に物理タイマハンドラが起動されるように設定する。
たとえば、物理タイマのクロック周波数が10MHzであれば、1クロックが0.1マイクロ秒(＝100ナノ秒)なので、物理タイ
マの上限値(limit)として24999(＝25000-1)を設定し、カウント値が24999から0になる時に物理タイマハンドラが起動されるようにする。
周期的に繰り返す処理なので、StartPhysicalTimer の mode では TA_CYC_PTMR を指定する。
この物理タイマハンドラの中で処理Xを行う。
これと同様に、もう一方の物理タイマを使って、ちょうど1800マイクロ秒毎に起動される物理タイマハンドラを設定し、この中で処理Yを行う。
μT-Kernelの時間管理機能が使うタイマ割込み間隔(TTimPeriod)は、物理タイマ機能とは無関係なので、デフォルト
値(10ミリ秒)のままでよい。
(c)物理タイマ機能を使わない実現方法
物理タイマハンドラの代わりに、マイクロ秒が指定可能なμT-Kernel 3.0のシステムコール(tk_cre_cyc_u)を使って、2500マイクロ秒毎に起動される周期ハンドラを定義し、その中で処理Xを行う。また、1800マイクロ秒毎に起動される周期ハンドラを定義し、その中で処理Yを行う。
しかし、この場合には、2500マイクロ秒毎および1800マイクロ秒毎という時間がいずれも正確に処理されるように、
μT-Kernelの時間管理機能が使うタイマ割込み間隔を十分に短く設定する必要がある。具体的には、2500マイクロ秒と1800マイクロ秒の公約数である100マイクロ秒のタイマ割込み間隔とすることにより、2500マイクロ秒毎の処理も、1800マイクロ秒毎の処理も、ほぼ正確な時間間隔で実現できる。
物理タイマ機能を使った(b)の方法であれば、μT-Kernelの時間管理機能は使わないので、タイマ割込み間隔はデフォルト(10ミリ秒毎)のままでよい。このほかに、物理タイマによる割込みが2500マイクロ秒毎および1500マイクロ秒毎に入り、その中から呼ばれる物理タイマハンドラの中で処理Xや処理Yを行うことになるが、これら以外に時間に関係した無駄な割込みが入ることはない。
一方、物理タイマ機能を使わない(c)の方法では、タイマ割込み間隔を短くする必要があるため、タイマ割込みの回数が増え、その分のオーバーヘッドが増加する。たとえば、10ミリ秒の間に入ってくる時間関係の割込みの回数で比較すると、(b)では時間管理機能のためのタイマ割込みが1回(＝10ミリ秒÷10ミリ秒)、処理Xのための物理タイマの割込みが4回(＝10ミリ秒
÷2500マイクロ秒)、処理Yのための物理タイマの割込みが6回(＝10ミリ秒÷1500マイクロ秒)、合計11回であるのに対し、(c)では時間管理機能のためのタイマ割込みが100回(＝10ミリ秒÷100マイクロ秒)となる。時間の正確さとのトレードオフになるが、処理Xと処理Yの周期や位相の差によっては、タイマ割込み間隔をさらに短くする必要があり、もっと大きなオーバーヘッドを生じる可能性もある。このようなケースにおいて、物理タイマ機能の有効性が高い。
ただし、物理タイマ機能が有効なのは、時間に依存した処理の数が少なくて静的に決まっており、それに対して十分な数のハードウェアタイマが存在する場合である。物理タイマ機能は、文字通り、物理的なハードウェア資源の制約を受ける機能なので、ハードウェアタイマが少なければ、物理タイマ機能が十分に使えない。また、時間に依存した処理が動的に増えてくるようなケースには対応しにくい。そのようなケースでは、周期ハンドラやアラームハンドラなど従来の時間管理機能を使う方が、柔軟な対応が可能である。
マイクロ秒単位の時間管理機能と、物理タイマの機能は、用途の重複する面もあるが、上記のように特性の異なる面もあるた
め、ハードウェア構成やアプリケーションに応じて適切な方を利用できるとよい。物理タイマの機能は、このような理由で追加されたものである。

μT-Kernel 3.0仕様書

380 / 487

5.8.2 StartPhysicalTimer - 物理タイマの動作開始
C言語インタフェース#include <tk/tkernel.h>ER ercd = StartPhysicalTimer(UINT ptmrno, UW limit, UINT mode);
パラメータ
UINT
UW
UINT

ptmrnolimit
mode

Physical Timer Number
Limit
Mode

物理タイマ番号
上限値
動作モード

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(ptmrno, limit, mode が不正あるいは利用できない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_PTIMER

物理タイマ機能のサポート

また、以下のサービスプロファイルが本APIに関係する。
TK_MAX_PTIMER

最大物理タイマ番号

解説
ptmrno で指定された物理タイマのカウント値を0とした後、カウントを開始する。本関数の実行後は、タイマのクロック周波数の逆数の時間間隔ごとに、カウント値が1ずつ増加する。
limit ではカウント値の上限値を指定する。カウント値が上限値に達した後、さらにクロック周波数の逆数の時間が経つと、カウント値は0に戻る。この時、この物理タイマに対する物理タイマハンドラが定義されていた場合には、そのハンドラが起動される。StartPhysicalTimer の発行により物理タイマがカウントを始めてから、次にカウント値が0になるまでの時間は、(クロック周波数の逆数の時間)×(上限値＋1)である。
limit が0の場合は E_PAR のエラーになる。
mode では次の指定を行う。

μT-Kernel 3.0仕様書

TA_ALM_PTMR

0

TA_CYC_PTMR

1381 / 487

カウント値が上限値から0に戻った後は、カウントを停止する。その後のカウント値は0のままとなる。
カウント値が上限値から0に戻った後も、再度カウント値の増加を続ける。したがって、カウント値は周期的な増加を繰り返す。

μT-Kernel 3.0仕様書

382 / 487

5.8.3 StopPhysicalTimer - 物理タイマの動作停止
C言語インタフェース#include <tk/tkernel.h>ER ercd = StopPhysicalTimer(UINT ptmrno);
パラメータ
UINT

ptmrnoPhysical Timer Number

物理タイマ番号

Error Code

エラーコードリターンパラメータ
ER

ercd

エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(ptmrno が不正あるいは利用できない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_PTIMER

物理タイマ機能のサポート

また、以下のサービスプロファイルが本APIに関係する。
TK_MAX_PTIMER

最大物理タイマ番号

解説
ptmrno で指定された物理タイマのカウントを停止する。
本関数の実行後、物理タイマのカウント値はそのまま保持される。すなわち、本関数の実行後に GetPhysicalTimerCount を実行した場合には、本関数実行直前の物理タイマのカウント値が返る。
既にカウントを停止している物理タイマに対して、本関数を実行しても、何も起こらない。エラーにもならない。
補足事項
使用の終わった物理タイマを動かしたままにしておいた場合、プログラムの動作上の不都合はなくても、クロックを無駄に使い、省電力などの面で望ましくない可能性がある。そのため、使用していない物理タイマに対しては、本関数を実行し、カウントを停止しておく方が望ましい。

μT-Kernel 3.0仕様書

383 / 487

本関数の発行が有効なのは、StartPhysicalTimer の mode として TA_CYC_PTMR を指定した物理タイマの使用が終了した場合である。mode として TA_ALM_PTMR を指定した場合は、カウント値が上限値から0に戻った後で自動的にカウントを停止し、本関数を実行した後と同じ状態になる。この場合は、本関数を別途発行する必要はない。発行しても問題はないが、何も変化しない。

μT-Kernel 3.0仕様書

384 / 487

5.8.4 GetPhysicalTimerCount - 物理タイマのカウント値取得
C言語インタフェース#include <tk/tkernel.h>ER ercd = GetPhysicalTimerCount(UINT ptmrno, UW *p_count);
パラメータ
UINT
UW*

ptmrnop_count

Physical Timer Number
Pointer to Physical Timer Count

物理タイマ番号
物理タイマの現在カウント値を返す領域へのポインタ

Error Code
Physical Timer Count

エラーコード
現在カウント値

リターンパラメータ
ER
UW

ercd
count

エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(ptmrno が不正あるいは利用できない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_PTIMER

物理タイマ機能のサポート

また、以下のサービスプロファイルが本APIに関係する。
TK_MAX_PTIMER

最大物理タイマ番号

解説
ptmrno で指定された物理タイマの現在のカウント値を取得し、リターンパラメータ count として返す。

μT-Kernel 3.0仕様書

385 / 487

5.8.5 DefinePhysicalTimerHandler - 物理タイマハンドラ定義
C言語インタフェース#include <tk/tkernel.h>ER ercd = DefinePhysicalTimerHandler(UINT ptmrno, CONST T_DPTMR *pk_dptmr);
パラメータ
UINT
CONST T_DPTMR*

ptmrnopk_dptmr

Physical Timer Number
Packet to Define PhysicalTimer Handler

物理タイマ番号
物理タイマハンドラ定義情報

void*
ATR

exinf
ptmratrExtended Information
Physical Timer AttributeFP

ptmrhdrPhysical Timer Handler
Address

拡張情報
物理タイマハンドラ属性(TA_ASM ||TA_HLNG)
物理タイマハンドラアドレス

ercd

Error Codepk_dptmr の内容

リターンパラメータ
ER

エラーコードエラーコード
E_OK
E_NOMEM
E_RSATR
E_PAR

正常終了
メモリ不足(管理ブロック用の領域が確保できない)
予約属性(ptmratr が不正あるいは利用できない)パラメータエラー(ptmrno, pk_dptmr, ptmrhdr が不正あるいは利用できない、ptmrno に対する
物理タイマハンドラを定義できない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_PTIMER

物理タイマ機能のサポート

また、以下のサービスプロファイルが本APIに関係する。
TK_MAX_PTIMER

最大物理タイマ番号

タスク独立部×μT-Kernel 3.0仕様書

386 / 487

解説
pk_dptmr が NULL でない場合は、ptmrno で指定された物理タイマに対する物理タイマハンドラを定義する。物理タイマハンド
ラは、タスク独立部として実行されるハンドラであり、物理タイマのカウント値が StartPhysicalTimer の limit で指定された上限値から0に戻る時に起動される。
物理タイマハンドラのプログラム形式は、周期ハンドラやアラームハンドラと同様である。すなわち、TA_HLNG 属性が指定された
場合は、高級言語対応ルーチンを経由して物理タイマハンドラが起動され、関数からのリターンによって終了する。TA_ASM 属性が指定された場合の物理タイマハンドラの形式は実装依存である。いずれの属性を指定した場合も、物理タイマハンドラの起動時のパラメータとして exinf を渡す。
pk_dptmr が NULL の場合は、ptmrno で指定された物理タイマに対する物理タイマハンドラの定義を解除する。システム起動
直後は、すべての物理タイマに対する物理タイマハンドラの定義が解除された状態となっている。
ptmrno で指定された物理タイマに対する物理タイマハンドラを定義できない場合(GetPhysicalTimerConfig の pk_rptmr>defhdr で FALSE を返す場合)は、E_PAR のエラーになる。ptmrno で指定された番号を持つ物理タイマが存在しない場合
や、利用できない場合にも、E_PAR のエラーになる。
補足事項
実装上は、物理タイマの機能を実現するための割込みハンドラを μT-Kernel/SMの内部で定義し、物理タイマのカウント値
が上限値から0に戻る時に、この割込みハンドラが起動されるように設定しておく。この割込みハンドラの中では、本関数で定義された物理タイマハンドラを呼び出すとともに、物理タイマの実装に関わる処理(たとえば、TA_ALM_PTMR と TA_CYC_PTMR に関する処理など)を行う。

μT-Kernel 3.0仕様書

387 / 487

5.8.6 GetPhysicalTimerConfig - 物理タイマのコンフィグレーション情報取得
C言語インタフェース#include <tk/tkernel.h>ER ercd = GetPhysicalTimerConfig(UINT ptmrno, T_RPTMR *pk_rptmr);
パラメータ
UINT
T_RPTMR*

ptmrnopk_rptmr

Physical Timer Number
Packet to Refer PhysicalTimer

物理タイマ番号
物理タイマのコンフィグレーション情報を返す領域へのポインタ

ercd

Error Code

エラーコードUW

ptmrclk

物理タイマのクロック周波数

UW
BOOL

maxcount
defhdrPhysical Timer Clock
Frequency
Maximum Count
Handler Support

リターンパラメータER
pk_rptmr の内容

最大カウント値
物理タイマハンドラサポートの有無

エラーコード
E_OK
E_PAR

正常終了
パラメータエラー(ptmrno, pk_rptmr が不正あるいは利用できない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_PTIMER

物理タイマ機能のサポート

また、以下のサービスプロファイルが本APIに関係する。
TK_MAX_PTIMER

最大物理タイマ番号

解説
ptmrno で指定された物理タイマに関するコンフィグレーション情報を取得する。

タスク独立部×μT-Kernel 3.0仕様書

388 / 487

取得可能なコンフィグレーション情報には、物理タイマのクロック周波数 ptmrclk、最大カウント値 maxcount、物理タイマハン
ドラサポートの有無 defhdr がある。
ptmrclk は、対象物理タイマのカウントアップに使用されるクロックの周波数である。ptmrclk が1の場合はクロックが1Hz、ptmrclk が (232 -1) の場合は (232 -1)Hz、すなわち約4GHzである。1Hz未満の長いクロックの場合は、ptmrclk が0となる。ptmrclk が0以外の場合は、ptmrclk の逆数の時間間隔ごとに、物理タイマのカウント値が0から上限値 limit の値まで単調増加していく。
maxcount は、対象物理タイマでカウント可能な最大値であり、上限値として設定可能な最大値でもある。一般的には、16ビッ
トのタイマカウンタの場合は maxcount が(216 -1)、32ビットのタイマカウンタの場合は maxcount が(232 -1)となるが、ハードウ
ェアやシステム構成によっては、それ以外の値をとる場合もある。
defhdr が TRUE の場合は、対象物理タイマのカウント値が上限値に達した時に起動される物理タイマハンドラを定義できる。defhdr が FALSE の場合は、この物理タイマに対する物理タイマハンドラを定義することはできない。
ptmrno で指定された番号を持つ物理タイマが存在せず、利用できない場合には、E_PAR のエラーになる。物理タイマ番号は正の整数を小さい方から使っていくため、N個の物理タイマが使えるシステムでは、ptmrno が0または(N+1)以上の場合にE_PAR のエラーになる。
補足事項
本関数の「コンフィグレーション」の名称にも見られるとおり、本関数で取得する ptmrclk, maxcount, defhdr の情報は、ハードウェアあるいはシステム起動時の設定により静的に固定されたものであり、システム動作中の変更がないことを想定している。しかしながら、将来あるいは実装依存の追加機能として、物理タイマのコンフィグレーション、たとえばクロック周波数を積極的に設定あるいは変更する機能を導入する可能性はあり、その場合は、本関数で取得する情報についても、システム動作
中に変化する動的な情報となる。このような使い方の差異は、運用や用途に依存する部分が大きく、μT-Kernelの仕様として決めるよりは、物理タイマを使った上位のライブラリ等の中で吸収するのがよいと考えられる。したがって、μT-Kernelの仕様としては、本関数で取得するコンフィグレーション情報がシステムの動作中に変化する可能性について、特に定めないことにする。すなわち、本関数で取得した情報が途中で変化する可能性があるかどうかは、実装依存である。

μT-Kernel 3.0仕様書

389 / 487

5.9 ユーティリティ機能
ユーティリティ機能は、μT-Kernel上のアプリケーション、ミドルウェア、デバイスドライバなどプログラム全般から利用される共通性の高い機能である。
ユーティリティ機能は、ライブラリ関数またはC言語のマクロで提供される。

μT-Kernel 3.0仕様書

390 / 487

5.9.1 オブジェクト名設定
オブジェクト名設定のAPIは、C言語のマクロで提供され、タスク独立部およびディスパッチ禁止・割込み禁止の状態から呼び出すことができる。

μT-Kernel 3.0仕様書

5.9.1.1

391 / 487

SetOBJNAME - オブジェクト名設定

C言語インタフェース#include <tk/tkernel.h>void SetOBJNAME(void *exinf, CONST UB *name);
パラメータ
void*
CONST UB*

exinf
name

Extended Information
Object Name

拡張情報を設定する変数
設定するオブジェクト名

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

関連するサービスプロファイル
なし
解説name で指定される4文字以下のASCII文字列を、1つの32ビットデータと解釈して、exinf に格納する。
本APIはC言語のマクロで定義されており、exinf はポインタではない。変数を直接記載する。
補足事項
本APIを使うことにより、μT-Kernelの各オブジェクトの拡張情報 exinf の中に、個々のオブジェクトに対するASCII文字列の名称(タスク名など)を設定することができる。デバッガ等でオブジェクトの状態を表示する際、exinf の値をASCII文字列として表示することにより、本APIによって設定されたオブジェクトの名称を表示できる。
SetOBJNAMEの使用例
T_CTSK ctsk ;...
/* ctskのタスクに " TEST " のオブジェクト名を設定 */SetOBJNAME ( ctsk . exinf , " TEST ") ;task_id = tk_cre_tsk ( & ctsk );ただし、C言語の関数でこの文字列を扱う場合には、文字列の終端を表す ’\0’ を補う必要がある。

μT-Kernel 3.0仕様書

392 / 487

5.9.2 高速ロック・マルチロックライブラリ
高速ロック・マルチロックライブラリは、デバイスドライバやサブシステムの中において、複数タスク間の排他制御をより高速に行うためのライブラリである。排他制御を行うには、セマフォやミューテックスを使うこともできるが、高速ロックはμT-Kernel/
SMのライブラリ関数として実装されており、待ちに入らない場合のロック獲得の操作を特に高速に処理する。
高速ロック・マルチロックライブラリのうち、高速ロックは、セマフォやミューテックスよりも高速な排他制御用バイナリセマフォである。一方の高速マルチロックは、独立した排他制御用バイナリセマフォを複数個あわせて一つのオブジェクトにしたものである。バイナリセマフォの数はUINT型のビット幅に一致するものとし、0番〜(UINT型のビット幅 - 1)番のロック番号で区別する。
たとえば10箇所で排他制御を行う場合、10個の高速ロックを使う方法でもよいが、1個の高速マルチロックを生成し、その中の0番〜9番を使って排他制御を行う方法も可能である。前者の方がより高速になるが、必要リソースの合計は後者の方が少なくて済む。
補足事項
高速ロックの機能は、ロックの状態を示すカウンタとセマフォにより実装される。また、高速マルチロックの機能は、ロックの状態を示すカウンタとイベントフラグにより実装される。ロック獲得時に待ちに入らない場合は、カウンタ操作のみを行うた
め、通常のセマフォやイベントフラグよりも高速に処理される。一方、ロック獲得時に待ちに入る場合は、通常のセマフォやイベントフラグの機能を使って待ち状態への移行や待ち行列の管理を行うため、セマフォやイベントフラグより高速というわけではない。高速ロック・マルチロックの機能が有効なのは、排他制御の際に待ちに入る可能性が低い場合である。

μT-Kernel 3.0仕様書

5.9.2.1

393 / 487

CreateLock - 高速ロックの生成

C言語インタフェース#include <tk/tkernel.h>ER ercd = CreateLock(FastLock *lock, CONST UB *name);
パラメータ
FastLock*
CONST UB*

lock
name

Control Block of FastLock
Name of FastLock

高速ロックの管理ブロック
高速ロックの名前

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコード
E_OK
E_NOMEM
E_LIMIT

正常終了
メモリ不足(管理ブロック用の領域が確保できない)
高速ロックの数がシステムの上限を超えた

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
高速ロックを生成する。
lock は高速ロックの管理のための構造体である。name は高速ロックに付ける名前であるが、NULL でもよい。
高速ロックは排他制御のためのバイナリセマフォであり、なるべく高速に操作できるように実装されている。

μT-Kernel 3.0仕様書

5.9.2.2

394 / 487

DeleteLock - 高速ロックの削除

C言語インタフェース#include <tk/tkernel.h>void DeleteLock(FastLock *lock);
パラメータ
FastLock*lock

Control Block of FastLock

高速ロックの管理ブロック

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部○
関連するサービスプロファイル
なし
解説
高速ロックを削除する。
高速化のため、エラーの検出は行わない。

準タスク部
○

タスク独立部×μT-Kernel 3.0仕様書

5.9.2.3

395 / 487

Lock - 高速ロックのロック操作

C言語インタフェース#include <tk/tkernel.h>void Lock(FastLock *lock);
パラメータ
FastLock*lock

Control Block of FastLock

高速ロックの管理ブロック

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
高速ロックに対してロックの操作を行う。
既にロックされていれば、ロック解除されるまで自タスクは待ち状態となり、待ち行列につながれる。待ち行列はタスク優先度順である。
高速化のため、エラーの検出は行わない。

μT-Kernel 3.0仕様書

5.9.2.4

396 / 487

Unlock - 高速ロックのロック解除操作

C言語インタフェース#include <tk/tkernel.h>void Unlock(FastLock *lock);
パラメータ
FastLock*lock

Control Block of FastLock

高速ロックの管理ブロック

リターンパラメータなし
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
高速ロックに対してロック解除の操作を行う。
対象となる高速ロックを待っているタスクがあれば、待ち行列の先頭のタスクが新たにロックを獲得する。
高速化のため、エラーの検出は行わない。

μT-Kernel 3.0仕様書

5.9.2.5

397 / 487

CreateMLock - 高速マルチロックの生成

C言語インタフェース#include <tk/tkernel.h>ER ercd = CreateMLock(FastMLock *lock, CONST UB *name);
パラメータ
FastMLock*
CONST UB*

lock
name

Control Block of FastMLockName of FastMLock

高速マルチロックの管理ブロック
高速マルチロックの名前

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコード
E_OK
E_NOMEM
E_LIMIT

正常終了
メモリ不足(管理ブロック用の領域が確保できない)
高速マルチロックの数がシステムの上限を超えた

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
高速マルチロックを生成する。
lock は高速マルチロックの管理のための構造体である。name は高速マルチロックに付ける名前であるが、NULL でもよい。
高速マルチロックは、排他制御のための独立したバイナリセマフォを複数個並べたものであり、なるべく高速に操作できるように実装されている。バイナリセマフォの数はUINT型のビット幅に一致するものとし、0番から(UINT型のビット幅 - 1)番のロッ
ク番号により指定する。例えばUINTが16ビットの環境では、0番〜15番のロック番号が指定できる。
移植ガイドライン
指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。

μT-Kernel 3.0仕様書

5.9.2.6

398 / 487

DeleteMLock - 高速マルチロックの削除

C言語インタフェース#include <tk/tkernel.h>ER ercd = DeleteMLock(FastMLock *lock);
パラメータ
FastMLock*lock

Control Block of FastMLock

高速マルチロックの管理ブロック

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコード
E_OK
E_PAR

正常終了
パラメータエラー

利用可能なコンテキスト
タスク部○
関連するサービスプロファイル
なし
解説
高速マルチロックを削除する。

準タスク部
○

タスク独立部×μT-Kernel 3.0仕様書

5.9.2.7

399 / 487

MLock - 高速マルチロックのロック操作

C言語インタフェース#include <tk/tkernel.h>ER ercd = MLock(FastMLock *lock, INT no);パラメータ
FastMLock*
INT

lock
no

Control Block of FastMLock
Lock Number

高速マルチロックの管理ブロック
ロック番号

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコード
E_OK
E_PAR
E_DLT
E_RLWAI
E_CTX

正常終了
パラメータエラー
待ちオブジェクトが削除された
待ち状態強制解除
コンテキストエラー

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
高速マルチロックに対してロックの操作を行う。
no はロック番号で、0〜(UINT型のビット幅 - 1)を使用できる。例えばUINTが16ビットの環境では、0番〜15番のロック番号が指定できる。
既に同じロック番号でロックされていれば、同じロック番号でロック解除されるまで自タスクは待ち状態となり、待ち行列につながれる。待ち行列はタスク優先度順である。
移植ガイドライン
指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。

μT-Kernel 3.0仕様書

5.9.2.8

400 / 487

MLockTmo - 高速マルチロックのロック操作(タイムアウト指定付き)

C言語インタフェース#include <tk/tkernel.h>ER ercd = MLockTmo(FastMLock *lock, INT no, TMO tmout);
パラメータ
FastMLock*
INT
TMO

lock
no
tmout

Control Block of FastMLock
Lock Number
Timeout

高速マルチロックの管理ブロック
ロック番号
タイムアウト指定(ミリ秒)

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコード
E_OK
E_PAR
E_DLT
E_RLWAIE_TMOUT
E_CTX

正常終了
パラメータエラー
待ちオブジェクトが削除された
待ち状態強制解除
タイムアウト
コンテキストエラー

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
高速マルチロックに対して、タイムアウト指定付きのロックの操作を行う。
tmout でタイムアウト時間の指定ができる点以外は、MLock と同じである。tmout で指定した時間が経過してもロックの獲得ができない場合は、E_TMOUT を返す。
移植ガイドライン
指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。

μT-Kernel 3.0仕様書

5.9.2.9401 / 487

MLockTmo_u - 高速マルチロックのロック操作(タイムアウト指定付き、マイクロ秒単位)

C言語インタフェース#include <tk/tkernel.h>ER ercd = MLockTmo_u(FastMLock *lock, INT no, TMO_U tmout_u);
パラメータ
FastMLock*
INT
TMO_U

lock
no
tmout_u

Control Block of FastMLock
Lock Number
Timeout

高速マルチロックの管理ブロック
ロック番号
タイムアウト指定(マイクロ秒)

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコード
E_OK
E_PAR
E_DLT
E_RLWAIE_TMOUT
E_CTX

正常終了
パラメータエラー
待ちオブジェクトが削除された
待ち状態強制解除
タイムアウト
コンテキストエラー

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。
TK_SUPPORT_USEC

マイクロ秒のサポート

解説
高速マルチロックに対して、マイクロ秒単位のタイムアウト指定付きのロックの操作を行う。
タイムアウト時間の指定が64ビットのマイクロ秒単位になる点以外は、MLockTmo と同じである。
移植ガイドライン
指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。

μT-Kernel 3.0仕様書

402 / 487

5.9.2.10 MUnlock - 高速マルチロックのロック解除操作
C言語インタフェース#include <tk/tkernel.h>ER ercd = MUnlock(FastMLock *lock, INT no);パラメータ
FastMLock*
INT

lock
no

Control Block of FastMLock
Lock Number

高速マルチロックの管理ブロック
ロック番号

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコードE_OK

正常終了

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部×

関連するサービスプロファイル
なし
解説
高速マルチロックに対してロック解除操作を行う。
no はロック番号で、0〜(UINT型のビット幅 - 1)を使用できる。例えばUINTが16ビットの環境では、0番〜15番のロック番号が指定できる。
同じロック番号に対して待ち状態のタスクがあれば、待ち行列の先頭のタスクが新たにロックを獲得する。
移植ガイドライン
指定可能なロック番号はUINT型のビット幅に依存するため注意が必要である。たとえば16ビット環境ではバイナリセマフォの数が0〜15の範囲に限られる。

μT-Kernel 3.0仕様書

403 / 487

第6章

μT-Kernel/DSの機能
この章では、μT-Kernel/DS(Debugger Support)で提供している機能の詳細について説明を行う。
μT-Kernel/DSは、デバッガがμT-Kernelの内部状態の参照や実行のトレースを行うための機能を提供するものである。
μT-Kernel/DSの提供する機能は、デバッガ専用であり、一般のアプリケーション等からは使用しない。
全般的な注意・補足事項• μT-Kernel/DSのシステムコール(td_〜)は、特に明記されているものを除き、タスク独立部およびディスパッチ禁止中・割込み禁止中からも呼び出すことができる。
ただし、実装によっては機能が制限される場合がある。
• μT-Kernel/DSのシステムコール(td_〜)を割込み禁止状態で呼び出した場合、割込み許可されることなく処理される。
同様に、カーネルのその他の状態も変化させない。割込み許可状態やディスパッチ許可状態で呼び出された場合は、カーネルの動作も継続されるため、カーネルの状態は変化する場合がある。
• μT-Kernel/DSのシステムコール(td_〜)は、μT-Kernel/OSのシステムコールの呼出可能な保護レベルより低い保護
レベル(TSVCLimit より低い保護レベル)から呼び出すことはできない(E_OACV)。
• 常に発生する可能性のあるエラー E_PAR, E_MACV, E_CTX などは、特に説明を必要とする場合以外は省略している。

μT-Kernel 3.0仕様書

404 / 487

6.1 カーネル内部状態取得機能
カーネル内部状態取得機能は、デバッガがカーネルの内部状態を取得するための機能である。オブジェクトの一覧を取得する機能、タスクの優先順位を取得する機能、待ち行列に並んだタスクの並び順を取得する機能、オブジェクトやシステムやタス
クレジスタの状態を取得する機能、および時刻を取得する機能が含まれる。

μT-Kernel 3.0仕様書

405 / 487

6.1.1 td_lst_tsk - タスクIDのリスト参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_lst_tsk(ID list[], INT nent);
パラメータ
ID
INT

list[]
nent

List
Number of List Entries

タスクIDを格納する領域
list に格納可能な最大数

Count
Error Code使用されているタスクの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
現在使用されているタスクIDのリストを取得し、list へ最大 nent 個分のタスクIDを格納する。戻値に、使用されているタスクの個数を返す。戻値 > nent であれば、すべてのタスクIDは取得できていないことを示す。

μT-Kernel 3.0仕様書

406 / 487

6.1.2 td_lst_sem - セマフォIDのリスト参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_lst_sem(ID list[], INT nent);
パラメータ
ID
INT

list[]
nent

List
Number of List Entries

セマフォIDを格納する領域
list に格納可能な最大数

Count
Error Code使用されているセマフォの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
現在使用されているセマフォIDのリストを取得し、list へ最大 nent 個分のセマフォIDを格納する。戻値に、使用されている
セマフォの個数を返す。戻値 > nent であれば、すべてのセマフォIDは取得できていないことを示す。

μT-Kernel 3.0仕様書

407 / 487

6.1.3 td_lst_flg - イベントフラグIDのリスト参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_lst_flg(ID list[], INT nent);
パラメータ
ID
INT

list[]
nent

List
Number of List Entries

イベントフラグIDを格納する領域
list に格納可能な最大数

Count
Error Code使用されているイベントフラグの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
現在使用されているイベントフラグIDのリストを取得し、list へ最大 nent 個分のイベントフラグIDを格納する。戻値に、使用されているイベントフラグの個数を返す。戻値 > nent であれば、すべてのイベントフラグIDは取得できていないことを示す。

μT-Kernel 3.0仕様書

408 / 487

6.1.4 td_lst_mbx - メールボックスIDのリスト参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_lst_mbx(ID list[], INT nent);
パラメータ
ID
INT

list[]
nent

List
Number of List Entries

メールボックスIDを格納する領域
list に格納可能な最大数

Count
Error Code使用されているメールボックスの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
現在使用されているメールボックスIDのリストを取得し、list へ最大 nent 個分のメールボックスIDを格納する。戻値に、使用されているメールボックスの個数を返す。戻値 > nent であれば、すべてのメールボックスIDは取得できていないことを示す。

μT-Kernel 3.0仕様書

409 / 487

6.1.5 td_lst_mtx - ミューテックスIDのリスト参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_lst_mtx(ID list[], INT nent);
パラメータ
ID
INT

list[]
nent

List
Number of List Entries

ミューテックスIDを格納する領域
list に格納可能な最大数

Count
Error Code使用されているミューテックスの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
現在使用されているミューテックスIDのリストを取得し、list へ最大 nent 個分のミューテックスIDを格納する。戻値に、使用されているミューテックスの個数を返す。戻値 > nent であれば、すべてのミューテックスIDは取得できていないことを示す。

μT-Kernel 3.0仕様書

410 / 487

6.1.6 td_lst_mbf - メッセージバッファIDのリスト参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_lst_mbf(ID list[], INT nent);
パラメータ
ID
INT

list[]
nent

List
Number of List Entries

メッセージバッファIDを格納する領域
list に格納可能な最大数

Count
Error Code使用されているメッセージバッファの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
現在使用されているメッセージバッファIDのリストを取得し、list へ最大 nent 個分のメッセージバッファIDを格納する。戻値に、使用されているメッセージバッファの個数を返す。戻値 > nent であれば、すべてのメッセージバッファIDは取得できていないことを示す。

μT-Kernel 3.0仕様書

411 / 487

6.1.7 td_lst_mpf - 固定長メモリプールIDのリスト参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_lst_mpf(ID list[], INT nent);
パラメータ
ID
INT

list[]
nent

List
Number of List Entries

固定長メモリプールIDを格納する領域
list に格納可能な最大数

Count
Error Code使用されている固定長メモリプールの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
現在使用されている固定長メモリプールIDのリストを取得し、list へ最大 nent 個分の固定長メモリプールIDを格納する。戻値に、使用されている固定長メモリプールの個数を返す。戻値 > nent であれば、すべての固定長メモリプールIDは取得できていないことを示す。

μT-Kernel 3.0仕様書

412 / 487

6.1.8 td_lst_mpl - 可変長メモリプールIDのリスト参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_lst_mpl(ID list[], INT nent);
パラメータ
ID
INT

list[]
nent

List
Number of List Entries

可変長メモリプールIDを格納する領域
list に格納可能な最大数

Count
Error Code使用されている可変長メモリプールの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
現在使用されている可変長メモリプールIDのリストを取得し、list へ最大 nent 個分の可変長メモリプールIDを格納する。戻値に、使用されている可変長メモリプールの個数を返す。戻値 > nent であれば、すべての可変長メモリプールIDは取得できていないことを示す。

μT-Kernel 3.0仕様書

413 / 487

6.1.9 td_lst_cyc - 周期ハンドラIDのリスト参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_lst_cyc(ID list[], INT nent);
パラメータ
ID
INT

list[]
nent

List
Number of List Entries

周期ハンドラIDを格納する領域
list に格納可能な最大数

Count
Error Code使用されている周期ハンドラの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
現在使用されている周期ハンドラIDのリストを取得し、list へ最大 nent 個分の周期ハンドラIDを格納する。戻値に、使用されている周期ハンドラの個数を返す。戻値 > nent であれば、すべての周期ハンドラIDは取得できていないことを示す。

μT-Kernel 3.0仕様書

414 / 487

6.1.10 td_lst_alm - アラームハンドラIDのリスト参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_lst_alm(ID list[], INT nent);
パラメータ
ID
INT

list[]
nent

List
Number of List Entries

アラームハンドラIDを格納する領域
list に格納可能な最大数

Count
Error Code使用されているアラームハンドラの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
現在使用されているアラームハンドラIDのリストを取得し、list へ最大 nent 個分のアラームハンドラIDを格納する。戻値に、使用されているアラームハンドラの個数を返す。戻値 > nent であれば、すべてのアラームハンドラIDは取得できていないことを示す。

μT-Kernel 3.0仕様書

415 / 487

6.1.11 td_lst_ssy - サブシステムIDのリスト参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_lst_ssy(ID list[], INT nent);
パラメータ
ID
INT

list[]
nent

List
Number of List Entries

サブシステムIDを格納する領域
list に格納可能な最大数

Count
Error Code使用されているサブシステムの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート
サブシステム管理機能のサポート

解説
現在使用されているサブシステムIDのリストを取得し、list へ最大 nent 個分のサブシステムIDを格納する。戻値に、使用されているサブシステムの個数を返す。戻値 > nent であれば、すべてのサブシステムIDは取得できていないことを示す。

μT-Kernel 3.0仕様書

416 / 487

6.1.12 td_rdy_que - タスクの優先順位の参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_rdy_que(PRI pri, ID list[], INT nent);
パラメータ
PRI
ID
INT

pri
list[]
nent

Task Priority
Task ID List
Number of List Entries

対象タスク優先度
タスクIDを格納する領域
list に格納可能な最大数

Count

優先度 pri の実行できる状態のタスクの個数
エラーコードリターンパラメータ
INT

ct
または

Error Code

エラーコード
E_PAR

パラメータエラー(pri が不正あるいは利用できない値)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
実行できる状態(実行可能状態および実行状態)のタスクのうち、優先度が pri であるものを、優先順位の高い順に一列に並べ、その並び順にタスクIDのリストを取得する。
list には、優先順位が最高のものを先頭としてその並び順に、タスクIDが最大 nent 個まで格納される。
戻値には、pri の優先度を持つ実行できる状態のタスクの個数を返す。戻値 > nent であれば、すべてのタスクIDは取得できていないことを示す。

μT-Kernel 3.0仕様書

417 / 487

6.1.13 td_sem_que - セマフォの待ち行列の参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_sem_que(ID semid, ID list[], INT nent);
パラメータ
ID
ID
INT

semid
list[]
nent

Semaphore ID
Task ID List
Number of List Entries

対象セマフォID
待ちタスクのタスクIDを格納する領域
list に格納可能な最大数

Count
Error Code

待ちタスクの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコード
E_ID
E_NOEXS

ID番号が不正(semid が不正あるいは利用できない)
対象オブジェクトが存在しない(semid のセマフォが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
semid で指定したセマフォの待ち行列に並んでいるタスクのIDのリストを取得する。list には、セマフォの待ち行列の先頭からその並び順にタスクIDが最大 nent 個まで格納される。戻値には、セマフォの待ち行列に並んでいるタスクの個数を返す。
戻値 > nent であれば、すべてのタスクIDは取得できないことを示す。

μT-Kernel 3.0仕様書

418 / 487

6.1.14 td_flg_que - イベントフラグの待ち行列の参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_flg_que(ID flgid, ID list[], INT nent);
パラメータ
ID
ID
INT

flgid
list[]
nent

EventFlag ID
Task ID List
Number of List Entries

対象イベントフラグID
待ちタスクのタスクIDを格納する領域
list に格納可能な最大数

Count
Error Code

待ちタスクの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコード
E_ID
E_NOEXS

ID番号が不正(flgid が不正あるいは利用できない)
対象オブジェクトが存在しない(flgid のイベントフラグが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
flgid で指定したイベントフラグの待ち行列に並んでいるタスクのIDのリストを取得する。list には、イベントフラグの待ち行
列の先頭からその並び順にタスクIDが最大 nent 個まで格納される。戻値には、イベントフラグの待ち行列に並んでいるタス
クの個数を返す。戻値 > nent であれば、すべてのタスクIDは取得できないことを示す。

μT-Kernel 3.0仕様書

419 / 487

6.1.15 td_mbx_que - メールボックスの待ち行列の参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_mbx_que(ID mbxid, ID list[], INT nent);
パラメータ
ID
ID
INT

mbxid
list[]
nent

Mailbox ID
Task ID List
Number of List Entries

対象メールボックスID
待ちタスクのタスクIDを格納する領域
list に格納可能な最大数

Count
Error Code

待ちタスクの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコード
E_ID
E_NOEXS

ID番号が不正(mbxid が不正あるいは利用できない)
対象オブジェクトが存在しない(mbxid のメールボックスが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
mbxid で指定したメールボックスの待ち行列に並んでいるタスクのIDのリストを取得する。list には、メールボックスの待ち行
列の先頭からその並び順にタスクIDが最大 nent 個まで格納される。戻値には、メールボックスの待ち行列に並んでいるタス
クの個数を返す。戻値 > nent であれば、すべてのタスクIDは取得できないことを示す。

μT-Kernel 3.0仕様書

420 / 487

6.1.16 td_mtx_que - ミューテックスの待ち行列の参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_mtx_que(ID mtxid, ID list[], INT nent);
パラメータ
ID
ID
INT

mtxid
list[]
nent

Mutex ID
Task ID List
Number of List Entries

対象ミューテックスID
待ちタスクのタスクIDを格納する領域
list に格納可能な最大数

Count
Error Code

待ちタスクの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコード
E_ID
E_NOEXS

ID番号が不正(mtxid が不正あるいは利用できない)
対象オブジェクトが存在しない(mtxid のミューテックスが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
mtxid で指定したミューテックスの待ち行列に並んでいるタスクのIDのリストを取得する。list には、ミューテックスの待ち行
列の先頭からその並び順にタスクIDが最大 nent 個まで格納される。戻値には、ミューテックスの待ち行列に並んでいるタス
クの個数を返す。戻値 > nent であれば、すべてのタスクIDは取得できないことを示す。

μT-Kernel 3.0仕様書

421 / 487

6.1.17 td_smbf_que - メッセージバッファの送信待ち行列の参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_smbf_que(ID mbfid, ID list[], INT nent);
パラメータ
ID
ID
INT

mbfid
list[]
nent

Message Buffer ID
Task ID List
Number of List Entries

対象メッセージバッファID
待ちタスクのタスクIDを格納する領域
list に格納可能な最大数

Count
Error Code

待ちタスクの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコード
E_ID
E_NOEXS

ID番号が不正(mbfid が不正あるいは利用できない)
対象オブジェクトが存在しない(mbfid のメッセージバッファが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
mbfid で指定したメッセージバッファの送信待ち行列に並んでいるタスクのIDのリストを取得する。list には、メッセージバッ
ファの送信待ち行列の先頭からその並び順にタスクIDが最大 nent 個まで格納される。戻値には、メッセージバッファの送信待ち行列に並んでいるタスクの個数を返す。戻値 > nent であれば、すべてのタスクIDは取得できないことを示す。

μT-Kernel 3.0仕様書

422 / 487

6.1.18 td_rmbf_que - メッセージバッファの受信待ち行列の参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_rmbf_que(ID mbfid, ID list[], INT nent);
パラメータ
ID
ID
INT

mbfid
list[]
nent

Message Buffer ID
Task ID List
Number of List Entries

対象メッセージバッファID
待ちタスクのタスクIDを格納する領域
list に格納可能な最大数

Count
Error Code

待ちタスクの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコード
E_ID
E_NOEXS

ID番号が不正(mbfid が不正あるいは利用できない)
対象オブジェクトが存在しない(mbfid のメッセージバッファが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
mbfid で指定したメッセージバッファの受信待ち行列に並んでいるタスクのIDのリストを取得する。list には、メッセージバッ
ファの受信待ち行列の先頭からその並び順にタスクIDが最大 nent 個まで格納される。戻値には、メッセージバッファの受信待ち行列に並んでいるタスクの個数を返す。戻値 > nent であれば、すべてのタスクIDは取得できないことを示す。

μT-Kernel 3.0仕様書

423 / 487

6.1.19 td_mpf_que - 固定長メモリプールの待ち行列の参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_mpf_que(ID mpfid, ID list[], INT nent);
パラメータ
ID
ID
INT

mpfid
list[]
nent

Memory Pool ID
Task ID List
Number of List Entries

対象固定長メモリプールID
待ちタスクのタスクIDを格納する領域
list に格納可能な最大数

Count
Error Code

待ちタスクの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコード
E_ID
E_NOEXS

ID番号が不正(mpfid が不正あるいは利用できない)
対象オブジェクトが存在しない(mpfid の固定長メモリプールが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
mpfid で指定した固定長メモリプールの待ち行列に並んでいるタスクのIDのリストを取得する。list には、固定長メモリプー
ルの待ち行列の先頭からその並び順にタスクIDが最大 nent 個まで格納される。戻値には、固定長メモリプールの待ち行列に並んでいるタスクの個数を返す。戻値 > nent であれば、すべてのタスクIDは取得できないことを示す。

μT-Kernel 3.0仕様書

424 / 487

6.1.20 td_mpl_que - 可変長メモリプールの待ち行列の参照
C言語インタフェース#include <tk/dbgspt.h>
INT ct = td_mpl_que(ID mplid, ID list[], INT nent);
パラメータ
ID
ID
INT

mplid
list[]
nent

Memory Pool ID
Task ID List
Number of List Entries

対象可変長メモリプールID
待ちタスクのタスクIDを格納する領域
list に格納可能な最大数

Count
Error Code

待ちタスクの個数
エラーコードリターンパラメータ
INT

ct
または

エラーコード
E_ID
E_NOEXS

ID番号が不正(mplid が不正あるいは利用できない)
対象オブジェクトが存在しない(mplid の可変長メモリプールが存在しない)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
mplid で指定した可変長メモリプールの待ち行列に並んでいるタスクのIDのリストを取得する。list には、可変長メモリプー
ルの待ち行列の先頭からその並び順にタスクIDが最大 nent 個まで格納される。戻値には、可変長メモリプールの待ち行列に並んでいるタスクの個数を返す。戻値 > nent であれば、すべてのタスクIDは取得できないことを示す。

μT-Kernel 3.0仕様書

425 / 487

6.1.21 td_ref_tsk - タスク状態参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_tsk(ID tskid, TD_RTSK *rtsk);
パラメータ
ID
TD_RTSK*

tskid
rtsk

Task ID
Packet to Refer Task Status

対象タスクID(TSK_SELF 可)
タスク状態を返す領域へのポインタ

ercd

Error Code

エラーコードexinf
tskpritskbpritskstattskwaitwid
wupcntsuscntwaitmask
texmask
tskeventtask
stksz
sstkszistackisstack

Extended Information
Task Priority
Task Base Priority
Task State
Task Wait Factor
Waiting Object ID
Wakeup Count
Suspend Count
Wait Mask
Task Exception Mask
Task Event
Task Start Address
User Stack Size
System Stack Size
Initial User Stack Pointer
Initial System Stack Pointer

拡張情報
現在の優先度
ベース優先度
タスク状態
待ち要因
待ちオブジェクトID
起床要求キューイング数
強制待ち要求ネスト数待ちを禁止されている待ち要因
許可されているタスク例外
発生しているタスクイベント
タスク起動アドレス
ユーザスタックサイズ(バイト数)
システムスタックサイズ(バイト数)
ユーザスタックポインタ初期値
システムスタックポインタ初期値

リターンパラメータER
rtsk の内容
void*
PRI
PRI
UINT
UW
ID
INT
INT
UW
UINT
UINT
FP
SZ
SZ
void*
void*

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
ID番号が不正対象オブジェクトが存在しない

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel 3.0仕様書

TK_SUPPORT_DBGSPT

426 / 487

μT-Kernel/DSのサポート

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

待ち禁止状態に関する情報(waitmask)の取得が可能
タスク例外情報(texmask)の取得が可能
タスクイベント発生情報(tskevent)の取得が可能
タスクがユーザスタックとは独立したシステムスタックを持ち、ユーザスタ
ックに加えてシステムスタックに対する情報(sstksz, isstack)の取得が可能

解説
タスクの状態を参照する。tk_ref_tsk と同等だが、タスク起動アドレスおよびスタックに関する情報が追加されている。
スタック領域は、スタックポインタ初期値の位置から低位アドレス(値の小さい方)へ向かって、スタックサイズ分となる。
• istack－stksz ≦ ユーザスタック領域 ＜ istack• isstack－sstksz ≦ システムスタック領域 ＜ isstack
なお、スタックポインタ初期値(istack, isstack)は、スタックポインタの現在位置ではない。タスク起動前の状態であっても、スタック領域は使用されている場合がある。スタックポインタの現在位置を得るには、td_get_reg を用いる。

μT-Kernel 3.0仕様書

427 / 487

6.1.22 td_ref_tex - タスク例外の状態参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_tex(ID tskid, TD_RTEX *pk_rtex);
パラメータ
ID
TD_RTEX*

tskid
pk_rtex

Task ID
Packet to Refer Task
Exception Status

対象タスクID(TSK_SELF 可)タスク例外状態を返す領域へのポインタ

ercd

Error Code

エラーコードpendtextexmask

Pending Task Exception
Task Exception Mask

発生しているタスク例外
許可されているタスク例外

リターンパラメータ
ER
pk_rtex の内容
UINT
UINT

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
ID番号が不正対象オブジェクトが存在しない

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート
タスク例外処理機能のサポート

解説
タスク例外の状態を参照する。tk_ref_tex と同等。

μT-Kernel 3.0仕様書

428 / 487

6.1.23 td_ref_sem - セマフォ状態参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_sem(ID semid, TD_RSEM *rsem);
パラメータ
ID
TD_RSEM*

semid
rsem

Semaphore ID
Packet to Refer Semaphore
Status

対象セマフォID
セマフォ状態を返す領域へのポインタ

ercd

Error Code

エラーコード

exinf
wtsk
semcntExtended Information
Waiting Task ID
Semaphore Count

拡張情報
待ちタスクのID
現在のセマフォカウント値

リターンパラメータERrsem の内容
void*
ID
INT

エラーコード正常終了
ID番号が不正対象オブジェクトが存在しない

E_OK
E_ID
E_NOEXS
利用可能なコンテキスト

タスク部
○

準タスク部
○

タスク独立部○

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

解説
セマフォの状態を参照する。tk_ref_sem と同等。

μT-Kernel/DSのサポート

μT-Kernel 3.0仕様書

429 / 487

6.1.24 td_ref_flg - イベントフラグ状態参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_flg(ID flgid, TD_RFLG *rflg);
パラメータ
ID
TD_RFLG*

flgid
rflg

EventFlag ID
Packet to Refer EventFlag
Status

対象イベントフラグID
イベントフラグ状態を返す領域への
ポインタ

ercd

Error Code

エラーコード

exinf
wtsk
flgptnExtended Information
Waiting Task ID
EventFlag Bit Pattern

拡張情報
待ちタスクのID
現在のイベントフラグのビットパター
ン

リターンパラメータER
rflg の内容
void*
ID
UINT

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
ID番号が不正対象オブジェクトが存在しない

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
イベントフラグの状態を参照する。tk_ref_flg と同等。

μT-Kernel 3.0仕様書

430 / 487

6.1.25 td_ref_mbx - メールボックス状態参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_mbx(ID mbxid, TD_RMBX *rmbx);
パラメータ
ID
TD_RMBX*

mbxid
rmbx

Mailbox ID
Packet to Refer Mailbox Status

対象メールボックスID
メールボックス状態を返す領域への
ポインタ

ercd

Error Code

エラーコード

exinf
wtsk
pk_msgExtended Information
Waiting Task ID
Packet of Message

拡張情報
待ちタスクのID
次に受信されるメッセージ

リターンパラメータERrmbx の内容
void*
ID
T_MSG*

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
ID番号が不正対象オブジェクトが存在しない

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
メールボックスの状態を参照する。tk_ref_mbx と同等。

μT-Kernel 3.0仕様書

431 / 487

6.1.26 td_ref_mtx - ミューテックス状態参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_mtx(ID mtxid, TD_RMTX *rmtx);
パラメータ
ID
TD_RMTX*

mtxid
rmtx

Mutex ID
Packet to Refer Mutex Status

対象ミューテックスID
ミューテックス状態を返す領域への
ポインタ

ercd

Error Code

エラーコード

exinf
htsk
wtsk

Extended Information
Locking Task ID
Lock Waiting Task ID

拡張情報
ロックしているタスクのID
ロック待ちタスクのID

リターンパラメータERrmtx の内容
void*
ID
ID

エラーコード正常終了
ID番号が不正対象オブジェクトが存在しない

E_OK
E_ID
E_NOEXS
利用可能なコンテキスト

タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
ミューテックスの状態を参照する。tk_ref_mtx と同等。

μT-Kernel 3.0仕様書

432 / 487

6.1.27 td_ref_mbf - メッセージバッファ状態参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_mbf(ID mbfid, TD_RMBF *rmbf);
パラメータ
ID
TD_RMBF*

mbfid
rmbf

Message Buffer ID
Packet to Refer Message
Buffer Status

対象メッセージバッファID
メッセージバッファ状態を返す領域へのポ
インタ

ercd

Error Code

エラーコード

void*
ID
ID
INT

exinf
wtsk
stsk
msgsz

Extended Information
Waiting Task ID
Send Waiting Task ID
Message Size

SZ
INT

frbufsz
maxmszFree Buffer Size
Maximum Message Size

拡張情報
受信待ちタスクのID
送信待ちタスクのID
次に受信されるメッセージのサイズ(バイト数)
空きバッファのサイズ(バイト数)
メッセージの最大長(バイト数)

リターンパラメータER
rmbf の内容

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
ID番号が不正対象オブジェクトが存在しない

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
メッセージバッファの状態を参照する。tk_ref_mbf と同等。

μT-Kernel 3.0仕様書

433 / 487

6.1.28 td_ref_mpf - 固定長メモリプール状態参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_mpf(ID mpfid, TD_RMPF *rmpf);
パラメータ
ID
TD_RMPF*

mpfid
rmpf

Memory Pool ID
Packet to Refer Memory Pool
Status

対象固定長メモリプールID
メモリプール状態を返す領域へのポインタ

ercd

Error Code

エラーコード

exinf
wtsk
frbcntExtended Information
Waiting Task ID
Free Block Count

拡張情報
待ちタスクのID
空き領域のブロック数

リターンパラメータER
rmpf の内容
void*
ID
SZ

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
ID番号が不正対象オブジェクトが存在しない

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
固定長メモリプールの状態を参照する。tk_ref_mpf と同等。

μT-Kernel 3.0仕様書

434 / 487

6.1.29 td_ref_mpl - 可変長メモリプール状態参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_mpl(ID mplid, TD_RMPL *rmpl);
パラメータ
ID
TD_RMPL*

mplid
rmpl

Memory Pool ID
Packet to Refer Memory Pool
Status

対象可変長メモリプールID
メモリプール状態を返す領域へのポインタ

ercd

Error Code

エラーコード

exinf
wtsk
frsz
maxsz

Extended Information
Waiting Task ID
Free Memory Size
Max Memory Size

拡張情報
待ちタスクのID
空き領域の合計サイズ(バイト数)
最大の空き領域のサイズ(バイト数)

リターンパラメータER
rmpl の内容
void*
ID
SZ
SZ

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
ID番号が不正対象オブジェクトが存在しない

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
可変長メモリプールの状態を参照する。tk_ref_mpl と同等。

μT-Kernel 3.0仕様書

435 / 487

6.1.30 td_ref_cyc - 周期ハンドラ状態参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_cyc(ID cycid, TD_RCYC *rcyc);
パラメータ
ID
TD_RCYC*

cycid
rcyc

Cyclic Handler ID
Packet to Refer Cyclic
Handler Status

対象周期ハンドラID
周期ハンドラの状態を返す領域へのポイ
ンタ

ercd

Error Code

エラーコードexinf
lfttimcycstatExtended Information
Left Time
Cyclic Handler Status

拡張情報
次のハンドラ起動までの残り時間(ミリ秒)
周期ハンドラの状態

リターンパラメータERrcyc の内容
void*
RELTIM
UINT

エラーコード正常終了
ID番号が不正対象オブジェクトが存在しない

E_OK
E_ID
E_NOEXS
利用可能なコンテキスト

タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
周期ハンドラの状態を参照する。tk_ref_cyc と同等。
td_ref_cyc で取得する周期ハンドラ状態情報(TD_RCYC)における残り時間 lfttim は、ミリ秒単位に切り上げた値(単位ミリ秒)を返す。マイクロ秒単位の情報を知りたい場合には、td_ref_cyc_u を使う。

μT-Kernel 3.0仕様書

436 / 487

6.1.31 td_ref_cyc_u - 周期ハンドラ状態参照(マイクロ秒単位)
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_cyc_u(ID cycid, TD_RCYC_U *rcyc_u);
パラメータ
ID
TD_RCYC_U*

cycid
rcyc_uCyclic Handler ID
Packet to Refer Cyclic
Handler Status

対象周期ハンドラID
周期ハンドラの状態を返す領域へのポイ
ンタ

ercd

Error Code

エラーコードvoid*
RELTIM_U

exinf
lfttim_u

Extended Information
Left Time

UINT

cycstatCyclic Handler Status

拡張情報
次のハンドラ起動までの残り時間(マイクロ秒)
周期ハンドラの状態

リターンパラメータERrcyc_u の内容

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
ID番号が不正対象オブジェクトが存在しない

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート
マイクロ秒のサポート

解説
td_ref_cyc のリターンパラメータである lfttim を64ビットマイクロ秒単位の lfttim_u としたシステムコールである。
リターンパラメータが lfttim_u となった点を除き、本システムコールの仕様は td_ref_cyc と同じである。詳細は td_ref_cycの説明を参照のこと。

μT-Kernel 3.0仕様書

437 / 487

6.1.32 td_ref_alm - アラームハンドラ状態参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_alm(ID almid, TD_RALM *ralm);
パラメータ
ID
TD_RALM*

almid
ralm

Alarm Handler ID
Packet to Refer Alarm
Handler Status

対象アラームハンドラID
アラームハンドラの状態を返す領域へのポ
インタ

ercd

Error Code

エラーコードexinf
lfttimalmstatExtended Information
Left Time
Alarm Handler Status

拡張情報
ハンドラ起動までの残り時間(ミリ秒)
アラームハンドラの状態

リターンパラメータ
ERralm の内容
void*
RELTIM
UINT

エラーコード正常終了
ID番号が不正対象オブジェクトが存在しない

E_OK
E_ID
E_NOEXS
利用可能なコンテキスト

タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
アラームハンドラの状態を参照する。tk_ref_alm と同等。
td_ref_alm で取得するアラームハンドラ状態情報(TD_RALM)における残り時間 lfttim は、ミリ秒単位に切り上げた値(単位ミリ秒)を返す。マイクロ秒単位の情報を知りたい場合には、td_ref_alm_u を使う。

μT-Kernel 3.0仕様書

438 / 487

6.1.33 td_ref_alm_u - アラームハンドラ状態参照(マイクロ秒単位)
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_alm_u(ID almid, TD_RALM_U *ralm_u);
パラメータ
ID
TD_RALM_U*

almid
ralm_uAlarm Handler ID
Packet to Refer Alarm
Handler Status

対象アラームハンドラID
アラームハンドラの状態を返す領域へのポ
インタ

ercd

Error Code

エラーコードexinf
lfttim_u
almstatExtended Information
Left Time
Alarm Handler Status

拡張情報
ハンドラ起動までの残り時間(マイクロ秒)
アラームハンドラの状態

リターンパラメータ
ER
ralm_u の内容
void*
RELTIM_U
UINT

エラーコード正常終了
ID番号が不正対象オブジェクトが存在しない

E_OK
E_ID
E_NOEXS
利用可能なコンテキスト

タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート
マイクロ秒のサポート

解説
td_ref_alm のリターンパラメータである lfttim を64ビットマイクロ秒単位の lfttim_u としたシステムコールである。
リターンパラメータが lfttim_u となった点を除き、本システムコールの仕様は td_ref_alm と同じである。詳細は td_ref_almの説明を参照のこと。

μT-Kernel 3.0仕様書

439 / 487

6.1.34 td_ref_sys - システム状態参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_sys(TD_RSYS *pk_rsys);
パラメータ
TD_RSYS*

pk_rsys

Packet to Refer System
Statusシステム状態を返す領域へのポインタ

ercd

Error Code

エラーコードsysstatruntskidschedtskid

System State
Running Task ID
Scheduled Task ID

システム状態
現在実行状態にあるタスクのID
実行状態にすべきタスクのID

リターンパラメータER
pk_rsys の内容
UINT
ID
ID

エラーコードE_OK

正常終了

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

解説
システムの状態を参照する。tk_ref_sys と同等。

μT-Kernel/DSのサポート

μT-Kernel 3.0仕様書

440 / 487

6.1.35 td_ref_ssy - サブシステム定義情報の参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_ssy(ID ssid, TD_RSSY *rssy);
パラメータ
ID
TD_RSSY*

ssid
rssy

Subsystem ID
Packet to Refer Subsystem

対象サブシステムID
サブシステム定義情報を返す領域へのポ
インタ

ercd

Error Code

エラーコードssypri

Subsystem Priority

サブシステム優先度

リターンパラメータERrssy の内容
PRI

エラーコード
E_OK
E_ID
E_NOEXS

正常終了
ID番号が不正対象オブジェクトが存在しない

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート
サブシステム管理機能のサポート

解説
サブシステムの状態を参照する。tk_ref_ssy と同等。

μT-Kernel 3.0仕様書

441 / 487

6.1.36 td_get_reg - タスクレジスタの参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_get_reg(ID tskid, T_REGS *pk_regs, T_EIT *pk_eit, T_CREGS *pk_cregs);
パラメータ
ID
T_REGS*
T_EIT*

tskid
pk_regs
pk_eitTask ID
Packet of Registers
Packet of EIT Registers

T_CREGS*pk_cregs

Packet of Control Registers

対象タスクのID(TSK_SELF 不可)
汎用レジスタの値を返す領域へのポインタ
例外時に保存されるレジスタの値を返す
領域へのポインタ
制御レジスタの値を返す領域へのポインタ

ercd

Error Code

エラーコードリターンパラメータ
ER

T_REGS, T_EIT, T_CREGSの内容は、CPUおよび実装ごとに定義する。
エラーコード
E_OK
E_ID
E_NOEXS
E_OBJ

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが現在実行状態のタスク)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート
タスクレジスタ取得・設定機能のサポート

解説
タスクのレジスタを参照する。tk_get_reg と同等。
現在実行状態にあるタスクは参照することはできない。タスク独立部の実行中を除けば、現在実行状態のタスクは自タスクである。
pk_regs, pk_eit, pk_cregs は、それぞれ NULL を指定すると、対応するレジスタは参照されない。

μT-Kernel 3.0仕様書

T_REGS, T_EIT, T_CREGSの内容は実装定義である。

442 / 487

μT-Kernel 3.0仕様書

443 / 487

6.1.37 td_set_reg - タスクレジスタの設定
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_set_reg(ID tskid, CONST T_REGS *pk_regs, CONST T_EIT *pk_eit, CONST T_CREGS *pk_cregs);
パラメータ
ID
CONST T_REGS*CONST T_EIT*CONST T_CREGS*

tskid
pk_regs
pk_eitpk_cregs

Task ID
Packet of Registers
Packet of EIT Registers
Packet of Control Registers

対象タスクのID(TSK_SELF 不可)
汎用レジスタ
例外時に保存されるレジスタ
制御レジスタ

T_REGS, T_EIT, T_CREGSの内容は、CPUおよび実装ごとに定義する。
リターンパラメータER

ercd

Error Code

エラーコードエラーコード
E_OK
E_ID
E_NOEXS
E_OBJ

正常終了
不正ID番号(tskid が不正あるいは利用できない)
オブジェクトが存在していない(tskid のタスクが存在しない)
オブジェクトの状態が不正(対象タスクが現在実行状態のタスク)

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート
タスクレジスタ取得・設定機能のサポート

解説
タスクのレジスタを設定する。tk_set_reg と同等。
現在実行状態にあるタスクに設定することはできない。タスク独立部の実行中を除けば、現在実行状態のタスクは自タスクである。
pk_regs, pk_eit, pk_cregs は、それぞれ NULL を指定すると、対応するレジスタは設定されない。
T_REGS, T_EIT, T_CREGS の内容は実装定義である。

μT-Kernel 3.0仕様書

444 / 487

6.1.38 td_get_utc - システム時刻参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_get_utc(SYSTIM *tim, UW *ofs);
パラメータ
SYSTIM* tim
UW*
ofs

Time
Offset現在時刻(ミリ秒)を返す領域へのポインタ
リターンパラメータ ofs を返す領域へのポイ
ンタ

ercd
tim
ofs

Error CodeTime
Offset

エラーコード
現在時刻(ミリ秒)
tim からの相対的な経過時間(ナノ秒)hiloHigh 32bits
Low 32bits

システムの現在時刻の上位32ビットシステムの現在時刻の下位32ビット

リターンパラメータ
ER
SYSTIM
UW
tim の内容
W
UW

エラーコードE_OK

正常終了

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート
UNIX表現のシステム時刻のサポート

解説
現在時刻(1970年1月1日0時0分0秒(UTC)からの通算のミリ秒数)を取得する。tim に返される値は tk_get_utc と同じである。tim は、タイマ割込み間隔(周期)の分解能となるが、さらに細かい精度の時刻情報として tim からの経過時間を ofs に
ナノ秒単位で取得する。ofs の分解能は実装依存であるが、一般にはハードウェアタイマの分解能となる。
tim は、タイマ割込みによってカウントされる時刻であるため、割込み禁止期間中にタイマ割込み周期が来た場合、タイマ割込
みハンドラが起動されず(起動が遅らされ)時刻が更新されないことがある。このような場合、tim には前回のタイマ割込みによμT-Kernel 3.0仕様書

445 / 487って更新された時刻が返され、ofs には前回のタイマ割込みからの経過時間を返す。したがって、ofs はタイマ割込み間隔より長い時間となる場合がある。ofs がどの程度まで長い経過時間を計測できるかはハードウェアなどに依存するが、少なくともタ
イマ割込み間隔の2倍未満(0≦ofs＜タイマ割込み間隔の2倍)の範囲まで計測できることが望ましい。
なお、tim および ofs に返される時刻は、td_get_utc を呼び出してから戻るまでにかかった時間範囲の中のどこかの時点の時刻となる。td_get_utc を呼び出した時点の時刻でも、td_get_utc から戻った時点の時刻でもない。したがって、より正確な情報を得たい場合は、割込み禁止状態で呼び出すべきである。

μT-Kernel 3.0仕様書

446 / 487

6.1.39 td_get_utc_u - システム時刻参照(マイクロ秒単位)
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_get_utc_u(SYSTIM_U *tim_u, UW *ofs);
パラメータ
SYSTIM_U*

tim_u

Time

UW*

ofs

Offset

ercd
tim_u
ofs

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

リターンパラメータ
ER
SYSTIM_U
UW

エラーコード
現在時刻(マイクロ秒)
tim_u からの相対的な経過時間(ナノ秒)

エラーコードE_OK

正常終了

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート
UNIX表現のシステム時刻のサポート
マイクロ秒のサポート

解説
td_get_utc のリターンパラメータである tim を64ビットマイクロ秒単位の tim_u としたシステムコールである。
リターンパラメータが tim_u となった点を除き、本システムコールの仕様は td_get_utc と同じである。詳細は td_get_utc の説明を参照のこと。

μT-Kernel 3.0仕様書

447 / 487

6.1.40 td_get_tim - システム時刻参照(TRON表現)
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_get_tim(SYSTIM *tim, UW *ofs);
パラメータ
SYSTIM* tim
UW*
ofs

Time
Offset現在時刻(ミリ秒)を返す領域へのポインタ
リターンパラメータ ofs を返す領域へのポイ
ンタ

ercd
tim
ofs

Error CodeTime
Offset

エラーコード
現在時刻(ミリ秒)
tim からの相対的な経過時間(ナノ秒)hiloHigh 32bits
Low 32bits

システムの現在時刻の上位32ビットシステムの現在時刻の下位32ビット

リターンパラメータ
ER
SYSTIM
UW
tim の内容
W
UW

エラーコードE_OK

正常終了

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート
TRON表現のシステム時刻のサポート

解説
現在時刻(1985年1月1日0時(GMT)からの通算のミリ秒数)を取得する。tim に返される値は tk_get_tim と同じである。tim
は、タイマ割込み間隔(周期)の分解能となるが、さらに細かい精度の時刻情報として tim からの経過時間を ofs にナノ秒単位で取得する。ofs の分解能は実装依存であるが、一般にはハードウェアタイマの分解能となる。
tim は、タイマ割込みによってカウントされる時刻であるため、割込み禁止期間中にタイマ割込み周期が来た場合、タイマ割込
みハンドラが起動されず(起動が遅らされ)時刻が更新されないことがある。このような場合、tim には前回のタイマ割込みによμT-Kernel 3.0仕様書

448 / 487って更新された時刻が返され、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である。

μT-Kernel 3.0仕様書

449 / 487

6.1.41 td_get_tim_u - システム時刻参照(TRON表現、マイクロ秒単位)
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_get_tim_u(SYSTIM_U *tim_u, UW *ofs);
パラメータ
SYSTIM_U*

tim_u

Time

UW*

ofs

Offset

ercd
tim_u
ofs

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

リターンパラメータ
ER
SYSTIM_U
UW

エラーコード
現在時刻(マイクロ秒)
tim_u からの相対的な経過時間(ナノ秒)

エラーコードE_OK

正常終了

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート
TRON表現のシステム時刻のサポート
マイクロ秒のサポート

解説
td_get_tim のリターンパラメータである tim を64ビットマイクロ秒単位の tim_u としたシステムコールである。
リターンパラメータが tim_u となった点を除き、本システムコールの仕様は td_get_tim と同じである。詳細は td_get_tim の説明を参照のこと。

μT-Kernel 3.0仕様書

450 / 487

6.1.42 td_get_otm - システム稼働時間参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_get_otm(SYSTIM *tim, UW *ofs);
パラメータ
SYSTIM* tim
UW*
ofs

Time
Offset

稼働時間(ミリ秒)を返す領域へのポインタ
リターンパラメータ ofs を返す領域へのポイ
ンタ

ercd
tim
ofs

Error CodeTime
Offset

エラーコード稼働時間(ミリ秒)
tim からの相対的な経過時間(ナノ秒)hiloHigh 32bits
Low 32bits

システム稼働時間の上位32ビット
システム稼働時間の下位32ビット

リターンパラメータ
ER
SYSTIM
UW
tim の内容
W
UW

エラーコードE_OK

正常終了

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
システム稼働時間(システム起動時からの積算ミリ秒数)を取得する。tim に返される値は tk_get_otm と同じである。tim は、
タイマ割込み間隔(周期)の分解能となるが、さらに細かい精度の時刻情報として tim からの経過時間を ofs にナノ秒単位で取得する。ofs の分解能は実装依存であるが、一般にはハードウェアタイマの分解能となる。
tim は、タイマ割込みによってカウントされる時刻であるため、割込み禁止期間中にタイマ割込み周期が来た場合、タイマ割込
みハンドラが起動されず(起動が遅らされ)時刻が更新されないことがある。このような場合、tim には前回のタイマ割込みによって更新された時刻が返され、ofs には前回のタイマ割込みからの経過時間を返す。したがって、ofs はタイマ割込み間隔より

μT-Kernel 3.0仕様書

451 / 487

長い時間となる場合がある。ofs がどの程度まで長い経過時間を計測できるかはハードウェアなどに依存するが、少なくともタ
イマ割込み間隔の2倍未満(0≦ofs＜タイマ割込み間隔の2倍)の範囲まで計測できることが望ましい。
なお、tim および ofs に返される時刻は、td_get_otm を呼び出してから戻るまでにかかった時間範囲の中のどこかの時点の時刻となる。td_get_otm を呼び出した時点の時刻でも、td_get_otm から戻った時点の時刻でもない。したがって、より正確な情報を得たい場合は、割込み禁止状態で呼び出すべきである。

μT-Kernel 3.0仕様書

452 / 487

6.1.43 td_get_otm_u - システム稼働時間参照(マイクロ秒単位)
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_get_otm_u(SYSTIM_U *tim_u, UW *ofs);
パラメータ
SYSTIM_U*

tim_u

Time

UW*

ofs

Offset

ercd
tim_u
ofs

Error CodeTime
Offset

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

リターンパラメータ
ER
SYSTIM_U
UW

エラーコード稼働時間(マイクロ秒)
tim_u からの相対的な経過時間(ナノ秒)

エラーコードE_OK

正常終了

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート
マイクロ秒のサポート

解説
td_get_otm のリターンパラメータである tim を64ビットマイクロ秒単位の tim_u としたシステムコールである。
リターンパラメータが tim_u となった点を除き、本システムコールの仕様は td_get_otm と同じである。詳細は td_get_otmの説明を参照のこと。

μT-Kernel 3.0仕様書

453 / 487

6.1.44 td_ref_dsname - DSオブジェクト名称の参照
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_ref_dsname(UINT type, ID id, UB *dsname);
パラメータ
UINT
ID
UB*

type
id
dsnameObject Type
Object ID
DS Object Name

対象オブジェクトタイプ
対象オブジェクトID
DSオブジェクト名称を返す領域へのポインタ

Error Code

エラーコードリターンパラメータER

ercd

dsname の内容
オブジェクト生成時、または td_set_dsname で設定されたDSオブジェクト名称
エラーコード
E_OK
E_PAR
E_NOEXS
E_OBJ

正常終了
オブジェクトタイプ不正対象オブジェクトが存在しない
DSオブジェクト名称未使用

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

DSオブジェクト名称のサポート

解説
オブジェクト生成時に設定したDSオブジェクト名称(dsname)を参照する。対象となるオブジェクトは、オブジェクトタイプ(type)とオブジェクトID(id)で指定する。
指定可能なオブジェクトタイプ(type)は、以下の通りである。
TN_TSK
TN_SEM

0x01
0x02

タスク
セマフォ

μT-Kernel 3.0仕様書

TN_FLG
TN_MBX
TN_MBF
TN_POR
TN_MTX
TN_MPL
TN_MPF
TN_CYCTN_ALM

0x03
0x04
0x05
0x06
0x07
0x08
0x09
0x0a
0x0b

454 / 487

イベントフラグ
メールボックス
メッセージバッファ(予約)
ミューテックス
可変長メモリプール
固定長メモリプール
周期ハンドラアラームハンドラDS オ ブ ジ ェ ク ト 名 称 は、 オ ブ ジ ェ ク ト の 属 性 に、TA_DSNAME が 指 定 さ れ た 場 合 に 有 効 と な る。 オ ブ ジ ェ ク ト 生 成 後に、td_set_dsname でDSオブジェクト名称を再設定した場合は、この名称が参照される。
DSオブジェクト名称の仕様は以下の通りとするが、μT-Kernelでは文字コードのチェックを行わない。
使用可能文字(UB)
a〜z, A〜Z, 0〜9, _名称長最大8バイト(’\0’は含まない)
補足事項
読み出したDSオブジェクト名称は ’\0’ で終端される。このため、dsname には9バイト以上の領域を用意する必要がある。

μT-Kernel 3.0仕様書

455 / 487

6.1.45 td_set_dsname - DSオブジェクト名称の設定
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_set_dsname(UINT type, ID id, CONST UB *dsname);
パラメータ
UINT
ID
CONST UB*

typeid
dsnameObject Type
Object ID
DS Object Name

対象オブジェクトタイプ
対象オブジェクトID
設定するDSオブジェクト名称

ercd

Error Code

エラーコードリターンパラメータ
ER
エラーコード
E_OK
E_PAR
E_NOEXS
E_OBJ

正常終了
オブジェクトタイプ不正対象オブジェクトが存在しない
DSオブジェクト名称未使用

利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

DSオブジェクト名称のサポート

解説
オブジェクト生成時に設定したDSオブジェクト名称(dsname)を再設定する。対象となるオブジェクトは、オブジェクトタイプ(type)とオブジェクトID(id)で指定する。
指定可能なオブジェクトタイプ(type)は、td_ref_dsname と同様である。
設定可能なDSオブジェクト名称の仕様は以下の通りとするが、μT-Kernelでは文字コードのチェックを行わない。
使用可能文字(UB)
a〜z, A〜Z, 0〜9, _名称長最大8バイト(満たない場合は’\0’で埋める)

μT-Kernel 3.0仕様書

456 / 487

DSオブジェクト名称は、オブジェクトの属性に、TA_DSNAME が指定されている場合に有効である。TA_DSNAME 属性が指定されていないオブジェクトを対象とした場合は、エラー E_OBJ となる。

μT-Kernel 3.0仕様書

457 / 487

6.2 実行トレース機能
実行トレース機能は、デバッガがプログラムの実行をトレースするための機能である。実行トレースはフックルーチンを設定する
ことによって行う。
• フックルーチンでは、各種の状態をフックルーチンが呼び出された時点の状態に戻してから、フックルーチンから戻らなければならない。ただし、レジスタに関してはC言語の関数の保存規則にしたがって復帰すればよい。
• フックルーチン内では、各種の状態を制限の緩い方へ変更してはいけない。例えば、割込み禁止状態で呼び出された場合
は、割込みを許可してはいけない。
• フックルーチンは、保護レベル0で呼び出される。
• フックルーチンは、フックした時点のスタックをそのまま継承している。したがって、あまり多くスタックを消費するとスタックオ
ーバーフローを引き起こす可能性がある。どの程度のスタックが使用可能であるかは、フックされた時点の状況により異なる
ため不確定である。フックルーチン内で独自スタックに切り替えれば、より安全である。

μT-Kernel 3.0仕様書

458 / 487

6.2.1 td_hok_svc - システムコール・拡張SVCのフックルーチン定義
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_hok_svc(CONST TD_HSVC *hsvc);
パラメータ
CONST TD_HSVC*

hsvc

SVC Hook Routine

フックルーチン定義情報

FP

enter

呼出前のフックルーチン

FP

leave

Hook Routine before
Calling
Hook Routine after Calling

ercd

Error Code

エラーコードhsvc の内容

呼出後のフックルーチン

リターンパラメータ
ER
エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
システムコールおよび拡張SVCの呼出前後に、フックルーチンを設定する。hsvc に NULL を指定することによりフックルーチンを解除する。
トレースの対象となるのは、μT-Kernel/OSのシステムコール(tk_〜)、および拡張SVCである。ただし、実装によるが、一般にtk_ret_int はトレースの対象とならない。
μT-Kernel/DSのシステムコール(td_〜)は、トレースの対象とならない。
フックルーチンは、フック対象となるシステムコールや拡張SVCを呼び出したタスクの準タスク部として実行される。そのため、
例えばフックルーチン内での自タスクは、システムコールや拡張SVCを呼び出したタスクと同じである。

μT-Kernel 3.0仕様書

459 / 487

システムコール内でタスクディスパッチや割込みが起こる場合があるため、enter() と leave() が常にペアで連続して呼び出されるとは限らない。また、システムコールから戻らない場合は、leave() は呼び出されない。
void *enter(FN fncd, TD_CALINF *calinf, ... );
FN

fncd

TD_CALINF*

calinf...

戻値

機能コード＜0 システムコール≧0 拡張SVC
呼出元情報
パラメータ(可変個数)

leave() に引き渡す任意の値

typedef struct td_calinf {システムコール・拡張SVCの呼出元(アドレス)を特定するための情報で、スタックのバックトレースを行うための情報が含まれることが望ましい。
内容は実装定義となる。
一般的には、スタックポインタやプログラムカウンタなどのレジスタの値である。
} TD_CALINF ;システムコールまたは拡張SVCを呼び出す直前に呼び出される。
戻値に返された値は、そのまま対応する leave() に渡される。これにより、enter() と leave() のペアの確認や任意の情報の受け渡しを行うことができる。
exinf = enter ( fncd , & calinf , ... )ret = システムコール・拡張SVCの実行
leave ( fncd , ret , exinf )• システムコールの場合
パラメータは、システムコールのパラメータと同じとなる。
tk_wai_sem( ID semid, INT cnt, TMO tmout )の場合
enter ( TFN_WAI_SEM , & calinf , semid , cnt , tmout )• 拡張SVCの場合
パラメータは、拡張SVCハンドラに渡されるパケットの状態となる。
fncd も拡張SVCハンドラに渡されるものと同一である。
enter (FN fncd, TD_CALINF *calinf, void *pk_para);
void leave(FN fncd, INT ret, void *exinf);
FN
INT
void*

fncd
ret
exinf

機能コード
システムコールまたは拡張SVCの戻値
enter() で戻された任意の値

システムコールまたは拡張SVCから戻った直後に呼び出される。
システムコールまたは拡張SVCが呼び出された後(システムコールまたは拡張SVCの実行中)にフックルーチンが設定された
場合、enter() が呼び出されずに leave() のみ呼び出される場合がある。このような場合、exinf には NULL が渡される。
逆に、システムコールまたは拡張SVCが呼び出された後フックルーチンが解除された場合、enter() が呼び出されて、leave()が呼び出されない場合がある。

μT-Kernel 3.0仕様書

460 / 487

6.2.2 td_hok_dsp - タスクディスパッチのフックルーチン定義
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_hok_dsp(CONST TD_HDSP *hdsp);
パラメータ
CONST TD_HDSP*

hdsp

Dispatcher Hook Routine

フックルーチン定義情報

FP

exec

実行開始時のフックルーチン

FP

stop

Hook Routine when
Execution Starts
Hook Routine when
Execution Stops

hdsp の内容

実行停止時のフックルーチン

リターンパラメータER

ercd

Error Code

エラーコードエラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
タスクディスパッチャに、フックルーチンを設定する。hdsp に NULLを指定することによりフックルーチンを解除する。
フックルーチンは、ディスパッチ禁止状態で呼び出される。フックルーチンでは、μT-Kernel/OSのシステムコール(tk_〜)および拡張SVCを呼び出してはいけない。μT-Kernel/DSのシステムコール(td_〜)は呼び出すことができる。
void exec(ID tskid);
ID

tskid

実行を開始・再開するタスクのタスクID

μT-Kernel 3.0仕様書

461 / 487

タスクの実行が開始・再開されるときに呼び出される。exec() が呼び出された時点で、すでに tskid のタスクはRUNNING状態となっている。ただし、tskid のタスクのプログラムコードが実行されるのは、exec() から戻った後である。
void stop(ID tskid, UINT tskstat);
ID
UINT

tskid
tskstat

実行を停止したタスクのタスクID
tskid のタスクの状態

タスクが実行を停止した時に呼び出される。tskstat には、停止後のタスクの状態が示され、以下のいずれかとなる。
TTS_RDY
TTS_WAITTS_SUSTTS_WASTTS_DMT
0

READY状態 (実行可能状態)
WAITING状態 (待ち状態)
SUSPENDED状態 (強制待ち状態)
WAITING-SUSPENDED状態 (二重待ち状態)
DORMANT状態 (休止状態)
NON-EXISTENT状態 (未登録状態)

stop() が呼び出された時点で、すでに tskid のタスクは tskstat で示した状態となっている。

μT-Kernel 3.0仕様書

462 / 487

6.2.3 td_hok_int - 割込みハンドラのフックルーチン定義
C言語インタフェース#include <tk/dbgspt.h>
ER ercd = td_hok_int(CONST TD_HINT *hint);
パラメータ
CONST TD_HINT*

hint

Interruption Handler Hook
Routineフックルーチン定義情報

FP

enter

ハンドラ呼出前のフックルーチン

FP

leave

Hook Routine before
Calling Handler
Hook Routine after Calling
HandlerError Code

エラーコードhint の内容

ハンドラ呼出後のフックルーチン

リターンパラメータ
ER

ercd

エラーコードなし
利用可能なコンテキスト
タスク部
○

準タスク部
○

タスク独立部○

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

μT-Kernel/DSのサポート

解説
割込みハンドラの呼出前後に、フックルーチンを設定する。フックルーチンの設定は、例外・割込み要因ごとに独立に行うことはできない。すべての例外・割込み要因で共通のフックルーチンを1つのみ設定できる。
hint に NULL を指定することによりフックルーチンを解除する。
フックルーチンはタスク独立部(割込みハンドラの一部)として呼び出される。したがって、フックルーチンからはタスク独立部から発行可能なシステムコールのみ呼び出すことができる。
なお、フックルーチンを設定できるのは、tk_def_int で TA_HLNG 属性を指定して定義された割込みハンドラのみである。TA_ASM

μT-Kernel 3.0仕様書

463 / 487

属性の割込みハンドラのフックはできない。TA_ASM 属性の割込みハンドラをフックしたい場合は、例外・割込みベクタテーブル
を直接操作してフックするなどの方法があるが、それらの方法は実装によって異なる。
void enter(UINT intno);
void leave(UINT intno);
UINT

intno

割込み番号

enter() および leave() に渡される引数は、例外・割込みハンドラに渡される引数と同じものである。実装によっては、intno
以外の情報も渡される場合がある。
フックルーチンは、高級言語対応ルーチンから次のようにして呼び出される。
enter ( intno );inthdr ( intno ); /* 例外・割込みハンドラ */leave ( intno );enter() は割込み禁止状態で呼び出されることになる。また、割込みを許可してはいけない。leave() は、inthdr() から戻ったときの状態となるため、割込み禁止状態は不確定である。
enter() では、inthdr() で得ることのできる情報と同じだけの情報を得ることができる。逆に、inthdr() で得ることのできな
い情報は enter() でも得ることはできない。enter() および inthdr() で得ることのできる情報としては、intno が仕様としては保証されているが、それ以外の情報については実装定義である。なお、leave() では割込み禁止状態など各種の状態が変化している場合があるため、enter() や inthdr() と同じだけの情報を得ることができるとは限らない。

μT-Kernel 3.0仕様書

第7章

付録

464 / 487

μT-Kernel 3.0仕様書

465 / 487

7.1 システムコンフィギュレーション
μT-Kernelを実際の製品に組み込む際には、システムに合わせてμT-Kernelを改変したり不要な機能を取り外したりしても良い。μT-Kernel 3.0のリファレンス実装には、資源数や制限値などのパラメータを設定する機能が提供されている。これをシステムコンフィギュレーションと呼ぶ。
本節では、μT-Kernel 3.0リファレンス実装において提供されるシステムコンフィギュレーション項目を示す。
名称
CFN_MAX_PRI
CFN_SYSTEMAREA_TOP
CFN_SYSTEMAREA_END
CFN_TIMER_PERIOD
CFN_MAX_TSKID
CFN_MAX_SEMID
CFN_MAX_FLGID
CFN_MAX_MBXID
CFN_MAX_MTXID
CFN_MAX_MBFID
CFN_MAX_MPFID
CFN_MAX_MPLID
CFN_MAX_CYCID
CFN_MAX_ALMID
CFN_MAX_SSYID
CFN_MAX_SSYPRI
CFN_MAX_REGDEVCFN_MAX_OPNDEV
CFN_MAX_REQDEV

説明
最大タスク優先度 (サービスプロファイル項
目TK_MAX_TSKPRIにも反映される)
μT-Kernelのメモリ管理機能により動的に管理される領域の最下位アドレス
μT-Kernelのメモリ管理機能により動的に管理される領域の最上位アドレス
システムタイマの割込み周期（ミリ秒）
最大タスク数
最大セマフォ数
最大イベントフラグ数
最大メールボックス数
最大ミューテックス数
最大メッセージバッファ数
最大固定長メモリプール数
最大可変長メモリプール数
最大周期ハンドラ数
最大アラームハンドラ数
最大サブシステム数
最大サブシステム優先度数
最大デバイス登録数
最大デバイスオープン数
最大デバイスリクエスト数

補足事項
システムコンフィギュレーションはμT-Kernel 3.0仕様の範囲ではない。しかし、同様の機能を提供する場合は、これらと対応のとれた名称にすることが望ましい。

μT-Kernel 3.0仕様書

7.2 キーワード
1. OSの名称に関するキーワード• μT-Kernel• TRON• IEEE 2050-2018
2. OSの用途に関するキーワード• 組込み / embedded• リアルタイム / real time
• IoTエッジノード / IoT edgenode• 小規模 / small scale• 16ビットCPU / 16-bit CPU• シングルチップマイコン / single chip microcomputer• single chip MicroController Unit (MCU)• 省電力 / power saving
3. OSの基本概念に関するキーワード• リアルタイムOS / real-time operating system (RTOS)• Application Programming Interface (API)• システムコール / system call
• カーネル / kernel• タスク / task
• ディスパッチ / dispatching (task dispatching)• スケジューリング / scheduling (task scheduling)• 優先度ベース / priority-based• タスク部 / task portion• 非タスク部 / non-task portion• タスク独立部 / task independent portion• 準タスク部 / quasi-task portion• サービスプロファイル / service profile
4. OSの個別機能に関するキーワード• セマフォ / semaphore• イベントフラグ / event flag
• メールボックス / mailbox• メッセージバッファ / message buffer• ミューテックス / mutex• メモリプール / memory pool
• 割込みハンドラ / interrupt handler• 周期ハンドラ / cyclic handler• アラームハンドラ / alarm handler• デバイス管理 / device management• 省電力機能 / power management• 物理タイマ / physical timer• 高速ロック / fast lock
• 高速マルチロック / fast multi-lock

466 / 487

μT-Kernel 3.0仕様書

第8章

リファレンス

467 / 487

μT-Kernel 3.0仕様書

468 / 487

8.1 C言語インタフェース一覧
8.1.1 μT-Kernel/OS
8.1.1.1

タスク管理機能• ID tskid = tk_cre_tsk ( CONST T_CTSK *pk_ctsk );• ER ercd = tk_del_tsk ( ID tskid );• ER ercd = tk_sta_tsk ( ID tskid, INT stacd );• void tk_ext_tsk ( void );• void tk_exd_tsk ( void );• ER ercd = tk_ter_tsk ( ID tskid );• ER ercd = tk_chg_pri ( ID tskid, PRI tskpri );• ER ercd = tk_get_reg ( ID tskid, T_REGS *pk_regs, T_EIT *pk_eit, T_CREGS *pk_cregs );• ER ercd = tk_set_reg ( ID tskid, CONST T_REGS *pk_regs, CONST T_EIT *pk_eit, CONST T_CREGS *pk_cregs);• ER ercd = tk_get_cpr ( ID tskid, INT copno, T_COPREGS *pk_copregs );• ER ercd = tk_set_cpr ( ID tskid, INT copno, CONST T_COPREGS *pk_copregs );• ER ercd = tk_ref_tsk ( ID tskid, T_RTSK *pk_rtsk );8.1.1.2

タスク付属同期機能• ER ercd = tk_slp_tsk ( TMO tmout );• ER ercd = tk_slp_tsk_u ( TMO_U tmout_u );• ER ercd = tk_wup_tsk ( ID tskid );• INT wupcnt = tk_can_wup ( ID tskid );• ER ercd = tk_rel_wai ( ID tskid );• ER ercd = tk_sus_tsk ( ID tskid );• ER ercd = tk_rsm_tsk ( ID tskid );• ER ercd = tk_frsm_tsk ( ID tskid );• ER ercd = tk_dly_tsk ( RELTIM dlytim );• ER ercd = tk_dly_tsk_u ( RELTIM_U dlytim_u );• ER ercd = tk_sig_tev ( ID tskid, INT tskevt );• INT tevptn = tk_wai_tev ( INT waiptn, TMO tmout );• INT tevptn = tk_wai_tev_u ( INT waiptn, TMO_U tmout_u );• INT tskwait = tk_dis_wai ( ID tskid, UW waitmask );• ER ercd = tk_ena_wai ( ID tskid );μT-Kernel 3.0仕様書

8.1.1.3

タスク例外処理機能• ER ercd = tk_def_tex ( ID tskid, CONST T_DTEX *pk_dtex );• ER ercd = tk_ena_tex ( ID tskid, UINT texptn );• ER ercd = tk_dis_tex ( ID tskid, UINT texptn );• ER ercd = tk_ras_tex ( ID tskid, INT texcd );• INT texcd = tk_end_tex ( BOOL enatex );• ER ercd = tk_ref_tex ( ID tskid, T_RTEX *pk_rtex );8.1.1.4

同期・通信機能• ID semid = tk_cre_sem ( CONST T_CSEM *pk_csem );• ER ercd = tk_del_sem ( ID semid );• ER ercd = tk_sig_sem ( ID semid, INT cnt );• ER ercd = tk_wai_sem ( ID semid, INT cnt, TMO tmout );• ER ercd = tk_wai_sem_u ( ID semid, INT cnt, TMO_U tmout_u );• ER ercd = tk_ref_sem ( ID semid, T_RSEM *pk_rsem );• ID flgid = tk_cre_flg ( CONST T_CFLG *pk_cflg );• ER ercd = tk_del_flg ( ID flgid );• ER ercd = tk_set_flg ( ID flgid, UINT setptn );• ER ercd = tk_clr_flg ( ID flgid, UINT clrptn );• ER ercd = tk_wai_flg ( ID flgid, UINT waiptn, UINT wfmode, UINT *p_flgptn, TMO tmout );• ER ercd = tk_wai_flg_u ( ID flgid, UINT waiptn, UINT wfmode, UINT *p_flgptn, TMO_U tmout_u );• ER ercd = tk_ref_flg ( ID flgid, T_RFLG *pk_rflg );• ID mbxid = tk_cre_mbx ( CONST T_CMBX* pk_cmbx );• ER ercd = tk_del_mbx ( ID mbxid );• ER ercd = tk_snd_mbx ( ID mbxid, T_MSG *pk_msg );• ER ercd = tk_rcv_mbx ( ID mbxid, T_MSG **ppk_msg, TMO tmout );• ER ercd = tk_rcv_mbx_u ( ID mbxid, T_MSG **ppk_msg, TMO_U tmout_u );• ER ercd = tk_ref_mbx ( ID mbxid, T_RMBX *pk_rmbx );469 / 487

μT-Kernel 3.0仕様書

8.1.1.5

拡張同期・通信機能• ID mtxid = tk_cre_mtx ( CONST T_CMTX *pk_cmtx );• ER ercd = tk_del_mtx ( ID mtxid );• ER ercd = tk_loc_mtx ( ID mtxid, TMO tmout );• ER ercd = tk_loc_mtx_u ( ID mtxid, TMO_U tmout_u );• ER ercd = tk_unl_mtx ( ID mtxid );• ER ercd = tk_ref_mtx ( ID mtxid, T_RMTX *pk_rmtx );• ID mbfid = tk_cre_mbf ( CONST T_CMBF *pk_cmbf );• ER ercd = tk_del_mbf ( ID mbfid );• ER ercd = tk_snd_mbf ( ID mbfid, CONST void *msg, INT msgsz, TMO tmout );• ER ercd = tk_snd_mbf_u ( ID mbfid, CONST void *msg, INT msgsz, TMO_U tmout_u );• INT msgsz = tk_rcv_mbf ( ID mbfid, void *msg, TMO tmout );• INT msgsz = tk_rcv_mbf_u ( ID mbfid, void *msg, TMO_U tmout_u );• ER ercd = tk_ref_mbf ( ID mbfid, T_RMBF *pk_rmbf );8.1.1.6

メモリプール管理機能• ID mpfid = tk_cre_mpf ( CONST T_CMPF *pk_cmpf );• ER ercd = tk_del_mpf ( ID mpfid );• ER ercd = tk_get_mpf ( ID mpfid, void **p_blf, TMO tmout );• ER ercd = tk_get_mpf_u ( ID mpfid, void **p_blf, TMO_U tmout_u );• ER ercd = tk_rel_mpf ( ID mpfid, void *blf );• ER ercd = tk_ref_mpf ( ID mpfid, T_RMPF *pk_rmpf );• ID mplid = tk_cre_mpl ( CONST T_CMPL *pk_cmpl );• ER ercd = tk_del_mpl ( ID mplid );• ER ercd = tk_get_mpl ( ID mplid, SZ blksz, void **p_blk, TMO tmout );• ER ercd = tk_get_mpl_u ( ID mplid, SZ blksz, void **p_blk, TMO_U tmout_u );• ER ercd = tk_rel_mpl ( ID mplid, void *blk );• ER ercd = tk_ref_mpl ( ID mplid, T_RMPL *pk_rmpl );470 / 487

μT-Kernel 3.0仕様書

8.1.1.7

時間管理機能• ER ercd = tk_set_utc ( CONST SYSTIM *pk_tim );• ER ercd = tk_set_utc_u ( SYSTIM_U tim_u );• ER ercd = tk_set_tim ( CONST SYSTIM *pk_tim );• ER ercd = tk_set_tim_u ( SYSTIM_U tim_u );• ER ercd = tk_get_utc ( SYSTIM *pk_tim );• ER ercd = tk_get_utc_u ( SYSTIM_U *tim_u, UW *ofs );• ER ercd = tk_get_tim ( SYSTIM *pk_tim );• ER ercd = tk_get_tim_u ( SYSTIM_U *tim_u, UW *ofs );• ER ercd = tk_get_otm ( SYSTIM *pk_tim );• ER ercd = tk_get_otm_u ( SYSTIM_U *tim_u, UW *ofs );• ID cycid = tk_cre_cyc ( CONST T_CCYC *pk_ccyc );• ID cycid = tk_cre_cyc_u ( CONST T_CCYC_U *pk_ccyc_u );• ER ercd = tk_del_cyc ( ID cycid );• ER ercd = tk_sta_cyc ( ID cycid );• ER ercd = tk_stp_cyc ( ID cycid );• ER ercd = tk_ref_cyc ( ID cycid, T_RCYC *pk_rcyc );• ER ercd = tk_ref_cyc_u ( ID cycid, T_RCYC_U *pk_rcyc_u );• ID almid = tk_cre_alm ( CONST T_CALM *pk_calm );• ER ercd = tk_del_alm ( ID almid );• ER ercd = tk_sta_alm ( ID almid, RELTIM almtim );• ER ercd = tk_sta_alm_u ( ID almid, RELTIM_U almtim_u );• ER ercd = tk_stp_alm ( ID almid );• ER ercd = tk_ref_alm ( ID almid, T_RALM *pk_ralm );• ER ercd = tk_ref_alm_u ( ID almid, T_RALM_U *pk_ralm_u );8.1.1.8

割込み管理機能• ER ercd = tk_def_int ( UINT intno, CONST T_DINT *pk_dint );• void tk_ret_int ( void );8.1.1.9

システム状態管理機能• ER ercd = tk_rot_rdq ( PRI tskpri );• ID tskid = tk_get_tid ( void );• ER ercd = tk_dis_dsp ( void );• ER ercd = tk_ena_dsp ( void );• ER ercd = tk_ref_sys ( T_RSYS *pk_rsys );• ER ercd = tk_set_pow ( UINT powmode );• ER ercd = tk_ref_ver ( T_RVER *pk_rver );471 / 487

μT-Kernel 3.0仕様書

8.1.1.10 サブシステム管理機能• ER ercd = tk_def_ssy ( ID ssid, CONST T_DSSY *pk_dssy );• ER ercd = tk_evt_ssy ( ID ssid, INT evttyp, INT info );• ER ercd = tk_ref_ssy ( ID ssid, T_RSSY *pk_rssy );8.1.2 μT-Kernel/SM
8.1.2.1

システムメモリ管理機能• void* Kmalloc ( size_t size );• void* Kcalloc ( size_t nmemb, size_t size );• void* Krealloc ( void *ptr, size_t size );• void Kfree ( void *ptr );8.1.2.2

デバイス管理機能• ID dd = tk_opn_dev ( CONST UB *devnm, UINT omode );• ER ercd = tk_cls_dev ( ID dd, UINT option );• ID reqid = tk_rea_dev ( ID dd, W start, void *buf, SZ size, TMO tmout );• ID reqid = tk_rea_dev_du ( ID dd, D start_d, void *buf, SZ size, TMO_U tmout_u );• ER ercd = tk_srea_dev ( ID dd, W start, void *buf, SZ size, SZ *asize );• ER ercd = tk_srea_dev_d ( ID dd, D start_d, void *buf, SZ size, SZ *asize );• ID reqid = tk_wri_dev ( ID dd, W start, CONST void *buf, SZ size, TMO tmout );• ID reqid = tk_wri_dev_du ( ID dd, D start_d, CONST void *buf, SZ size, TMO_U tmout_u );• ER ercd = tk_swri_dev ( ID dd, W start, CONST void *buf, SZ size, SZ *asize );• ER ercd = tk_swri_dev_d ( ID dd, D start_d, CONST void *buf, W size, W *asize );• ID creqid = tk_wai_dev ( ID dd, ID reqid, SZ *asize, ER *ioer, TMO tmout );• ID creqid = tk_wai_dev_u ( ID dd, ID reqid, SZ *asize, ER *ioer, TMO_U tmout_u );• INT dissus = tk_sus_dev ( UINT mode );• ID pdevid = tk_get_dev ( ID devid, UB *devnm );• ID devid = tk_ref_dev ( CONST UB *devnm, T_RDEV *rdev );• ID devid = tk_oref_dev ( ID dd, T_RDEV *rdev );• INT remcnt = tk_lst_dev ( T_LDEV *ldev, INT start, INT ndev );• INT retcode = tk_evt_dev ( ID devid, INT evttyp, void *evtinf );• ID devid = tk_def_dev ( CONST UB *devnm, CONST T_DDEV *ddev, T_IDEV *idev );• ER ercd = tk_ref_idv ( T_IDEV *idev );• ER ercd = openfn ( ID devid, UINT omode, void *exinf );472 / 487

μT-Kernel 3.0仕様書• ER ercd = closefn ( ID devid, UINT option, void *exinf );• ER ercd = execfn ( T_DEVREQ *devreq, TMO tmout, void *exinf );• ER ercd = execfn ( T_DEVREQ_D *devreq_d, TMO tmout, void *exinf );• ER ercd = execfn ( T_DEVREQ *devreq, TMO_U tmout_u, void *exinf );• ER ercd = execfn ( T_DEVREQ_D *devreq_d, TMO_U tmout_u, void *exinf );• INT creqno = waitfn ( T_DEVREQ *devreq, INT nreq, TMO tmout, void *exinf );• INT creqno = waitfn ( T_DEVREQ_D *devreq_d, INT nreq, TMO tmout, void *exinf );• INT creqno = waitfn ( T_DEVREQ *devreq, INT nreq, TMO_U tmout_u, void *exinf );• INT creqno = waitfn ( T_DEVREQ_D *devreq_d, INT nreq, TMO_U tmout_u, void *exinf );• ER ercd = abortfn ( ID tskid, T_DEVREQ *devreq, INT nreq, void *exinf );• ER ercd = abortfn ( ID tskid, T_DEVREQ_D *devreq_d, INT nreq, void *exinf );• INT retcode = eventfn ( INT evttyp, void *evtinf, void *exinf );8.1.2.3

割込み管理機能• DI ( UINT intsts );• EI ( UINT intsts );• BOOL disint = isDI ( UINT intsts );• void SetCpuIntLevel ( INT level );• INT level = GetCpuIntLevel ( void );• void EnableInt ( UINT intno );• void EnableInt ( UINT intno, INT level );• void DisableInt ( UINT intno );• void ClearInt ( UINT intno );• void EndOfInt ( UINT intno );• BOOL rasint = CheckInt ( UINT intno );• void SetIntMode ( UINT intno, UINT mode );• void SetCtrlIntLevel ( INT level );• INT level = GetCtrlIntLevel ( void );473 / 487

μT-Kernel 3.0仕様書

8.1.2.4

I/Oポートアクセスサポート機能• void out_b ( INT port, UB data );• void out_h ( INT port, UH data );• void out_w ( INT port, UW data );• void out_d ( INT port, UD data );• UB data = in_b ( INT port );• UH data = in_h ( INT port );• UW data = in_w ( INT port );• UD data = in_d ( INT port );• void WaitUsec ( UW usec );• void WaitNsec ( UW nsec );8.1.2.5

省電力機能• void low_pow ( void );• void off_pow ( void );8.1.2.6

システム構成情報管理機能• INT ct = tk_get_cfn ( CONST UB *name, W *val, INT max );• INT rlen = tk_get_cfs ( CONST UB *name, UB *buf, INT max );8.1.2.7

メモリキャッシュ制御機能• SZ rlen = SetCacheMode ( void *addr, SZ len, UINT mode );• SZ rlen = ControlCache ( void *addr, SZ len, UINT mode );8.1.2.8

物理タイマ機能• ER ercd = StartPhysicalTimer ( UINT ptmrno, UW limit, UINT mode );• ER ercd = StopPhysicalTimer ( UINT ptmrno );• ER ercd = GetPhysicalTimerCount ( UINT ptmrno, UW *p_count );• ER ercd = DefinePhysicalTimerHandler ( UINT ptmrno, CONST T_DPTMR *pk_dptmr );• ER ercd = GetPhysicalTimerConfig ( UINT ptmrno, T_RPTMR *pk_rptmr );474 / 487

μT-Kernel 3.0仕様書

8.1.2.9

ユーティリティ機能• void SetOBJNAME ( void *exinf, CONST UB *name );• ER ercd = CreateLock ( FastLock *lock, CONST UB *name );• void DeleteLock ( FastLock *lock );• void Lock ( FastLock *lock );• void Unlock ( FastLock *lock );• ER ercd = CreateMLock ( FastMLock *lock, CONST UB *name );• ER ercd = DeleteMLock ( FastMLock *lock );• ER ercd = MLock ( FastMLock *lock, INT no );• ER ercd = MLockTmo ( FastMLock *lock, INT no, TMO tmout );• ER ercd = MLockTmo_u ( FastMLock *lock, INT no, TMO_U tmout_u );• ER ercd = MUnlock ( FastMLock *lock, INT no );8.1.3 μT-Kernel/DS
8.1.3.1

カーネル内部状態取得機能• INT ct = td_lst_tsk ( ID list[], INT nent );• INT ct = td_lst_sem ( ID list[], INT nent );• INT ct = td_lst_flg ( ID list[], INT nent );• INT ct = td_lst_mbx ( ID list[], INT nent );• INT ct = td_lst_mtx ( ID list[], INT nent );• INT ct = td_lst_mbf ( ID list[], INT nent );• INT ct = td_lst_mpf ( ID list[], INT nent );• INT ct = td_lst_mpl ( ID list[], INT nent );• INT ct = td_lst_cyc ( ID list[], INT nent );• INT ct = td_lst_alm ( ID list[], INT nent );• INT ct = td_lst_ssy ( ID list[], INT nent );• INT ct = td_rdy_que ( PRI pri, ID list[], INT nent );• INT ct = td_sem_que ( ID semid, ID list[], INT nent );• INT ct = td_flg_que ( ID flgid, ID list[], INT nent );• INT ct = td_mbx_que ( ID mbxid, ID list[], INT nent );• INT ct = td_mtx_que ( ID mtxid, ID list[], INT nent );• INT ct = td_smbf_que ( ID mbfid, ID list[], INT nent );• INT ct = td_rmbf_que ( ID mbfid, ID list[], INT nent );• INT ct = td_mpf_que ( ID mpfid, ID list[], INT nent );475 / 487

μT-Kernel 3.0仕様書

476 / 487

• INT ct = td_mpl_que ( ID mplid, ID list[], INT nent );• ER ercd = td_ref_tsk ( ID tskid, TD_RTSK *rtsk );• ER ercd = td_ref_tex ( ID tskid, TD_RTEX *pk_rtex );• ER ercd = td_ref_sem ( ID semid, TD_RSEM *rsem );• ER ercd = td_ref_flg ( ID flgid, TD_RFLG *rflg );• ER ercd = td_ref_mbx ( ID mbxid, TD_RMBX *rmbx );• ER ercd = td_ref_mtx ( ID mtxid, TD_RMTX *rmtx );• ER ercd = td_ref_mbf ( ID mbfid, TD_RMBF *rmbf );• ER ercd = td_ref_mpf ( ID mpfid, TD_RMPF *rmpf );• ER ercd = td_ref_mpl ( ID mplid, TD_RMPL *rmpl );• ER ercd = td_ref_cyc ( ID cycid, TD_RCYC *rcyc );• ER ercd = td_ref_cyc_u ( ID cycid, TD_RCYC_U *rcyc_u );• ER ercd = td_ref_alm ( ID almid, TD_RALM *ralm );• ER ercd = td_ref_alm_u ( ID almid, TD_RALM_U *ralm_u );• ER ercd = td_ref_sys ( TD_RSYS *pk_rsys );• ER ercd = td_ref_ssy ( ID ssid, TD_RSSY *rssy );• ER ercd = td_get_reg ( ID tskid, T_REGS *pk_regs, T_EIT *pk_eit, T_CREGS *pk_cregs );• ER ercd = td_set_reg ( ID tskid, CONST T_REGS *pk_regs, CONST T_EIT *pk_eit, CONST T_CREGS *pk_cregs);• ER ercd = td_get_utc ( SYSTIM *tim, UW *ofs );• ER ercd = td_get_utc_u ( SYSTIM_U *tim_u, UW *ofs );• ER ercd = td_get_tim ( SYSTIM *tim, UW *ofs );• ER ercd = td_get_tim_u ( SYSTIM_U *tim_u, UW *ofs );• ER ercd = td_get_otm ( SYSTIM *tim, UW *ofs );• ER ercd = td_get_otm_u ( SYSTIM_U *tim_u, UW *ofs );• ER ercd = td_ref_dsname ( UINT type, ID id, UB *dsname );• ER ercd = td_set_dsname ( UINT type, ID id, CONST UB *dsname );8.1.3.2

実行トレース機能• ER ercd = td_hok_svc ( CONST TD_HSVC *hsvc );• ER ercd = td_hok_dsp ( CONST TD_HDSP *hdsp );• ER ercd = td_hok_int ( CONST TD_HINT *hint );μT-Kernel 3.0仕様書

477 / 487

8.2 エラーコード一覧
8.2.1 正常終了のエラークラス (0)エラーコードの名称
E_OK

エラーコード0

説明
正常終了

エラーコードERCD(-5, 0)

説明
システムエラー

8.2.2 内部エラークラス (5〜8)
エラーコードの名称
E_SYS

原因不明のエラーであり、システム全体に影響するエラーである。
エラーコードの名称
E_NOCOP

エラーコードERCD(-6, 0)

説明
コプロセッサ使用不可

現在動作中のハードウェアに指定のコプロセッサが搭載されていない。または、コプロセッサの動作異常を検出した。

8.2.3 未サポートエラークラス (9〜16)
エラーコードの名称
E_NOSPT

エラーコードERCD(-9, 0)

説明
未サポート機能

システムコールの一部の機能がサポートされていない場合に、その機能を指定すると、E_RSATR または E_NOSPT のエラーを発生する。E_RSATR に該当しない場合には、E_NOSPT のエラーとなる。
エラーコードの名称
E_RSFN

エラーコードERCD(-10, 0)

説明
予約機能コード番号

予約機能コード(未定義の機能コード)を指定してシステムコールを実行しようとした場合に、このエラーが発生する。未定義の拡張SVCハンドラを実行しようとした場合(機能コードが正の場合)にも、このエラーが発生する。
エラーコードの名称
E_RSATR

エラーコードERCD(-11, 0)

説明
予約属性

未定義やサポートしていないオブジェクト属性を指定した場合に発生する。
システム依存の適応化を行う場合、このエラーのチェックは省略されることがある。

8.2.4 パラメータエラークラス (17〜24)
エラーコードの名称
E_PAR

エラーコードERCD(-17, 0)

システム依存の適応化を行う場合、このエラーのチェックは省略されることがある。

説明
パラメータエラー

μT-Kernel 3.0仕様書

エラーコードの名称
E_ID

478 / 487

エラーコードERCD(-18, 0)

説明
不正ID番号

E_ID はID番号を持つオブジェクトに対してのみ発生するエラーである。
割込み番号などの範囲外や予約番号といった静的なエラーが検出された場合には、E_PAR のエラーが発生する。

8.2.5 呼出コンテキストエラークラス (25〜32)
エラーコードの名称
E_CTX

エラーコードERCD(-25, 0)

説明
コンテキストエラー

このシステムコールを発行できるコンテキスト(タスク部／タスク独立部の区別やハンドラ実行状態) にはないということを示す
エラーである。
自タスクを待ち状態にするシステムコールをタスク独立部から発行した場合のように、システムコールの発行コンテキストに関して意味的な間違いのある場合には、必ずこのエラーが発生する。また、それ以外のシステムコールであっても、実装の制約のため、あるコンテキスト(割込みハンドラなど)からそのシステムコールを発行できない場合に、このエラーが発生する。
エラーコードの名称
E_MACV

エラーコードERCD(-26, 0)

説明
メモリアクセス不能,メモリアクセス権違反

エラーコードERCD(-27, 0)

説明
オブジェクトアクセス権違反

エラーの検出は実装依存である。
エラーコードの名称
E_OACV

ユーザタスクがシステムオブジェクトを操作した場合に発生する。
システムオブジェクトの定義およびエラーの検出は実装依存である。
エラーコードの名称
E_ILUSE

エラーコードERCD(-28, 0)

説明
システムコール不正使用

8.2.6 資源不足エラークラス (33〜40)
エラーコードの名称
E_NOMEM

エラーコードERCD(-33, 0)

説明
メモリ不足

オブジェクト管理ブロック領域、ユーザスタック領域、メモリプール領域、メッセージバッファ領域などを獲得する時のメモリ不足(no memory)
エラーコードの名称
E_LIMIT

エラーコードERCD(-34, 0)

オブジェクト数の上限を超えてオブジェクトを生成しようとした場合など。

8.2.7 オブジェクト状態エラークラス (41〜48)

説明
システムの制限を超過

μT-Kernel 3.0仕様書

エラーコードの名称
E_OBJ
E_NOEXSE_QOVR

479 / 487

エラーコードERCD(-41, 0)
ERCD(-42, 0)
ERCD(-43, 0)

説明
オブジェクトの状態が不正
オブジェクトが存在していない
キューイングまたはネストのオーバーフロー

8.2.8 待ち解除エラークラス (49〜56)
エラーコードの名称
E_RLWAIE_TMOUT
E_DLT
E_DISWAI

エラーコードERCD(-49, 0)
ERCD(-50, 0)
ERCD(-51, 0)
ERCD(-52, 0)

説明
待ち状態強制解除
ポーリング失敗またはタイムアウト
待ちオブジェクトが削除された
待ち禁止による待ち解除

8.2.9 デバイスエラークラス (57〜64) (μT-Kernel/SM)
エラーコードの名称
E_IO

エラーコードERCD(-57, 0)

説明
入出力エラー※ E_IO のサブエラーコードには、デバイスごとにエラー状態等を示す値が定義される場合がある。
エラーコードの名称
E_NOMDA

エラーコードERCD(-58, 0)

説明
メディアがない

8.2.10 各種状態エラークラス (65〜72) (μT-Kernel/SM)
エラーコードの名称
E_BUSY
E_ABORT
E_RONLY

エラーコードERCD(-65, 0)
ERCD(-66, 0)
ERCD(-67, 0)

説明
ビジー状態
中止した
書込み禁止

μT-Kernel 3.0仕様書

480 / 487

8.3 APIとサービスプロファイルの一覧
8.3.1 μT-Kernel/OS
8.3.1.1

タスク管理機能

API名称
tk_cre_tsk

利用可能条件
常に利用可能tk_del_tsk
tk_sta_tsk
tk_ext_tsk
tk_exd_tsk
tk_ter_tsk
tk_chg_pri

常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能tk_get_reg
tk_set_reg
tk_get_cpr
tk_set_cpr
tk_ref_tsk

TK_SUPPORT_REGOPSTK_SUPPORT_REGOPSTK_SUPPORT_COPn
TK_SUPPORT_COPn
常に利用可能8.3.1.2

その他関連するプロファイル
TK_SUPPORT_ASM
TK_SUPPORT_USERBUF
TK_SUPPORT_AUTOBUFTK_SUPPORT_FPU
TK_SUPPORT_COPn
TK_HAS_SYSSTACKTK_SUPPORT_DSNAME
TK_MAX_TSKPRI
なし
なし
なし
なし
なし
TK_MAX_TSKPRI
なし
なし
なし
なし
TK_SUPPORT_DISWAITK_SUPPORT_TASKEXCEPTIONTK_SUPPORT_TASKEVENT

タスク付属同期機能

API名称
tk_slp_tsk
tk_slp_tsk_u
tk_wup_tsk

利用可能条件
常に利用可能TK_SUPPORT_USEC
常に利用可能tk_can_wup
tk_rel_wai
tk_sus_tsk

常に利用可能
常に利用可能
常に利用可能tk_rsm_tsk
tk_frsm_tsk
tk_dly_tsk
tk_dly_tsk_u
tk_sig_tev
tk_wai_tev
tk_wai_tev_u
tk_dis_wai
tk_ena_wai

常に利用可能
常に利用可能
常に利用可能TK_SUPPORT_USEC
TK_SUPPORT_TASKEVENTTK_SUPPORT_TASKEVENTTK_SUPPORT_TASKEVENT &&TK_SUPPORT_USEC
TK_SUPPORT_DISWAITK_SUPPORT_DISWAI

その他関連するプロファイル
なし
なし
TK_WAKEUP_MAXCNT
なし
なし
TK_SUSPEND_MAXCNT
なし
なし
なし
なし
なし
なし
なし
なし
なし

μT-Kernel 3.0仕様書

8.3.1.3

481 / 487

タスク例外処理機能

API名称
tk_def_tex
tk_ena_tex
tk_dis_tex
tk_ras_tex
tk_end_tex
tk_ref_tex

利用可能条件
TK_SUPPORT_TASKEXCEPTIONTK_SUPPORT_TASKEXCEPTIONTK_SUPPORT_TASKEXCEPTIONTK_SUPPORT_TASKEXCEPTIONTK_SUPPORT_TASKEXCEPTIONTK_SUPPORT_TASKEXCEPTION

その他関連するプロファイル
なし
なし
なし
なし
なし
なし

API名称
tk_cre_sem

利用可能条件
常に利用可能その他関連するプロファイル

tk_del_sem
tk_sig_sem
tk_wai_sem
tk_wai_sem_u
tk_ref_sem
tk_cre_flg

常に利用可能
常に利用可能
常に利用可能TK_SUPPORT_USEC
常に利用可能
常に利用可能tk_del_flg
tk_set_flg
tk_clr_flg
tk_wai_flg
tk_wai_flg_u
tk_ref_flg
tk_cre_mbx

常に利用可能
常に利用可能
常に利用可能
常に利用可能TK_SUPPORT_USEC
常に利用可能
常に利用可能tk_del_mbx
tk_snd_mbx
tk_rcv_mbx
tk_rcv_mbx_u
tk_ref_mbx

常に利用可能
常に利用可能
常に利用可能TK_SUPPORT_USEC
常に利用可能8.3.1.4

8.3.1.5

同期・通信機能TK_SUPPORT_DISWAITK_SUPPORT_DSNAME
TK_SEMAPHORE_MAXCNT
なし
なし
なし
なし
なし
TK_SUPPORT_DISWAITK_SUPPORT_DSNAME
なし
なし
なし
なし
なし
なし
TK_SUPPORT_DISWAITK_SUPPORT_DSNAME
なし
なし
なし
なし
なし

拡張同期・通信機能

API名称
tk_cre_mtx

利用可能条件
常に利用可能tk_del_mtx
tk_loc_mtx
tk_loc_mtx_u
tk_unl_mtx
tk_ref_mtx

常に利用可能
常に利用可能TK_SUPPORT_USEC
常に利用可能
常に利用可能その他関連するプロファイル
TK_SUPPORT_DISWAITK_SUPPORT_DSNAME
なし
なし
なし
なし
なし

μT-Kernel 3.0仕様書

482 / 487

API名称
tk_cre_mbf

利用可能条件
常に利用可能tk_del_mbf
tk_snd_mbf
tk_snd_mbf_u
tk_rcv_mbf
tk_rcv_mbf_u
tk_ref_mbf

常に利用可能
常に利用可能TK_SUPPORT_USEC
常に利用可能TK_SUPPORT_USEC
常に利用可能8.3.1.6

TK_SUPPORT_USERBUF
TK_SUPPORT_AUTOBUFTK_SUPPORT_DISWAITK_SUPPORT_DSNAME
なし
なし
なし
なし
なし
なし

メモリプール管理機能

API名称
tk_cre_mpf

利用可能条件
常に利用可能tk_del_mpf
tk_get_mpf
tk_get_mpf_u
tk_rel_mpf
tk_ref_mpf
tk_cre_mpl

常に利用可能
常に利用可能TK_SUPPORT_USEC
常に利用可能
常に利用可能
常に利用可能tk_del_mpl
tk_get_mpl
tk_get_mpl_u
tk_rel_mpl
tk_ref_mpl

常に利用可能
常に利用可能TK_SUPPORT_USEC
常に利用可能
常に利用可能8.3.1.7

その他関連するプロファイル

その他関連するプロファイル
TK_SUPPORT_USERBUF
TK_SUPPORT_AUTOBUFTK_SUPPORT_DISWAITK_SUPPORT_DSNAME
なし
なし
なし
なし
なし
TK_SUPPORT_USERBUF
TK_SUPPORT_AUTOBUFTK_SUPPORT_DISWAITK_SUPPORT_DSNAME
なし
なし
なし
なし
なし

時間管理機能API名称
tk_set_utc
tk_set_utc_u
tk_set_tim
tk_set_tim_u
tk_get_utc
tk_get_utc_utk_get_tim
tk_get_tim_u
tk_get_otm
tk_get_otm_u

利用可能条件
TK_SUPPORT_UTC
TK_SUPPORT_UTC &&TK_SUPPORT_USEC
TK_SUPPORT_TRONTIMETK_SUPPORT_TRONTIME &&TK_SUPPORT_USEC
TK_SUPPORT_UTC
TK_SUPPORT_UTC &&TK_SUPPORT_USEC
TK_SUPPORT_TRONTIMETK_SUPPORT_TRONTIME &&TK_SUPPORT_USEC
常に利用可能TK_SUPPORT_USEC

その他関連するプロファイル
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし

μT-Kernel 3.0仕様書

483 / 487

API名称
tk_cre_cyc

利用可能条件
常に利用可能tk_cre_cyc_u

TK_SUPPORT_USEC

tk_del_cyc
tk_sta_cyc
tk_stp_cyc
tk_ref_cyc
tk_ref_cyc_utk_cre_alm

常に利用可能
常に利用可能
常に利用可能
常に利用可能TK_SUPPORT_USEC
常に利用可能tk_del_alm
tk_sta_alm
tk_sta_alm_u
tk_stp_alm
tk_ref_alm
tk_ref_alm_u

常に利用可能
常に利用可能TK_SUPPORT_USEC
常に利用可能
常に利用可能TK_SUPPORT_USEC

TK_SUPPORT_ASM
TK_SUPPORT_DSNAME
なし
なし
なし
なし
なし
なし

利用可能条件
常に利用可能
常に利用可能その他関連するプロファイル
TK_SUPPORT_ASM
TK_SUPPORT_ASM

利用可能条件
常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能TK_SUPPORT_LOWPOWER
常に利用可能その他関連するプロファイル
なし
なし
なし
なし
なし
なし
なし

API名称
tk_def_ssy

利用可能条件
TK_SUPPORT_SUBSYSTEM

その他関連するプロファイル

tk_evt_ssy

TK_SUPPORT_SUBSYSTEM &&TK_SUPPORT_SSYEVENTTK_SUPPORT_SUBSYSTEM

8.3.1.8

TK_SUPPORT_ASM
TK_SUPPORT_DSNAME
TK_SUPPORT_ASM
TK_SUPPORT_DSNAME
なし
なし
なし
なし
なし

割込み管理機能

API名称
tk_def_int
tk_ret_int
8.3.1.9

その他関連するプロファイル

システム状態管理機能

API名称
tk_rot_rdq
tk_get_tid
tk_dis_dsp
tk_ena_dsp
tk_ref_sys
tk_set_pow
tk_ref_ver8.3.1.10 サブシステム管理機能

tk_ref_ssy

8.3.2 μT-Kernel/SM
8.3.2.1

システムメモリ管理機能

TK_SUPPORT_SSYEVENTTK_SUPPORT_TASKEXCEPTIONなし
TK_SUPPORT_SSYEVENT

μT-Kernel 3.0仕様書

API名称
Kmalloc
Kcalloc
Krealloc
Kfree

484 / 487

利用可能条件
TK_SUPPORT_MEMLIBTK_SUPPORT_MEMLIBTK_SUPPORT_MEMLIBTK_SUPPORT_MEMLIB

その他関連するプロファイル
なし
なし
なし
なし

その他関連するプロファイル
なし
なし
なし
なし

tk_swri_dev
tk_swri_dev_dtk_wai_dev
tk_wai_dev_u
tk_sus_dev
tk_get_dev
tk_ref_dev
tk_oref_dev
tk_lst_dev
tk_evt_dev
tk_def_dev
tk_ref_idv
openfnclosefn
execfn

利用可能条件
常に利用可能
常に利用可能
常に利用可能TK_SUPPORT_LARGEDEV &&TK_SUPPORT_USEC
常に利用可能TK_SUPPORT_LARGEDEV
常に利用可能TK_SUPPORT_LARGEDEV &&TK_SUPPORT_USEC
常に利用可能TK_SUPPORT_LARGEDEV
常に利用可能TK_SUPPORT_USEC
TK_SUPPORT_LOWPOWER
常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能waitfn

常に利用可能abortfn

常に利用可能eventfn

常に利用可能8.3.2.2

デバイス管理機能

API名称
tk_opn_dev
tk_cls_dev
tk_rea_dev
tk_rea_dev_dutk_srea_dev
tk_srea_dev_dtk_wri_dev
tk_wri_dev_du8.3.2.3

なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
TK_SUPPORT_LARGEDEVTK_SUPPORT_USEC
TK_SUPPORT_LARGEDEVTK_SUPPORT_USEC
TK_SUPPORT_LARGEDEV
なし

割込み管理機能

API名称
DI
EI
isDI
SetCpuIntLevel
GetCpuIntLevel
EnableInt

利用可能条件
常に利用可能
常に利用可能
常に利用可能TK_SUPPORT_CPUINTLEVELTK_SUPPORT_CPUINTLEVELTK_SUPPORT_INTCTRL

DisableInt

TK_SUPPORT_INTCTRL

その他関連するプロファイル
なし
なし
なし
なし
なし
TK_HAS_ENAINTLEVELなし

μT-Kernel 3.0仕様書

API名称
ClearInt
EndOfInt
CheckInt
SetIntMode
SetCtrlIntLevel
GetCtrlIntLevel

485 / 487

利用可能条件
TK_SUPPORT_INTCTRLTK_SUPPORT_INTCTRLTK_SUPPORT_INTCTRLTK_SUPPORT_INTMODE
TK_SUPPORT_CTRLINTLEVELTK_SUPPORT_CTRLINTLEVEL

その他関連するプロファイル
なし
なし
なし
なし
なし
なし

利用可能条件
TK_SUPPORT_IOPORTTK_SUPPORT_IOPORTTK_SUPPORT_IOPORTTK_SUPPORT_IOPORT &&TK_HAS_DOUBLEWORD
TK_SUPPORT_IOPORTTK_SUPPORT_IOPORTTK_SUPPORT_IOPORTTK_SUPPORT_IOPORT &&TK_HAS_DOUBLEWORD
TK_SUPPORT_MICROWAITTK_SUPPORT_MICROWAIT

その他関連するプロファイル
なし
なし
なし
なし

利用可能条件
TK_SUPPORT_LOWPOWER
TK_SUPPORT_LOWPOWER

その他関連するプロファイル
なし
なし

利用可能条件
TK_SUPPORT_SYSCONF
TK_SUPPORT_SYSCONF

その他関連するプロファイル
なし
なし

API名称
SetCacheMode

利用可能条件
TK_SUPPORT_CACHECTRL &&TK_SUPPORT_SETCACHEMODE

その他関連するプロファイル

ControlCache

TK_SUPPORT_CACHECTRL

8.3.2.4

I/Oポートアクセスサポート機能

API名称
out_b
out_h
out_w
out_d
in_b
in_h
in_w
in_d
WaitUsec
WaitNsec
8.3.2.5

システム構成情報管理機能

API名称
tk_get_cfn
tk_get_cfs
8.3.2.7

8.3.2.8

なし
なし

省電力機能

API名称
low_pow
off_pow
8.3.2.6

なし
なし
なし
なし

メモリキャッシュ制御機能

TK_SUPPORT_WBCACHETK_SUPPORT_WTCACHE
なし

物理タイマ機能

API名称
StartPhysicalTimer

利用可能条件
TK_SUPPORT_PTIMER

その他関連するプロファイル
TK_MAX_PTIMER

μT-Kernel 3.0仕様書

486 / 487

API名称
StopPhysicalTimer

利用可能条件
TK_SUPPORT_PTIMER

GetPhysicalTimerCountTK_SUPPORT_PTIMER

DefinePhysicalTimerHandler

TK_SUPPORT_PTIMER

GetPhysicalTimerConfig

TK_SUPPORT_PTIMER

その他関連するプロファイル
TK_MAX_PTIMER
TK_MAX_PTIMER
TK_MAX_PTIMER
TK_MAX_PTIMER

8.3.2.9

ユーティリティ機能

API名称
SetOBJNAMECreateLock
DeleteLock
Lock
UnlockCreateMLock
DeleteMLock
MLock
MLockTmo
MLockTmo_u
MUnlock

利用可能条件
常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能
常に利用可能TK_SUPPORT_USEC
常に利用可能その他関連するプロファイル
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし

利用可能条件
TK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_SUBSYSTEM &&TK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPT

その他関連するプロファイル
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし

8.3.3 μT-Kernel/DS
8.3.3.1

カーネル内部状態取得機能

API名称
td_lst_tsk
td_lst_sem
td_lst_flg
td_lst_mbx
td_lst_mtx
td_lst_mbf
td_lst_mpf
td_lst_mpl
td_lst_cyc
td_lst_alm
td_lst_ssy
td_rdy_que
td_sem_que
td_flg_que
td_mbx_que
td_mtx_que
td_smbf_que
td_rmbf_que
td_mpf_que
td_mpl_que

なし
なし
なし
なし
なし
なし
なし
なし
なし

μT-Kernel 3.0仕様書

487 / 487

API名称
td_ref_tsk

利用可能条件
TK_SUPPORT_DBGSPT

td_ref_tex

TK_SUPPORT_DBGSPT &&TK_SUPPORT_TASKEXCEPTIONTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPT &&TK_SUPPORT_USEC
TK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPT &&TK_SUPPORT_USEC
TK_SUPPORT_DBGSPTTK_SUPPORT_SUBSYSTEM &&TK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPT &&TK_SUPPORT_REGOPSTK_SUPPORT_DBGSPT &&TK_SUPPORT_REGOPSTK_SUPPORT_DBGSPT &&TK_SUPPORT_UTC
TK_SUPPORT_DBGSPT &&TK_SUPPORT_UTC &&TK_SUPPORT_USEC
TK_SUPPORT_DBGSPT &&TK_SUPPORT_TRONTIMETK_SUPPORT_DBGSPT &&TK_SUPPORT_TRONTIME &&TK_SUPPORT_USEC
TK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPT &&TK_SUPPORT_USEC
TK_SUPPORT_DSNAME
TK_SUPPORT_DSNAME

td_ref_sem
td_ref_flg
td_ref_mbx
td_ref_mtx
td_ref_mbf
td_ref_mpf
td_ref_mpl
td_ref_cyc
td_ref_cyc_u
td_ref_alm
td_ref_alm_u
td_ref_sys
td_ref_ssy
td_get_reg
td_set_reg
td_get_utc
td_get_utc_u

td_get_tim
td_get_tim_u

td_get_otm
td_get_otm_u
td_ref_dsname
td_set_dsname
8.3.3.2

その他関連するプロファイル
TK_SUPPORT_DISWAITK_SUPPORT_TASKEXCEPTIONTK_SUPPORT_TASKEVENTTK_HAS_SYSSTACK
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし

なし
なし

なし
なし
なし
なし

実行トレース機能

API名称
td_hok_svc
td_hok_dsp
td_hok_int

利用可能条件
TK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPTTK_SUPPORT_DBGSPT

その他関連するプロファイル
なし
なし
なし