FM3 ファミリ T-REALOS/M3 API リファレンス T-Kernel 仕様準拠 Support Soft Manual Publication Number CM81-00210 FM3ÉtÉ@É~Éä Cover Sheet Revision 2.1 Issue Date January 31, 2014 FM3 ファミリ T-REALOS/M3 API リファレンス T-Kernel 仕様準拠 Support Soft Manual FM3ÉtÉ@É~Éä Cover Sheet Support Soft Ma nual はじめに ■ 本書の目的と対象読者 本書は , T-REALOS/M3( 以降 , T-REALOS とよびます ) のアプリケーションプログラ ムを作成する方を対象としており , T-REALOS API について記述しています。TREALOS API について確認したい時に , 適宜本書を参照してください。また , 本書をご 覧になる前に , 「T-REALOS/M3 ユーザーズガイド」を一読されることをお勧めしま す。 T-Kernel 仕様は , T-Engine フォーラムが策定したオープンなリアルタイム OS の仕様で す。T-Kernel の仕様書は , T-Engine フォーラムのホームページ (http://www.t-engine.org/) から入手できます。T-Kernel の原著作権は , 坂村健氏に属しています。T-Kernel 仕様 の著作権は , T-Engine フォーラムに属しています。 ■ 商標 TRON は , "The Real-time Operating system Nucleus" の略称です。 ITRON は , "Industrial TRON" の略称です。 µITRON は , "Micro Industrial TRON" の略称です。 T-Kernel および µT-Kernel は , コンピュータの仕様に対する名称であり , 特定の商品な いしは商品群を指すものではありません。 FR は , Spansion LLCの製品です。 FM3 は , Spansion LLCの製品です。 REALOS, SOFTUNE はSpansion LLCの商標です。 その他 , 本書で登場するシステム名 , 製品名は , それぞれの会社もしくは組織の商標で す。なお , 本文中ではTM マークや ® マークを必ずしも明記していません。 ■ 本書の全体構成 本書は , 以下に示す 4 つの章と付録から構成されています。 第 1 章 概要 T-REALOS の API を使用するうえでの基本的な事項を説明します。 第 2 章 データ型 T-REALOS で規定される C 言語のデータ型について説明します。 第 3 章 システムコールインタフェース T-REALOS でサポートしている T-Kernel 仕様のシステムコールのインタフェー スを説明します。 第 4 章 デバイスドライバ インタフェース デバイスドライバインタフェースを説明します。 付録 エラーコード , 定数マクロ , ITRON 仕様 OS からの移行時の注意事項について説明 します。また , アルファベット順のシステムコール索引を掲載します。 January 31, 2014, CM81-00210-2a i Su pp or t So ft Manu al ■ 参考マニュアル 本システムを使用する際には , 必要に応じて次に示すマニュアルを参照してください。 「T-REALOS/M3 ユーザーズガイド」( 以降 , 「ユーザーズガイド」とよびます ) ii CM81-00210-2a, January 31, 2014 Support Soft Ma nual ■ T-REALOS のマニュアル体系 T-REALOS のマニュアルは , 以下の 2 分冊になっています。 T-REALOS を初めてお使いになる方は , 最初に「ユーザーズガイド」をお読みくださ い。 T-Kernel仕様準拠 T-REALOSの機能全般,ユーザプログラムの作成方法, システム構築手順について説明しています。 T-REALOS/M3 ユーザーズガイド T-Kernel仕様準拠 T-REALOS/M3 APIリファレンス January 31, 2014, CM81-00210-2a T-REALOS APIの詳細について 説明しています(本書)。 iii Su pp or t So ft Manu al ■ 本書の読み方 ● 記号の意味 本書では , システムコールのパラメータの記述形式を以下の表記に従って表現してい ます。 表記号の意味 記号 [] [ ] 内の要素は , 記述が省略可能であることを示します。 | | 前後の要素の中からどれか一つの記述を選択することを示します。 | := iv 説明 前後の要素を同時に選択できます。 前の要素は後の要素の値をとります。 CM81-00210-2a, January 31, 2014 Support January 31, 2014, CM81-00210-2a Soft Ma nual v Su pp or t vi So ft Manu al CM81-00210-2a, January 31, 2014 Support Soft Ma nual 目次 第1章 1.1 1.2 1.3 1.4 第2章 2.1 2.2 第3章 概要 ............................................................................................................ 1 用語の説明.............................................................................................................................. 2 T-REALOS API の概要 ......................................................................................................... 4 実装定義および実装依存仕様 ................................................................................................. 5 拡張仕様 ................................................................................................................................. 8 データ型..................................................................................................... 9 汎用的なデータ型と定数マクロ ........................................................................................... 10 T-Kernel 固有の意味を持つデータ型と定数マクロ ............................................................ 12 システムコールインタフェース............................................................... 15 3.1 システムコール一覧 ............................................................................................................. 16 3.2 システムコール説明内容 ...................................................................................................... 23 3.3 タスク管理機能のシステムコール........................................................................................ 25 3.3.1 tk_cre_tsk(Create Task) ............................................................................................. 26 3.3.2 tk_del_tsk(Delete Task).............................................................................................. 29 3.3.3 tk_sta_tsk (Start Task)................................................................................................ 30 3.3.4 tk_ext_tsk(Exit Task) .................................................................................................. 31 3.3.5 tk_exd_tsk(Exit and Delete Task)............................................................................... 32 3.3.6 tk_ter_tsk(Terminate Task)......................................................................................... 33 3.3.7 tk_chg_pri(Change Task Priority) ............................................................................... 35 3.3.8 tk_get_reg(Get Task Registers) ................................................................................. 38 3.3.9 tk_set_reg(Set Task Registers) .................................................................................. 40 3.3.10 tk_ref_tsk(Refer Task Status)..................................................................................... 42 3.4 タスク付属同期機能のシステムコール................................................................................. 46 3.4.1 tk_slp_tsk(Sleep Task) ............................................................................................... 47 3.4.2 tk_wup_tsk(Wakeup Task) ......................................................................................... 49 3.4.3 tk_can_wup(Cancel Wakeup Task)............................................................................ 51 3.4.4 tk_rel_wai(Release Wait)............................................................................................ 53 3.4.5 tk_sus_tsk(Suspend Task) ......................................................................................... 55 3.4.6 tk_rsm_tsk(Resume Task).......................................................................................... 57 3.4.7 tk_frsm_tsk(Force Resume Task) .............................................................................. 59 3.4.8 tk_dly_tsk(Delay Task) ............................................................................................... 61 3.5 同期・通信機能のシステムコール........................................................................................ 62 3.5.1 セマフォ機能のシステムコール ................................................................................. 63 3.5.1.1 tk_cre_sem(Create Semaphore) ........................................................................... 64 3.5.1.2 tk_del_sem(Delete Semaphore)............................................................................ 66 3.5.1.3 tk_sig_sem(Signal Semaphore) ............................................................................ 67 3.5.1.4 tk_wai_sem(Wait on Semaphore) ......................................................................... 69 3.5.1.5 tk_ref_sem(Refer Semaphore Status)................................................................... 71 3.5.2 3.5.2.1 3.5.2.2 3.5.2.3 3.5.2.4 イベントフラグ機能のシステムコール ...................................................................... 73 tk_cre_flg(Create Event Flag) ............................................................................... 74 tk_del_flg(Delete Event Flag) ................................................................................ 76 tk_set_flg(Set Event Flag) ..................................................................................... 77 tk_clr_flg(Clear Event Flag)................................................................................... 78 January 31, 2014, CM81-00210-2a vii Su pp or t So ft Manu al 3.5.2.5 3.5.2.6 tk_wai_flg(Wait Event Flag)................................................................................... 79 tk_ref_flg(Refer Event Flag Status) ....................................................................... 83 3.5.3 3.5.3.1 3.5.3.2 3.5.3.3 3.5.3.4 3.5.3.5 メールボックス機能のシステムコール ...................................................................... 85 tk_cre_mbx(Create Mailbox) ................................................................................. 86 tk_del_mbx(Delete Mailbox).................................................................................. 88 tk_snd_mbx(Send Message to Mailbox) ............................................................... 89 tk_rcv_mbx(Receive Message from Mailbox) ....................................................... 91 tk_ref_mbx(Refer Mailbox Status)......................................................................... 93 3.6 拡張同期・通信機能のシステムコール................................................................................. 95 3.6.1 ミューテックス機能のシステムコール ...................................................................... 96 3.6.1.1 tk_cre_mtx(Create Mutex)..................................................................................... 97 3.6.1.2 tk_del_mtx(Delete Mutex) ..................................................................................... 99 3.6.1.3 tk_loc_mtx(Lock Mutex) ...................................................................................... 100 3.6.1.4 tk_unl_mtx(Unlock Mutex)................................................................................... 103 3.6.1.5 tk_ref_mtx(Refer Mutex Status) .......................................................................... 105 3.6.2 3.6.2.1 3.6.2.2 3.6.2.3 3.6.2.4 3.6.2.5 メッセージバッファ機能のシステムコール ............................................................. 107 tk_cre_mbf(Create Message Buffer) ................................................................... 108 tk_del_mbf(Delete Message Buffer).................................................................... 111 tk_snd_mbf(Send Message to Message Buffer) ................................................. 112 tk_rcv_mbf(Receive Message from Message Buffer) ......................................... 114 tk_ref_mbf(Refer Message Buffer Status)........................................................... 116 3.6.3 3.6.3.1 3.6.3.2 3.6.3.3 3.6.3.4 3.6.3.5 3.6.3.6 3.6.3.7 ランデブポート機能のシステムコール .................................................................... 118 tk_cre_por(Create Port for Rendezvous) ............................................................ 119 tk_del_por(Delete Port for Rendezvous) ............................................................. 121 tk_cal_por(Call Port for Rendezvous) ................................................................. 122 tk_acp_por(Accept Port for Rendezvous) ........................................................... 125 tk_fwd_por(Forward Rendezvous to Another Port) ............................................. 128 tk_rpl_rdv(Reply Rendezvous) ............................................................................ 132 tk_ref_por(Refer Port Status) .............................................................................. 134 3.7 メモリプール管理機能のシステムコール ........................................................................... 136 3.7.1 固定長メモリプール機能のシステムコール ............................................................. 137 3.7.1.1 tk_cre_mpf(Create Fixed-size Memory Pool) ...................................................... 138 3.7.1.2 tk_del_mpf(Delete Fixed-size Memory Pool) ...................................................... 141 3.7.1.3 tk_get_mpf(Get Fixed-size Memory Block) ......................................................... 142 3.7.1.4 tk_rel_mpf(Release Fixed-size Memory Block)................................................... 144 3.7.1.5 tk_ref_mpf(Refer Fixed-size Memory Pool Status) ............................................. 146 3.7.2 3.7.2.1 3.7.2.2 3.7.2.3 3.7.2.4 3.7.2.5 可変長メモリプール機能のシステムコール ............................................................. 148 tk_cre_mpl(Create Variable-size Memory Pool).................................................. 149 tk_del_mpl(Delete Variable-size Memory Pool) .................................................. 152 tk_get_mpl(Get Variable-size Memory Block) ..................................................... 153 tk_rel_mpl(Release Variable-size Memory Block)............................................... 155 tk_ref_mpl(Refer Variable-size Memory Pool Status) ......................................... 157 3.8 時間管理機能のシステムコール ......................................................................................... 159 3.8.1 システム時刻管理機能のシステムコール................................................................. 160 3.8.1.1 tk_set_tim(Set Time) ........................................................................................... 161 3.8.1.2 tk_get_tim(Get Time)........................................................................................... 163 3.8.1.3 tk_get_otm(Get Operating Time)......................................................................... 164 3.8.1.4 isig_tim(Signal Time)........................................................................................... 165 3.8.2 viii 周期ハンドラ機能のシステムコール ........................................................................ 166 CM81-00210-2a, January 31, 2014 Support Soft Ma nual 3.8.2.1 3.8.2.2 3.8.2.3 3.8.2.4 3.8.2.5 tk_cre_cyc(Create Cyclic Handler)...................................................................... 167 tk_del_cyc(Delete Cyclic Handler) ...................................................................... 170 tk_sta_cyc(Start Cyclic Handler) ......................................................................... 171 tk_stp_cyc(Stop Cyclic Handler) ......................................................................... 172 tk_ref_cyc(Refer Cyclic Handler Status) ............................................................. 173 3.8.3 3.8.3.1 3.8.3.2 3.8.3.3 3.8.3.4 3.8.3.5 アラームハンドラ機能のシステムコール................................................................. 175 tk_cre_alm(Create Alarm Handler)...................................................................... 176 tk_del_alm(Delete Alarm Handler) ...................................................................... 178 tk_sta_alm(Start Alarm Handler) ......................................................................... 179 tk_stp_alm(Stop Alarm Handler) ......................................................................... 180 tk_ref_alm(Refer Alarm Handler Status) ............................................................. 181 3.9 割込み管理機能のシステムコール...................................................................................... 183 3.9.1 tk_def_int(Define Interrupt Handler) ......................................................................... 184 3.9.2 tk_ret_int(Return from Interrupt Handler) ................................................................. 186 3.9.3 DI .............................................................................................................................. 187 3.9.4 EI .............................................................................................................................. 188 3.9.5 isDI ........................................................................................................................... 189 3.10 システム状態管理機能のシステムコール ........................................................................... 190 3.10.1 tk_rot_rdq(Rotate Ready Queue) ............................................................................. 191 3.10.2 tk_get_tid(Get Task Identifier) .................................................................................. 193 3.10.3 tk_dis_dsp(Disable Dispatch) ................................................................................... 194 3.10.4 tk_ena_dsp(Enable Dispatch) .................................................................................. 196 3.10.5 tk_ref_sys(Refer System Status).............................................................................. 197 3.10.6 tk_ref_ver(Refer Version Information) ...................................................................... 199 3.11 サブシステム機能のシステムコール .................................................................................. 201 3.11.1 tk_def_ssy(Define Subsystem)................................................................................. 202 3.11.2 tk_ref_ssy(Refer Subsystem Status) ........................................................................ 205 3.12 デバイス管理機能のシステムコール .................................................................................. 206 3.12.1 tk_def_dev(Define Device) ....................................................................................... 207 3.12.2 tk_ref_idv(Refer Initial Device Information) .............................................................. 210 3.12.3 tk_opn_dev(Open Device)........................................................................................ 211 3.12.4 tk_cls_dev(Close Device) ......................................................................................... 213 3.12.5 tk_rea_dev(Read Device)......................................................................................... 214 3.12.6 tk_srea_dev(Synchronous Read Device) ................................................................. 216 3.12.7 tk_wri_dev(Write Device).......................................................................................... 218 3.12.8 tk_swri_dev(Synchronous Write Device).................................................................. 220 3.12.9 tk_wai_dev(Wait Device) .......................................................................................... 222 3.12.10 tk_sus_dev(Suspend Device)................................................................................... 224 3.12.11 tk_get_dev(Get Device)............................................................................................ 226 3.12.12 tk_ref_dev(Refer Device).......................................................................................... 227 3.12.13 tk_oref_dev(Refer Device)........................................................................................ 229 3.12.14 tk_lst_dev(List Device) ............................................................................................. 231 3.12.15 tk_evt_dev(Event Device)......................................................................................... 233 January 31, 2014, CM81-00210-2a ix Su pp or t 第4章 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 デバイスドライバインタフェース ......................................................... 235 付録 A 付録 B 付録 C 付録 D x Manu al デバイスドライバインタフェース...................................................................................... 236 デバイス名.......................................................................................................................... 237 デバイス ID......................................................................................................................... 238 デバイスディスクリプタ .................................................................................................... 240 リクエスト ID ..................................................................................................................... 241 データ番号.......................................................................................................................... 242 属性データ.......................................................................................................................... 243 事象通知 ............................................................................................................................. 245 デバイスのサスペンド / リジューム ................................................................................... 247 入出力要求のデータ形式 .................................................................................................... 248 デバイス処理関数 ............................................................................................................... 250 付録 索引 So ft ............................................................................................................... 257 エラーコード一覧.......................................................................................................... 258 定数マクロ一覧 ............................................................................................................. 259 ITRON 仕様 OS からの移行時の注意点 ...................................................................... 263 システムコール索引 ...................................................................................................... 264 ............................................................................................................... 269 CM81-00210-2a, January 31, 2014 Support Soft Ma nual 第1章 概要 T-REALOS の API を使用するうえでの基本的な事 項を説明します。 1.1 用語の説明 1.2 T-REALOS API の概要 1.3 実装定義および実装依存仕様 1.4 拡張仕様 January 31, 2014, CM81-00210-2a 1 第 1 章 概要 1.1 用語の説明 Su pp or t So ft Manu al 用語の説明 1.1 T-REALOS で使用する基本的な用語を説明します。 ■ T-REALOS の基本的な用語 表 1.1-1 に , T-REALOS で使用する基本的な用語を示します。 表 1.1-1 T-REALOS の基本的な用語一覧 (1 / 2) 用語 2 概要 カーネル OS 機能を提供するプログラムをカーネルとよびます。 ユーザプログラム T-REALOS の機能を使用したアプリケーションプログラムを指します。 ユーザ作成である点を明示するため , 本書は以降 , ユーザプログラムと表記 します。 タスク タスクは , ユーザプログラムを構成する最も基本的な単位です。複数のタ スクの協調動作により , ユーザプログラムの処理を実現します。 準タスク タスクコンテキストを持つハンドラを準タスクとよびます。T-Kernel 仕様 の拡張 SVC ハンドラがこの準タスクに相当します。 準タスクでは , 待ち状態に入ることができ , ディスパッチできます。また , シ ステムコールの発行制約はタスクに準じます。 非タスク 非タスクは , タスク以外の OS で管理する実行単位です。準タスク , 割込み ハンドラ , タイムイベントハンドラが該当します。 タスク独立部 タスクコンテキストを持たないハンドラをタスク独立部とよびます。割込 みハンドラ , タイムイベントハンドラ , 初期化ルーチンが該当します。タス ク独立部で , タスクが待ち状態になるシステムコール (tk_slp_tsk など ) は使 用できません。 ディスパッチ 実行するタスクの切換えをディスパッチとよびます。また , ディスパッチ を実現するカーネル内の機構をディスパッチャとよびます。 プリエンプト タスクが保持する CPU の実行権を奪い取られる処理を指します。 API T-REALOS の機能を使ったユーザプログラムを作成するためのインター フェースです。 システムコール OS 機能を実現し , ユーザプログラムから直接呼び出される関数群をシステ ムコールとよびます。 オブジェクト カーネルが操作対象とする資源をオブジェクトとよびます。具体的には , タスクや同期・通信機能を実現するセマフォ , メールボックスなどが該当 します。 コンテキスト プログラムを実行する環境 ( 実体はプログラムの実行が中断された時点の CPU レジスタの値をメモリに保存したもの ) をコンテキストとよびます。 現在優先度 タスクの現時点での優先度です。ディスパッチャはこの優先度に従いタス クを切り換えます。 通常 , 単に「優先度」とよぶ場合は , この現在優先度を指します。 起動時優先度 タスク起動時に最初に設定する優先度です。起動時優先度は , タスク生成 時に指定できますが , タスク生成後には変更できません。 CM81-00210-2a, January 31, 2014 第 1 章 概要 1.1 用語の説明 Support Soft Ma nual 表 1.1-1 T-REALOS の基本的な用語一覧 (2 / 2) 用語 概要 ベース優先度 タスクの基本となる優先度です。tk_chg_pri により , ユーザプログラムから 変更できます。 ミューテックス機能を使用した場合に , OS 側が一時的に現在優先度を変更 する場合があります。ミューテックス機能を使用しない場合は , ベース優 先度と現在優先度は常に同じ値になります。 優先順位 実行可能状態のタスクが複数存在する場合 , それらのタスクに実行権を与 える順番を指します。優先順位が高いタスクほど , 先に実行権が与えられ ます。 優先度が高いタスクほど優先順位は高くなり , 同一優先度のタスクの優先 順位は , 先に実行可能状態になったタスクほど高くなります。 システムダウン カーネル内部でユーザシステムの処理続行が不可能と判断した場合 , カー ネルでシステムダウンが発生します。システムダウンが発生した場合 , カーネル内部の特定番地にジャンプして , そこで無限ループすることによ り , ユーザシステムの処理を停止します。 コンフィギュレータ T-REALOS 独自の機能で , カーネルコンフィギュレーション ( 最大のタスク 優先度 , オブジェクトの最大数 , システムのスタックサイズなどをユーザ指 定できる機能 ) を実行するためのツールです。 詳細は , ユーザーズガイドの以下の節を参照してください。 ・「3.13 カーネルコンフィギュレーション」 ・「5.3 カーネルコンフィギュレーション」 January 31, 2014, CM81-00210-2a 3 第 1 章 概要 1.2 T-REALOS API の概要 Su pp or t 1.2 So ft Manu al T-REALOS API の概要 T-REALOS API を構成する要素について説明します。 ■ データ型 char, intなどの汎用的な型を別名で再定義することにより, T-Kernel仕様は独自の型を 定義しています。これは , データの使用方法をより厳密にし , プログラムミスを防ぐこ とを目的としています。データ型の詳細は , 「第 2 章 データ型」を参照してください。 ■ システムコール T-REALOS の提供するシステムコールを呼び出すことで , ユーザプログラムは排他制 御やシステムの状態を参照できます。ほとんどのシステムコールがこの関数の復帰値 としてエラーコードを返します。 ● システムコールの形式 エラーコード = システムコール関数名 ( パラメータ ,,); 例 ) ercd = tk_del_tsk(task_id); 各システムコールの詳細は , 「第 3 章 システムコールインタフェース」を参照してく ださい。 ■ エラーコード システムコールの復帰値は , エラーが発生した場合は負の値のエラーコード , 処理を正 常に終了した場合は E_OK(=0)または正の値となります。 システムコールが返すエラーコードは , 「第 3 章 システムコールインタフェース」を 参照してください。また , T-REALOS で規定されたエラーコードの一覧とその意味は , 「付録 A エラーコード一覧」を参照してください。 4 CM81-00210-2a, January 31, 2014 第 1 章 概要 1.3 実装定義および実装依存仕様 Support 1.3 Soft Ma nual 実装定義および実装依存仕様 実装定義および実装依存仕様を説明します。 ■ 実装定義 実装定義は , T-Kernel で規定していない仕様です。T-Kernel 仕様に準拠した OS 間で あっても , 実装定義の仕様は互換性が保証されないため注意してください。 T-REALOS の実装定義を表 1.3-1 に示します。 表 1.3-1 T-REALOS 実装定義一覧 (1 / 3) 分類 動作 実装定義項目 内容 アセンブラで記述したプログラムからシ ステムコールを呼び出す場合のインタ フェース アセンブラから C 関数を呼び出すときの手順に 従います。 システムコールの実装方法 関数呼出しで実装しています。 ソフトウェアトラップ呼出しは未サポートで す。 特定のシステムコール * をタスク部以外 から呼び出した場合の動作 表 3.1-1 および「第 3 章 システムコールインタ フェース」を参照してください。 呼び出した処理に復帰しないシステム コール (tk_ext_tsk, tk_exd_tsk, tk_ret_int) でエラーが発生した場合の動作 システムコールのエラールーチンが登録済みの 場合 , そのエラールーチンを呼び出します。 以下の場合の動作は保証しません。 ・tk_ret_int でエラーが発生した場合 ・エラールーチンが登録されていない場合 システムコールの機能コード 機能コードは未使用です。 メールボックスのメッセージヘッダ構造 「3.5.3.3 tk_snd_mbx(Send Message to Mailbox)」 の「■解説」を参照してください。 ランデブ番号の付与方法 下位 16 ビットがタスク ID, 上位 16 ビットがラ ンデブ受付け順に採番する一意の番号となりま す。 TA_ASM 属性のタイムイベントハンド ラ 未サポートです。 January 31, 2014, CM81-00210-2a 5 第 1 章 概要 1.3 実装定義および実装依存仕様 Su pp or t So ft Manu al 表 1.3-1 T-REALOS 実装定義一覧 (2 / 3) 分類 動作 実装定義項目 内容 複数の割込みハンドラやタイムイベント ハンドラの同時起動 ・タイムイベントハンドラが複数同時に起動し た場合 1 つのタイムイベントハンドラの実行が終了し てから , 別のタイムイベントハンドラが実行さ れます。 ・割込みハンドラ実行中に , より優先度の高い 割込みが発生した場合 実行中の割込みハンドラの処理を中断し , 優先 度の高い割込みハンドラを実行します。 その後 , 中断した割込みハンドラの処理に戻り ます。 ・タイムイベントハンドラ実行中に , タイマ割 込みより優先度の高い割込みが発生した場合 実行中の割込みハンドラの処理を中断し , 優先 度の高い割込みハンドラを実行します。 その後 , 中断したタイムイベントハンドラの処 理に戻ります。 ・割込みハンドラ実行中に , より優先度の高い タイマ割込みのタイムイベントハンドラが起動 された場合 実行中の割込みハンドラの処理を中断し , タイム イベントハンドラを実行します。その後 , 中断し た割込みハンドラの処理に戻ります。 TA_ASM 属性の割込みハンドラが起動 した時点の状態 ( システムコール呼出し の可否など ) タスク独立部として扱います。 割込みハンドラ定義解除後に割込みが発 生した場合の動作 システムダウンが発生します。 TA_ASM 属性の割込みハンドラに入っ た時点におけるスタックやレジスタの 状態 システムコールの呼出しの可否 「ユーザーズガイド 『4.8 割込みハンドラ』」を 参照してください。 システムコールを呼び出す方法 割込みハンドラから OS を介さず に復帰 する方法 6 T_REGS, T_EIT, T_CREGS の内容 以下を参照してください。 ・ 「3.3.8 tk_get_reg(Get Task Registers)」 ・ 「3.3.9 tk_set_reg(Set Task Registers)」 CPU 割込み制御機能 (DI, EI, isDI) の パラメータ (iststs) 内容 以下を参照してください。 ・ 「3.9.3 DI」 ・ 「3.9.4 EI」 ・ 「3.9.5 isDI」 割込みハンドラの第 2 引数 未サポートです。 デバイスの事象通知用メッセージバッ ファの使用 使用します。 CM81-00210-2a, January 31, 2014 第 1 章 概要 1.3 実装定義および実装依存仕様 Support Soft Ma nual 表 1.3-1 T-REALOS 実装定義一覧 (3 / 3) 分類 実装定義項目 内容 タイムイベントハンドラから tk_ret_int を呼び出した場合の E_CTX のエラー チェック エラーチェックは行いません。 E_OACV のエラー対象となるシステム オブジェクトの定義 , およびエラー発生 条件 E_OACV のエラー対象となるオブジェクトとし てデバイスを定義しています。また , 本エラー の発生条件は , 「3.12 デバイス管理機能のシス テムコール」を参照してください。 tk_wup_tsk の起床要求キューイング数最 大値 32767(0x7fff) tk_sus_tsk の強制待ち要求のネスト数最 大値 32767(0x7fff) セマフォカウントの最大値 2147483647(0x7fffffff) 動作 数値 使用可能なサブシステム ID の最大値 「ユーザーズガイド 『3.13 カーネルコンフィ ギュレーション』」を参照してください。 指定可能なサブシステムの優先度 (ssypri) の最大値 16 tk_ref_ssy での ssypri, resblksz の値 不定値 tk_def_int の引数 , dintno の値 割込みベクタ番号 デバイスのサスペンド禁止要求カウント の最大値 2147483647(0x7fffffff) * : タスク部以外からの呼出しが可能と明記されていないもの ■ 実装依存 実装依存は , ハードウェアの相違により OS の挙動が変わる仕様です。T-Kernel 仕様 準拠の OS 間でも互換性が保証されないため注意してください。 T-REALOS の実装依存項目を表 1.3-2 に示します。 表 1.3-2 T-REALOS 実装依存一覧 分類 実装依存項目 定義 TA_ASM 属性が指定された場合のタスクの 形式 未サポートです。 E_MACV のエラー検出 本エラーは未サポートです。 動作 実装依存で発生する E_CTX エラー January 31, 2014, CM81-00210-2a 内容 「第 3 章 システムコールインタフェース」 の各システムコールの説明において , 発生す る E_CTX のエラーはすべて記載していま す。 7 第 1 章 概要 1.4 拡張仕様 Su pp or t 1.4 So ft Manu al 拡張仕様 T-REALOS は , T-Kernel 仕様を拡張している部分があります。これらの拡張仕様を 説明します。 ■ 拡張仕様 T-Kernel 仕様を拡張している項目を表 1.4-1 に示します。 表 1.4-1 T-REALOS 拡張定義一覧 拡張定義項目 初期化 ルーチン 定義内容 タスクの起動前に実行するプログラムを登録します。機能の詳細は , 「ユーザー ズガイド 『2.2.1 タスク』」を参照してください。 登録可能な初期化ルーチンの最大数 エラー ルーチン カーネルが何らかのエラーを検出したときに起動するプログラムを登録します。 機能の詳細は , 「ユーザーズガイド 『2.3.1 タスク独立部』」を参照してください。 登録可能なエラールーチンの最大数 8 1 1 isig_tim ユーザプログラムからシステム時刻の更新を行うための機能です。 詳細は「3.8.1.4 isig_tim(Signal Time)」を参照してください。 割込み ハンドラ 静的登録機能 割込みハンドラを静的に登録する機能です。 機能の詳細は , 以下を参照してください。 ・「ユーザーズガイド 『3.12 カーネルコンフィギュレーション』 」 ・ 「ユーザーズガイド 『5.2 カーネルコンフィギュレーション』 」 CM81-00210-2a, January 31, 2014 Support Soft Ma nual 第2章 データ型 T-REALOS で規定される C 言語のデータ型につい て説明します。 2.1 汎用的なデータ型と定数マクロ 2.2 mT-Kernel 固有の意味を持つデータ型と定数マクロ January 31, 2014, CM81-00210-2a 9 第 2 章 データ型 2.1 汎用的なデータ型と定数マクロ Su pp or t 2.1 So ft Manu al 汎用的なデータ型と定数マクロ T-Kernel 仕様で規定されている汎用的なデータ型および定数マクロについて説明し ます。 ■ 汎用的なデータ型 汎用的なデータ型と定数マクロは , 「2.2 mT-Kernel 固有の意味を持つデータ型と定数 マクロ」で説明するデータ型を定義するための基本的なデータ型と定数マクロです。表 2.1-1 および表 2.1-2 に , データ型と定数マクロの一覧を示します。 表 2.1-1 データ型一覧 C 言語での型 型名 10 意味 B signed char 符号付き 8 ビット整数 H signed short 符号付き 16 ビット整数 W signed long 符号付き 32 ビット整数 UB unsigned char 符号なし 8 ビット整数 UH unsigned short 符号なし 16 ビット整数 UW unsigned long 符号なし 32 ビット整数 VB signed char 型が一定しない 8 ビットのデータ VH signed short 型が一定しない 16 ビットのデータ VW signed long 型が一定しない 32 ビットのデータ VP void* 型が一定しないデータへのポインタ _B volatile signed char _H volatile signed short _W volatile signed long _UB volatile unsigned char _UH volatile unsigned short _UW volatile unsigned long INT signed int CPU のビット幅の符号付き整数 UINT unsigned int CPU のビット幅の符号なし整数 ID signed int ID 一般 MSEC signed long 時間一般 (ms) (*FP)() void 関数アドレス一般 (*FUNCP)() signed int 関数アドレス一般 BOOL unsigned int ブール値 TC unsigned short TRON 文字コード volatile 宣言付き CM81-00210-2a, January 31, 2014 第 2 章 データ型 2.1 汎用的なデータ型と定数マクロ Support Soft Ma nual 表 2.1-2 定数マクロ一覧 マクロ名 値 意味 ローカルシンボル定義 LOCAL static EXPORT ( なし ) グローバルシンボル定義 IMPORT extern グローバルシンボル参照 TRUE 1 ブール値の真 FALSE 0 ブール値の偽 TNULL ((TC)0) TRON コード文字列の終端 ( 補足事項 ) VB, VH, VW と B, H, W との相違点は , 前者はビット数だけが分かっており , データ型 の中身が分からないものを表すのに対して , 後者は整数を表すことがはっきりしてい る点です。 タスクのスタックサイズなど , 明らかに負の数にならないパラメータも原則として符 号付き整数 (INT, W) のデータ型となっています。これは , 整数はできる限り符号付き の数として扱う T-Kernel 仕様のルールに基いたものです。また , タイムアウト (TMO tmout) のパラメータでは , これが符号付きの整数であることを利用して TMO_FEVR(=-1) を特殊な意味に使っています。ビットパターンとして扱われるパラメータには符号な しのデータ型があります。 January 31, 2014, CM81-00210-2a 11 第 2 章 データ型 2.2 T-Kernel 固有の意味を持つデータ型と定数マクロ Su pp or t 2.2 So ft Manu al T-Kernel 固有の意味を持つデータ型と定数マクロ T-Kernel 固有の意味を持つデータ型と定数マクロについて説明します。 ■ T-Kernel 固有の意味を持つデータ型の一覧 T-Kernel 固有の意味を持つデータ型と定数マクロは , パラメータの意味を明確にする ために定義されたデータ型と定数マクロです。 表 2.2-1 から表 2.2-3 に出現頻度の高いデータ型と定数マクロの一覧を示します。 なお , すべての定数マクロの一覧は「付録 B 定数マクロ一覧」を参照してください。 表 2.2-1 固有の意味を持つデータ型一覧 ( 構造体以外 ) 型名 データ型 意味 FN INT 機能コード RNO INT ランデブ番号 ATR UW オブジェクト / ハンドラ属性 ER INT エラーコード PRI INT 優先度 TMO W タイムアウト指定 RELTIM UW 相対時間 表 2.2-2 固有の意味を持つデータ型一覧 ( 構造体 ) 型名 SYSTIM メンバ データ型 意味 hi W システム時刻 上位 32 ビット lo UW システム時刻 下位 32 ビット 表 2.2-3 固有の意味を持つ定数マクロ一覧 マクロ名 12 値 意味 NULL 0 無効ポインタ TA_NULL 0 特別な属性を指定しない TMO_POL 0 ポーリング TMO_FEVR -1 永久待ち TSK_SELF 0 自タスク TPRI_INI 0 起動時優先度 TPRI_RUN 0 実行状態のタスクの優先度 CM81-00210-2a, January 31, 2014 第 2 章 データ型 2.2 T-Kernel 固有の意味を持つデータ型と定数マクロ Support Soft Ma nual ( 補足事項 ) 複数のデータ型を複合的に使用するパラメータには , 代表的なデータ型を使用します。 例えば , tk_cre_tsk の復帰値はタスク ID かエラーコードです。主な復帰値はタスク ID なので , データ型は ID となります。 January 31, 2014, CM81-00210-2a 13 第 2 章 データ型 2.2 T-Kernel 固有の意味を持つデータ型と定数マクロ Su pp or t 14 So ft Manu al CM81-00210-2a, January 31, 2014 Support Soft Ma nual 第3章 システムコール インタフェース T-REALOS でサポートしている T-Kernel 仕様の システムコールのインタフェースを説明します。 3.1 システムコール一覧 3.2 システムコール説明内容 3.3 タスク管理機能のシステムコール 3.4 タスク付属同期機能のシステムコール 3.5 同期・通信機能のシステムコール 3.6 拡張同期・通信機能のシステムコール 3.7 メモリプール管理機能のシステムコール 3.8 時間管理機能のシステムコール 3.9 割込み管理機能のシステムコール 3.10 システム状態管理機能のシステムコール 3.11 サブシステム機能のシステムコール 3.12 デバイス管理機能のシステムコール January 31, 2014, CM81-00210-2a 15 第 3 章 システムコールインタフェース 3.1 システムコール一覧 Su pp or t 3.1 So ft Manu al システムコール一覧 T-REALOS でサポートしているシステムコールを説明します。 ■ システムコール一覧 表 3.1-1 に T-REALOS が提供しているシステムコールの一覧を示します。 T-REALOS は , T-Kernel 仕様の「デバッガサポート機能」以外のすべてのシステムコー ルをサポートしています。 各システムコールの詳細は , 「3.2 システムコール説明内容」以降を参照してください。 表 3.1-1 システムコール一覧 (1 / 7) 呼出し可否 分類 タスク 管理機能 タスク 付属 同期機能 16 名称 説明 タスク 部 *1 タスク 独立部 ディスパッチ 禁止状態 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_ref_tsk タスクの状態を参照します。 ○ ○ ○ tk_slp_tsk 自タスクを起床待ち状態へ移 行します。 ○ × × tk_wup_tsk 他タスクを起床します。 ○ ○ ○ tk_can_wup タスクの起床要求をキャンセ ルします。 ○ ○ ○ tk_rel_wai 他タスクの待ち状態を強制解 除します。 ○ ○ ○ tk_sus_tsk 他タスクを強制待ち状態に移 行します。 ○ ○ ○ *2 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.1 システムコール一覧 Support Soft Ma nual 表 3.1-1 システムコール一覧 (2 / 7) 呼出し可否 分類 タスク 付属 同期機能 同期・ 通信機能 名称 説明 タスク 部 *1 タスク 独立部 ディスパッチ 禁止状態 tk_rsm_tsk 強制待ち状態のタスクを再開 します。 ○ ○ ○ tk_frsm_tsk 強制待ち状態のタスクを強制 再開します。 ○ ○ ○ tk_dly_tsk 自タスクを時間経過待ち状態 へ移行します。 ○ × × tk_cre_sem セマフォを生成します。 ○ ○ ○ tk_del_sem セマフォを削除します。 ○ ○ ○ tk_sig_sem セマフォ資源を返却します。 ○ ○ ○ tk_wai_sem セマフォ資源を獲得します。 ○ × × tk_ref_sem セマフォの状態を参照します。 ○ ○ ○ tk_cre_flg イベントフラグを生成します。 ○ ○ ○ tk_del_flg イベントフラグを削除します。 ○ ○ ○ tk_set_flg イベントフラグをセットしま す。 ○ ○ ○ tk_clr_flg イベントフラグをクリアしま す。 ○ ○ ○ tk_wai_flg イベントフラグを待ちます。 ○ × × tk_ref_flg イベントフラグの状態を参照 します。 ○ ○ ○ tk_cre_mbx メールボックスを作成します。 ○ ○ ○ tk_del_mbx メールボックスを削除します。 ○ ○ ○ tk_snd_mbx メールボックスへ送信します。 ○ ○ ○ tk_rcv_mbx メールボックスから受信しま す。 ○ × × tk_ref_mbx メールボックスの状態を参照 します。 ○ ○ ○ January 31, 2014, CM81-00210-2a 17 第 3 章 システムコールインタフェース 3.1 システムコール一覧 Su pp or t So ft Manu al 表 3.1-1 システムコール一覧 (3 / 7) 呼出し可否 分類 拡張同期 通信機能 18 名称 説明 タスク 部 *1 タスク 独立部 ディスパッチ 禁止状態 tk_cre_mtx ミューテックスを生成します。 ○ ○ ○ tk_del_mtx ミューテックスを削除します。 ○ ○ ○ tk_loc_mtx ミューテックスをロックしま す。 ○ × × tk_unl_mtx ミューテックスをロック解除 します。 ○ × ○ tk_ref_mtx ミューテックスの状態を参照 します。 ○ ○ ○ tk_cre_mbf メッセージバッファを生成し ます。 ○ ○ ○ tk_del_mbf メッセージバッファを削除し ます。 ○ ○ ○ tk_snd_mbf メッセージバッファへ送信し ます。 ○ ○ ○ tk_rcv_mbf メッセージバッファから受信 します。 ○ × × tk_ref_mbf メッセージバッファの状態を 参照します。 ○ ○ ○ tk_cre_por ランデブポートを生成します。 ○ × ○ tk_del_por ランデブポートを削除します。 ○ × ○ tk_cal_por ランデブポートに対するラン デブを呼び出します。 ○ × × tk_acp_por ランデブポートに対するラン デブを受け付けます。 ○ × × tk_fwd_por ランデブポートに対するラン デブを回送します。 ○ × ○ tk_rpl_rdv ランデブポートに対するラン デブを返答します。 ○ × ○ tk_ref_por ランデブポートの状態を参照 します。 ○ ○ ○ CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.1 システムコール一覧 Support Soft Ma nual 表 3.1-1 システムコール一覧 (4 / 7) 呼出し可否 分類 メモリ プール 管理機能 名称 説明 タスク 部 *1 タスク 独立部 ディスパッチ 禁止状態 tk_cre_mpf 固定長メモリプールを生成し ます。 ○ × × tk_del_mpf 固定長メモリプールを削除し ます。 ○ × × tk_get_mpf 固定長メモリブロックを獲得 します。 ○ × × tk_rel_mpf 固定長メモリブロックを返却 します。 ○ × × tk_ref_mpf 固定長メモリプールの状態を 参照します。 ○ × × tk_cre_mpl 可変長メモリプールを生成し ます。 ○ × × tk_del_mpl 可変長メモリプールを削除し ます。 ○ × × tk_get_mpl 可変長メモリブロックを獲得 します。 ○ × × tk_rel_mpl 可変長メモリブロックを返却 します。 ○ × × tk_ref_mpl 可変長メモリプールの状態を 参照します。 ○ × × January 31, 2014, CM81-00210-2a 19 第 3 章 システムコールインタフェース 3.1 システムコール一覧 Su pp or t So ft Manu al 表 3.1-1 システムコール一覧 (5 / 7) 呼出し可否 分類 名称 割込み 管理機能 20 タスク 部 *1 タスク 独立部 ディスパッチ 禁止状態 tk_set_tim システム時刻を設定します。 ○ ○ ○ tk_get_tim システムの現在時刻を参照し ます。 ○ ○ ○ tk_get_otm システム稼働時間を参照しま す。 ○ ○ ○ *3 × ○ ○ tk_cre_cyc 周期ハンドラを生成します。 ○ ○ ○ tk_del_cyc 周期ハンドラを削除します。 ○ ○ ○ tk_sta_cyc 周期ハンドラの動作を開始し ます。 ○ ○ ○ tk_stp_cyc 周期ハンドラの動作を停止し ます。 ○ ○ ○ tk_ref_cyc 周期ハンドラの状態を参照し ます。 ○ ○ ○ tk_cre_alm アラームハンドラを生成しま す。 ○ ○ ○ tk_del_alm アラームハンドラを削除しま す。 ○ ○ ○ tk_sta_alm アラームハンドラの動作を開 始します。 ○ ○ ○ tk_stp_alm アラームハンドラの動作を停 止します。 ○ ○ ○ tk_ref_alm アラームハンドラの状態を参 照します。 ○ ○ ○ tk_def_int 割込みハンドラを定義または 解除します。 ○ ○ ○ tk_ret_int 割込みハンドラから復帰しま す。 × ○ ○ DI すべての外部割込みを禁止し ます。 ○ ○ ○ EI すべての外部割込みを許可し ます。 ○ ○ ○ isDI 外部割込み禁止状態を調べま す。 ○ ○ ○ isig_tim 時間管理 機能 説明 タイムティックを供給します。 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.1 システムコール一覧 Support Soft Ma nual 表 3.1-1 システムコール一覧 (6 / 7) 呼出し可否 分類 システム 状態 管理機能 サブ システム 管理機能 デバイス 管理機能 名称 説明 タスク 部 *1 タスク 独立部 ディスパッチ 禁止状態 tk_rot_rdq タスクの優先順位を回転しま す。 ○ ○ ○ tk_get_tid 実行状態タスクのタスク ID を 参照します。 ○ ○ ○ tk_dis_dsp ディスパッチを禁止します。 ○ × ○ tk_ena_dsp ディスパッチを許可します。 ○ × ○ tk_ref_sys システム状態を参照します。 ○ ○ ○ tk_ref_ver カーネルのバージョンを参照 します。 ○ ○ ○ tk_def_ssy サブシステムを定義または定 義を削除します。 ○ ○ ○ tk_ref_ssy サブシステム定義情報を参照 します。 ○ ○ ○ tk_def_dev デバイスを登録または登録を 削除します。 ○ ○ ○ tk_ref_idv デバイス初期情報を獲得しま す。 ○ ○ ○ tk_opn_dev デバイスをオープンします。 ○ ○ ○ tk_cls_dev デバイスをクローズします。 ○ ○ ○ tk_rea_dev デバイスの読出しを開始しま す。 ○ ○ ○ tk_srea_dev デバイスの同期読出しを行い ます。 ○ ○ ○ tk_wri_dev デバイスの書込みを開始しま す。 ○ ○ ○ tk_swri_dev デバイスの同期書込みを行い ます。 ○ ○ ○ tk_wai_dev デバイスの要求完了を待ちま す。 ○ ○ ○ tk_sus_dev デバイスをサスペンドします。 ○ ○ ○ tk_get_dev デバイス名を獲得します。 ○ ○ ○ January 31, 2014, CM81-00210-2a 21 第 3 章 システムコールインタフェース 3.1 システムコール一覧 Su pp or t So ft Manu al 表 3.1-1 システムコール一覧 (7 / 7) 呼出し可否 分類 名称 説明 タスク 部 *1 タスク 独立部 ディスパッチ 禁止状態 tk_ref_dev デバイス名からデバイス情報 を獲得します。 ○ ○ ○ tk_oref_dev デバイスディスクリプタから デバイス情報を獲得します。 ○ ○ ○ tk_lst_dev 登録済みデバイスの一覧を獲 得します。 ○ ○ ○ tk_evt_dev デバイスにドライバ要求イベ ントを送信します。 ○ ○ ○ デバイス 管理機能 ○ : 呼出し可能 × : 呼出し不可 ( システムコールがエラー復帰または動作を保証しない ) *1: 「呼出し可否」の「タスク部」は「準タスク部」を含みます。 *2: ディスパッチ禁止状態で実行状態のタスクを指定して tk_sus_tsk を呼び出した場合 , E_CTX エラー になります。 *3: T-REALOS 固有の機能 (T-Kernel 仕様で規定されていません。T-REALOS で追加した機能です。) 22 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.2 システムコール説明内容 Support 3.2 Soft Ma nual システムコール説明内容 「3.3 タスク管理機能のシステムコール」から「3.12 デバイス管理機能のシステム コール」までのシステムコール説明内容の読み方を説明します。 ■ システムコール説明内容 <システムコール名> (<機能 英文>) 〈機能 和文〉 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ タスク部から呼出 可能かどうかを表す ○:呼出し可能 ×:呼出し禁止 ディスパッチ禁止状態から 呼出可能かどうかを表す ○:呼出し可能 ×:呼出し禁止 タスク独立部から呼出 可能かどうかを表す ○:呼出し可能 ×:呼出し禁止 〈C言語インタフェース〉 関数値としてのエラーコード システムコール名 ■ C言語インタフェース ID tskid = tk_cre_tsk( T_CTSK *pk_ctsk ); typedef struct t_ctsk{ VP exinf; ATR tskatr; FP task; PRI itskpri; INT stksz; UB dsname[8]; VP bufptr; }T_CTSK; パラメータ パラメータ宣言 パラメータ名 パケットの構造 ■ パラメータ ●入力 タスク生成情報(Packet to Create Task) タスク生成情報のパケットの先頭アドレス ● パケットに設定するデータ pk_ctsk exinf 拡張情報(Extended Information) tskatr タスク属性(Task Attribute) task タスク起動アドレス(Task Start Address) itskpri タスク起動時優先度(Initial Task Priority) stksz スタックサイズ(バイト数) (Stack Size) パラメータの説明 dsname[8] DS オブジェクト名称 (DS Object Name) ●出力 bufptr ユーザーバッファポインタ (Buffer Pointer) tskid タスクID または エラーコード (TaskID or ErrorCode) January 31, 2014, CM81-00210-2a 23 第 3 章 システムコールインタフェース 3.2 システムコール説明内容 Su pp or t So ft Manu al 〈エラーコード〉 ■ エラーコード E_NOMEM ‑33 メモリ不足 (管理ブロックやスタック用の領域を確 保できない) E_LIMIT ‑34 タスクの数がシステムの制限を超えた E_RSATR ‑11 予約属性(tskatr が不正あるいは使用 E_PAR ‑17 パラメータエラー(pk_ctsk が不正, できない) このシステムコール発 行時に発生する可能性 のあるエラー task, bufptr が不正,itskpri が不正) 〈ディスパッチ要因〉 ■ディスパッチ要因 このシステムコールではディスパッチしません。 このシステムコールでディ スパッチが発生する要因 または発生の有無 〈解 説〉 ■ 解 説 タスクを生成してタスクID を割り当てます。具体的には,生成するタスクに 対してTCB(Task Control Block)を割り付け,itskpri, task, stksz などの情 報をもとにその初期設定を行います。 対象タスクは生成後,休止状態(DORMANT)となります。 itskpri によって,タスクが起動するときの優先度の初期値を指定します。タ スク優先度としては,1~140 の値を指定することができ,数の小さい方が高 い優先度となります。 exinf は,対象タスクに関する情報を入れておくためにユーザが自由に利用で きます。ここで設定した情報は,タスクに起動パラメータとして渡される他, tk_ref_tsk で取り出すことができます。 なお,ユーザの情報を入れるためにもっと大きな領域がほしい場合や,途中で 内容を変更したい場合には,自分でそのためのメモリを確保し,そのメモリ パケットのアドレスをexinf に入れます。OS ではexinf の内容について関知 しません。 tskatr は,下位側がシステム属性を表わし,上位側が実装独自属性を表わしま す。tskatr のシステム属性の部分では,次のように指定を行います。 24 このシステムコールの処理 に対する解説,注意事項 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Support 3.3 Soft Ma nual タスク管理機能のシステムコール タスク管理機能のシステムコールを説明します。 ■ タスク管理機能のシステムコール タスク管理機能は , 以下の 10 種類のシステムコールで構成されます。 • tk_cre_tsk(Create Task) • tk_del_tsk(Delete Task) • tk_sta_tsk (Start Task) • tk_ext_tsk(Exit Task) • tk_exd_tsk(Exit and Delete Task) • tk_ter_tsk(Terminate Task) • tk_chg_pri(Change Task Priority) • tk_get_reg(Get Task Registers) • tk_set_reg(Set Task Registers) • tk_ref_tsk(Refer Task Status) January 31, 2014, CM81-00210-2a 25 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Su pp or t 3.3.1 So ft Manu al tk_cre_tsk(Create Task) タスクを生成します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID tskid = tk_cre_tsk ( T_CTSK *pk_ctsk ) ; typedef struct t_ctsk { VP exinf; ATR tskatr; FP task; PRI itskpri; W stksz; VP bufptr; } T_CTSK; ■ パラメータ ● 入力 タスク生成情報 (Packet of Create Task) pk_ctsk タスク生成情報のパケットの先頭アドレス ● pk_ctsk に設定するデータ exinf 拡張情報 (Extended Information) tskatr タスク属性 (Task Attribute) tskatr : = TA_HLNG | [TA_USERBUF] 表 3.3-1 tk_cre_tsk の tskatr で指定できる定数マクロ 属性 値 意味 TA_HLNG 0x00000001 対象タスクが C 言語で記述 TA_USERBUF 0x00000020 スタック領域としてユーザが 指定した領域を使用する task タスク起動アドレス (Task Start Address) itskpri タスク起動時優先度 (Initial Task Priority) stksz スタックサイズ ( バイト数 ) (Stack Size) bufptr ユーザバッファのアドレス (Buffer Pointer) ● 出力 tskid 26 タスク ID(TaskID) またはエラーコード (ErrorCode) CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Support Soft Ma nual ■ エラーコード E_NOMEM -33 メモリ不足 · タスクスタック用の領域を確保できない (TA_USERBUF が指定されていない場合 ) E_LIMIT -34 タスクの数がシステムの制限より大きい E_RSATR -11 予約属性 ·tskatr に未定義の値が設定された E_PAR -17 パラメータエラー ·itskpri が 0 以下 , または最大優先度より大きい ·stksz が最小スタックサイズより小さい ·stksz が 8 の倍数でない (TA_USERBUF が指定されている 場合 ) ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 タスクを生成してタスク ID を割り当てます。具体的には , itskpri, tsk, stksz の情報を元 に生成するタスクを初期設定します。タスクは生成後 , 休止状態となります。 itskpri によって , タスクが起動するときの優先度の初期値を指定します。タスク優先度 は , 1 から最大優先度 ( コンフィギュレータで設定した最大優先度 ) の値を指定でき , 数の小さい方が高い優先度となります。 exinf は , 対象タスクに関する情報を入れておくためにユーザが自由に使用できます。 ここで指定した情報は, タスクの起動パラメータおよびtk_ref_tskで参照できます。ユー ザの情報を入れるためにもっと大きな領域が必要な場合や , 途中で内容を変更したい 場合があれば, ユーザプログラムでそのためのメモリを確保して, そのアドレスをexinf に入れます。なお , OS は exinf の内容を関知しません。 tskatr には , 表 3.3-1 のタスクの属性を指定してください。以下の表 3.3-2 の値を指定し た場合は無視されます。 表 3.3-2 無視するタスク属性一覧 属性 値 意味 TA_ASM 0x00000000 対象タスクがアセンブラで記述 TA_RNG0 0x00000000 保護レベル 0 で実行 TA_RNG1 0x00000100 保護レベル 1 で実行 TA_RNG2 0x00000200 保護レベル 2 で実行 TA_RNG3 0x00000300 保護レベル 3 で実行 tskatr には , TA_HLNG を必ず指定してください。T-REALOS は , タスクの記述言語は C 言語のみサポートしています。そのため , tskatr に TA_ASM を指定した場合も , タス クが C 言語で記述されているものとして処理されますが , T-Kernel 仕様との互換性は 保証されません。 January 31, 2014, CM81-00210-2a 27 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Su pp or t So ft Manu al 各タスクにスタックは 1 つあります。TA_USERBUF が指定された場合に bufptr が有効 になり , bufptr を先頭とする stksz バイトのメモリ領域をスタック領域として使用しま す。この場合 , OS はスタック領域を確保しません。TA_USERBUF が指定されなかっ た場合 , bufptr は無視され , OS はスタック領域を確保します。OS が確保する場合 , 8 バ イトの倍数に切り上げて stksz は獲得されます。 pk_ctk, tsk, bufptr が不正な場合でも , エラーチェックを行わず動作は保証されません。 ■ 補足事項 T-REALOS のタスクスタックはレジスタ退避用に最低 80 バイトの領域が必要です。ま た , タスクスタックサイズの求め方およびタスクの記述方法については , 「ユーザーズ ガイド 『 4.9 タスク』 」を参照してください。 関数からの単純なリターン (return) でタスクを終了するとその後のシステムの動作は保 証されません。必ず , tk_ext_tsk または tk_exd_tsk を呼び出して , タスクを終了させて ください。 28 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Support 3.3.2 Soft Ma nual tk_del_tsk(Delete Task) タスクを削除します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_del_tsk ( ID tskid ) ; ■ パラメータ ● 入力 tskid タスク ID (Task ID) ercd エラーコード (ErrorCode) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·tskid が 0 以下または最大タスク数より大きい E_NOEXS -42 オブジェクトが存在していない ·tskid のタスクが存在しない E_OBJ -41 オブジェクトの状態が不正 · 対象タスクが休止状態でない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 tskid で指定されたタスクを削除します。具体的には , tskid で指定されたタスクを休止 状態から未登録状態に移行させて , スタック領域およびタスク ID 番号を未使用状態に します。 自タスクを削除するには tk_exd_tsk を呼び出してください。 January 31, 2014, CM81-00210-2a 29 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Su pp or t 3.3.3 So ft Manu al tk_sta_tsk (Start Task) タスクを起動します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_sta_tsk ( ID tskid, INT stacd ) ; ■ パラメータ ● 入力 tskid タスク ID (Task ID) stacd タスク起動コード (Start Code) ercd エラーコード (ErrorCode) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·tskid が 0 以下または最大タスク数より大きい E_NOEXS -42 オブジェクトが存在していない ·tskid のタスクが存在しない E_OBJ -41 オブジェクトの状態が不正 · 対象タスクが休止状態でない ■ ディスパッチ要因 本システムコールを呼び出したタスクより優先度の高いタスクを起動した場合 , 起動 したタスクにディスパッチします。 ■ 解説 tskid で指定されたタスクを起動します。具体的には , 休止状態から実行可能状態へと 移します。 stacd は , タスクの起動時にタスクに渡すパラメータを設定できます。このパラメータ は , 対象タスクから参照することで , 簡単なメッセージ通信ができます。 タスク起動時のベース優先度および現在優先度は , 対象タスクが生成されたときに指 定されたタスク起動時優先度と同じです。 本システムコールは起動要求のキューイングを行いません。 30 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Support 3.3.4 Soft Ma nual tk_ext_tsk(Exit Task) 自タスクを終了します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース void tk_ext_tsk ( void ) ; ■ パラメータ ● 入力 なし ● 出力 なし ( 注意事項 ) システムコールを呼び出したコンテキストには復帰しない。 ■ エラーコード ( 注意事項 ) 以下のエラーを検出する可能性がありますが , エラーを検出した場合でもシ ステムコールを呼び出したコンテキストには復帰しません。したがって , シ ステムコールの復帰値として直接エラーコードを返しません。 E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクが終了した場合 , 次の優先順位のタスクにディ スパッチします。 ■ 解説 自タスクを正常終了させたのち , 休止状態へ移行させます。 本システムコールにより , タスクが休止状態になった場合 , タスク優先度は起動時優先 度に戻ります。 ■ 補足事項 本システムコールによるタスクの終了時に , 終了するタスクがそれ以前に獲得した資 源 ( メモリブロック , セマフォなど ) は自動的に解放されません。このため , タスク終 了により未使用となる資源をタスク終了前に解放してください。 本システムコールは呼出し元のコンテキストに復帰しないシステムコールです。タス ク独立部 , またはディスパッチ禁止状態で本システムコールが呼び出された場合 , OS 内部でエラーを検出します。しかし , その場合でも呼出し元には復帰せず , その後の動 作は保証されません。 January 31, 2014, CM81-00210-2a 31 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Su pp or t 3.3.5 So ft Manu al tk_exd_tsk(Exit and Delete Task) 自タスクを終了して削除します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース void tk_exd_tsk ( void ) ; ■ パラメータ ● 入力 なし ● 出力 なし ( 注意事項 ) システムコールを呼び出したコンテキストには復帰しない。 ■ エラーコード ( 注意事項 ) 以下のエラーを検出する可能性がありますが , エラーを検出した場合でもシ ステムコールを呼び出したコンテキストには復帰しません。したがって , シ ステムコールの復帰値として直接エラーコードを返しません。 E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクが終了した場合 , 次の優先順位のタスクにディ スパッチします。 ■ 解説 自タスクを正常終了させたのち , 削除します。具体的には , 自タスクを未登録状態に移 行させます。 ■ 補足事項 本システムコールによるタスクの終了時には , 終了するタスクがそれ以前に獲得した 資源 ( メモリブロック , セマフォなど ) は自動的に解放されません。このため , タスク 終了により未使用となる資源をタスク終了前に解放してください。 本システムコールは呼出し元のコンテキストに復帰しないシステムコールです。タス ク独立部 , またはディスパッチ禁止状態で本システムコールが呼び出された場合 , OS 内部でエラーを検出します。しかし , その場合でも呼出し元には復帰せず , その後の動 作は保証されません。 32 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Support 3.3.6 Soft Ma nual tk_ter_tsk(Terminate Task) 他タスクを強制終了します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ter_tsk ( ID tskid ) ; ■ パラメータ ● 入力 tskid タスク ID (Task ID) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·tskid が 0 以下または最大タスク数より大きい E_NOEXS -42 オブジェクトが存在していない ·tskid のタスクが存在しない E_OBJ -41 オブジェクトの状態が不正 · 対象タスクが休止状態または自タスク ■ ディスパッチ要因 以下の待ち行列につながれたタスクを対象として優先度を変更し , 対象タスクの待ち 状態が解除された場合 , 対象タスクの優先度が自タスクより高ければ , 対象タスクに ディスパッチします。 - セマフォ獲得待ち行列 - メッセージバッファの送信待ち行列 - 可変長メモリプールのメモリブロック獲得待ち行列 ■ 解説 tskid で指定されたタスクを強制的に終了させます。具体的には , 対象タスクを休止状 態に移行させます。この時 , 優先度は起動時優先度に戻ります。 対象タスクが待ち状態 ( 強制待ち状態を含む ) の場合でも , 対象タスクは待ち解除と なって終了します。また , 対象タスクが何らかの待ち行列 ( セマフォ待ちなど ) につな がれていた場合 , 本システムコールの実行によってその待ち行列から削除します。 January 31, 2014, CM81-00210-2a 33 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Su pp or t So ft Manu al 本システムコールの対象タスクの状態と実行結果との関係を表 3.3-3 に示します。 表 3.3-3 tk_ter_tsk の対象タスクの状態と実行結果 対象タスク状態 tk_ter_tsk の ercd 処理 実行できる状態 (RUNNING, READY) ( 自タスク以外 ) E_OK 強制終了処理 実行状態 (RUNNING)( 自タスク ) E_OBJ 何もしない 待ち状態 (WAITING, SUSPENDED, WAITING-SUSPENDED) E_OK 強制終了処理 休止状態 (DORMANT) E_OBJ 何もしない 未登録状態 (NON-EXISTENT) E_NOEXS 何もしない ■ 補足事項 tk_ter_tsk によるタスクの終了時に , 終了するタスクがそれ以前に獲得した資源 ( メモ リブロック , セマフォなど ) は自動的には解放されません。このため , tk_ter_tsk でタス クを終了させる場合 , ユーザプログラムによりそのタスクが獲得している資源を解放 させてください。 tk_ter_tsk によるタスクの強制終了は対象タスクの実行状態とは関係なく行うため , シ ステム全体に悪影響を及ぼす場合があります。このため , タスクを強制終了させる場合 は注意してください。 34 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Support 3.3.7 Soft Ma nual tk_chg_pri(Change Task Priority) タスクの優先度を変更します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_chg_pri ( ID tskid, PRI tskpri ) ; ■ パラメータ ● 入力 タスク ID (Task ID) tskid 1 から最大タスク数の数値 , および以下のマクロが指定可能 表 3.3-4 tk_chg_pri の tskid に指定できる定数マクロ 名前 値 TSK_SELF 0 意味 自タスク 優先度 (Task Priority) tskpri 1 から最大優先度の数値 , および以下のマクロが指定可能 表 3.3-5 tk_chg_pri の tskpri に指定できる定数マクロ 名前 値 TPRI_INI 0 意味 起動時優先度 ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·tskid が負または最大タスク数より大きい · タスク独立部からの呼出しで tskid に TSK_SELF(=0) が 指定された E_NOEXS -42 オブジェクトが存在していない ·tskid のタスクが存在しない E_PAR -17 パラメータエラー ·tskpri が負または最大優先度より大きい January 31, 2014, CM81-00210-2a 35 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Su pp or t E_ILUSE -28 So ft Manu al 不正使用 ·TA_CEILING 属性のミューテックスをロックしている場合 で , tskpri が上限優先度よりも高い ■ ディスパッチ要因 • 対象タスクの優先度を自タスクの優先度より高くした場合, 対象タスクにディスパッ チします。 • 自タスクの優先度をほかの実行可能状態のタスクの優先度より低くした場合 , ほか の行可能状態のタスクのうち , 一番優先順位の高いタスクにディスパッチします。 • 以下の待ち行列につながれたタスクを対象として優先度を変更し , 対象タスクの待 ち状態が解除された場合 , 対象タスクの優先度が自タスクより高ければ , 対象タス クにディスパッチします。 - セマフォ待ち行列 - メッセージバッファの送信待ち行列 - 可変長メモリプールのメモリブロック獲得待ち行列 ■ 解説 tskid で指定されたタスクのベース優先度を tskpri で指定された値に変更します。ベー ス優先度と現在優先度が一致している場合 ( ミューテックス機能を使用しない場合 ), タスクの現在優先度も tskpri で指定された値に変更してベース優先度と一致させます。 tskpri はタスク優先度として 1 から最大優先度 ( コンフィギュレータで設定した最大優 先度 ) までの値を指定でき , 値の小さい方が高い優先度となります。 tskid に TSK_SELF(=0) が指定されると自タスクを対象タスクとします。 tskpri に TPRI_INI(=0) が指定されると , 対象タスクのベース優先度をタスクの起動時優 先度に変更します。 本システムコールで変更した優先度はタスクが終了するまで有効です。タスクが休止状 態に戻るとき , 終了前のタスクの優先度は捨てられます。 そして , タスクの起動時に , タ スク生成時に指定された優先度となります。ただし , 休止状態のタスクに対して変更し た優先度は有効となり , 次にタスクを起動したときは , その変更された優先度で起動し ます。 本システムコールを実行した結果 , 対象タスクの現在優先度がベース優先度と一致し ている場合 , 以下の処理を行います。 • 対象タスクが実行可能状態である場合 , タスクの優先順位は変更した優先度に従っ て変更します。変更後の優先度と同じ優先度を持つタスクの間で , 対象タスクの優 先順位は最低になります。 • 対象タスクが何らかのタスク優先度順の待ち行列につながれている場合 , その待ち 行列の中での順序を変更後の優先度に従って変更します。変更後の優先度と同じ優 先度を持つタスクの間で , 対象タスクは待ち行列の最後につなぎます。 36 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Support Soft Ma nual ■ 補足事項 本システムコールを呼び出した結果 , 対象タスクのタスク優先度順の待ち行列の中で の順序が変化した場合 , 対象タスクまたはその待ち行列で待っているほかのタスクの 待ち状態を解除する場合があります。 対象タスクが TA_INHERIT 属性のミューテックスのロック待ち状態である場合 , 本シ ステムコールでベース優先度を変更したことにより , 推移的な優先度継承の処理が必 要になる場合があります。 ミューテックス機能を使用しない場合に , 対象タスクに自タスク , 変更後の優先度に自 タスクのベース優先度を指定して本システムコールが呼び出されると , 自タスクの実 行順位は同じ優先度のタスクの中で最低となります。そのため , 本システムコールを使 用して実行権を放棄できます。 ミューテックスの概要および仕様は , 以下のマニュアルを参照してください。 • 「 ユーザーズガイド 『3.5.1 ミューテックス機能』」 • 「3.6.1.1 tk_cre_mtx(Create Mutex)」 • 「3.6.1.5 tk_ref_mtx(Refer Mutex Status)」 January 31, 2014, CM81-00210-2a 37 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Su pp or t 3.3.8 So ft Manu al tk_get_reg(Get Task Registers) タスクレジスタを獲得します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_get_reg ( ID tskid, T_REGS *pk_regs, T_EIT *pk_eit , T_CREGS *pk_cregs ) ; typedef struct t_regs { VW r[13]; } T_REGS; typedef struct t_eit { VP pc; } T_EIT; typedef struct t_cregs { VP ssp; VP usp; } T_CREGS; ■ パラメータ ● 入力 tskid タスク ID (Task ID) pk_regs 汎用レジスタに設定されている値を格納したパケットアドレス (Packet of Registers) pk_eit CPU 例外時に保存するレジスタの値を格納したパケットアドレス (Packet of EIT) pk_cregs 制御レジスタに設定されている値を格納したパケットアドレス (Packet of Control Registers) ● 出力 ercd エラーコード (Error Code) ● pk_regs に返されるデータ r[13] 汎用レジスタ:R0-R12 ● pk_eit に返されるデータ pc 38 PC レジスタ CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Support Soft Ma nual ● pk_cregs に返されるデータ ssp スーパーバイザスタックポインタ usp ユーザスタックポインタ ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·tskid が負または最大タスク数より大きい E_NOEXS -42 オブジェクトが存在していない ·tskid のタスクが存在しない E_OBJ -41 オブジェクトの状態が不正 · 対象タスクが自タスク E_CTX -25 コンテキストエラー · タスク独立部からの呼出し ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 tskid のタスクの現在のレジスタの内容を参照します。参照したレジスタの値は対象タ スクの現在のレジスタの値であり , 必ずしもタスク部実行中の値であるとは限りませ ん。 pk_regs, pk_eit, pk_cregs にそれぞれ NULL が指定されると , 対応するレジスタの参照は 行いません。 pk_regs, pk_eit, pk_cregs が不正な場合でも , エラーチェックを行わず , 動作は保証され ません。 January 31, 2014, CM81-00210-2a 39 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Su pp or t 3.3.9 So ft Manu al tk_set_reg(Set Task Registers) タスクレジスタを設定します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_set_reg ( ID tskid, T_REGS *pk_regs, T_EIT *pk_eit , T_CREGS *pk_cregs ) ; typedef struct t_regs { VW r[13]; } T_REGS; typedef struct t_eit { VP pc; } T_EIT; typedef struct t_cregs { VP ssp; VP usp; } T_CREGS; ■ パラメータ ● 入力 tskid タスク ID (Task ID) pk_regs 汎用レジスタに設定する値を格納したパケットアドレス (Packet of Registers) ● pk_regs に設定するデータ r[13] pk_eit 汎用レジスタ:R0-R12 CPU 例外時に保存するレジスタに設定する値を格納したパケット アドレス (Packet of EIT) ● pk_eit に設定するデータ pc PC レジスタ pk_cregs 制御レジスタに設定する値を格納したパケットアドレス (Packet of Control Registers) ● pk_cregs に設定するデータ 40 ssp スーパーバイザスタックポインタ usp ユーザスタックポインタ CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Support Soft Ma nual ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·tskid が 0 以下または最大タスク数より大きい E_NOEXS -42 オブジェクトが存在していない ·tskid のタスクが存在しない E_OBJ -41 オブジェクトの状態が不正 · 対象タスクが自タスク E_CTX -25 コンテキストエラー · タスク独立部からの呼出し ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 tskid のタスクのレジスタを指定の内容に設定します。 pk_regs, pk_eit, pk_cregs にそれぞれ NULL が指定されると , 対応するレジスタの設定は 行われません。 設定するレジスタの値の正当性はチェックしません。このため , 不当なレジスタの値を 設定した場合 , システムが誤動作 , ハングアップする可能性があります。 pk_regs, pk_eit, pk_cregs が不正な場合でも , エラーチェックを行わず , 動作は保証され ません。 January 31, 2014, CM81-00210-2a 41 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Su pp or t 3.3.10 So ft Manu al tk_ref_tsk(Refer Task Status) タスク状態を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ref_tsk ( ID tskid, T_RTSK *pk_rtsk ) ; typedef struct t_rtsk { VP exinf; PRI tskpri; PRI tskbpri; UINT tskstat; UW tskwait; ID wid; INT wupcnt; INT suscnt; } T_RTSK; ■ パラメータ ● 入力 tskid タスク ID (Task ID) 1 から最大タスク数の数値 , および以下のマクロが指定可能 表 3.3-6 tk_ref_tsk の tskid に指定できる定数マクロ 名前 値 意味 TSK_SELF 0 自タスク *pk_rtsk タスクの状態を返すパケットアドレス (Packet of Refer Task) 42 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Support Soft Ma nual ● 出力 エラーコード (Error Code) ercd ● pk_rtsk に返されるデータ exinf 拡張情報 (Extended Information) tskpri 現在の優先度 (Task Priority) tskbpri ベース優先度 (Task Base Priority) tskstat タスクの状態 (Task State) 表 3.3-7 tk_ref_tsk の tskstat に返される値 状態 値 意味 TTS_RUN 0x00000001 実行状態 (RUNNING) TTS_RDY 0x00000002 実行可能状態 (READY) TTS_WAI 0x00000004 待ち状態 (WAITING) TTS_SUS 0x00000008 強制待ち状態 (SUSPENDED) TTS_WAS 0x0000000c 二重待ち状態 (WAITING-SUSPENDED) TTS_DMT 0x00000010 休止状態 (DORMANT) tskwait 待ち要因 (Task Wait Factor) 表 3.3-8 tk_ref_tsk の tskwait に返される値 待ち要因 値 意味 TTW_SLP 0x00000001 tk_slp_tsk による待ち TTW_DLY 0x00000002 tk_dly_tsk による待ち TTW_SEM 0x00000004 tk_wai_sem による待ち TTW_FLG 0x00000008 tk_wai_flg による待ち TTW_MBX 0x00000040 tk_rcv_mbx による待ち TTW_MTX 0x00000080 tk_loc_mtx による待ち TTW_SMBF 0x00000100 tk_snd_mbf による待ち TTW_RMBF 0x00000200 tk_rcv_mbf による待ち TTW_CAL 0x00000400 ランデブ呼出し待ち TTW_ACP 0x00000800 ランデブ受付け待ち TTW_RDV 0x00001000 ランデブ終了待ち (TTW_CAL|TT W_RDV) 0x00001400 ランデブ呼出しまたは終了待 ち TTW_MPF 0x00002000 tk_get_mpf による待ち TTW_MPL 0x00004000 tk_get_mpl による待ち January 31, 2014, CM81-00210-2a 43 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Su pp or t So ft Manu al wid 待ちオブジェクト ID (Waiting Object ID) wupcnt 起床要求キューイング数 (Wakeup Count) suscnt 強制待ち要求ネスト数 (Suspend Count) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·tskid が負または最大タスク数より大きい · タスク独立部からの呼出しで tskid に TSK_SELF(=0) が 指定された E_NOEXS -42 オブジェクトが存在していない ·tskid のタスクが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 tskid で指定された対象タスクの状態を参照します。 tskid に TSK_SELF(=0) を設定することによって自タスクを指定できます。 tskstat にはタスクの状態を設定します。割込みハンドラから割り込まれたタスクを対象 として本システムコールを呼び出した場合 , tskstat に実行状態 (TTS_RUN) を返します。 tskstat が TTS_WAI(TTS_WAS を含む ) の場合 , tskwait, wid は表 3.3-9 の値をとります。 表 3.3-9 tskwait と wid の値 tskwait wid TTW_SLP 0 TTW_DLY 0 TTW_SEM 待ち対象の semid TTW_FLG 待ち対象の flgid TTW_MBX 待ち対象の mbxid TTW_MTX 待ち対象の mtxid TTW_SMBF 待ち対象の mbfid TTW_RMBF 待ち対象の mbfid TTW_CAL 待ち対象の porid TTW_ACP 待ち対象の porid TTW_RDV 0 (TTW_CAL|TTW_RDV) 0 TTW_MPF 待ち対象の mpfid TTW_MPL 待ち対象の mplid tskstat が TTS_WAI(TTS_WAS を含む ) 以外の状態の場合 , tskwait, wid は共に 0 です。 また , 休止状態のタスクの場合 , wupcnt, suscnt はすべて 0 です。 pk_rtsk が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 44 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.3 タスク管理機能のシステムコール Support Soft Ma nual ■ 補足事項 • 本システムコールで自タスクの ID を確認できません。自タスクの ID を知りたい場 合 , tk_get_tid を使用します。 • 以下の手順で操作をした場合 , tskstat は実行状態のままです。 1. タスク独立部から , 直前に実行中だったタスクに対してタスクの状態が変化する システムコール (*1) を呼び出す。 (*1)tk_sus_tsk, tk_ter_tsk など 2. タスク独立部から , 直前に実行中だったタスクに対して本システムコールを呼び 出す。 January 31, 2014, CM81-00210-2a 45 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Su pp or t 3.4 So ft Manu al タスク付属同期機能のシステムコール タスク付属同期機能のシステムコールを説明します。 ■ タスク付属同期機能のシステムコール タスク付属同期機能は , 以下の 8 種類のシステムコールで構成されます。 • tk_slp_tsk(Sleep Task) • tk_wup_tsk(Wakeup Task) • tk_can_wup(Cancel Wakeup Task) • tk_rel_wai(Release Wait) • tk_sus_tsk(Suspend Task) • tk_rsm_tsk(Resume Task) • tk_frsm_tsk(Force Resume Task) • tk_dly_tsk(Delay Task) 46 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Support 3.4.1 Soft Ma nual tk_slp_tsk(Sleep Task) 自タスクを起床待ち状態へ移行します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_slp_tsk ( TMO tmout ) ; ■ パラメータ ● 入力 tmout タイムアウト指定 (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロが指定可能 表 3.4-1 tk_slp_tsk の tmout に指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_PAR -17 パラメータエラー ·tmout が -2 以下 E_RLWAI -49 待ち状態強制解除 · 待ちの間に tk_rel_wai を受け付ける E_TMOUT -50 タイムアウト ·tmout の時間経過により待ち状態が解除された ·tmout が TMO_POL で , 起床要求キューイング数が 0 E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクが起床待ち状態になった場合 , 次の優先順位の タスクにディスパッチします。 ■ 解説 起床要求キューイング数が 0 の場合 , 本システムコールでは , 自タスクを実行状態から 起床待ち状態 (tk_wup_tsk を待つ状態 ) に移します。 January 31, 2014, CM81-00210-2a 47 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Su pp or t So ft Manu al tmout の基準時間 ( 時間の単位 ) はシステム時刻の基準時間 (=1ms) と同じです。tmout で指定された時間が経過する前にこのタスクを対象として tk_wup_tsk が呼び出された 場合 , 本システムコールは正常終了します。 TMO_FEVR は , タイムアウトまでの時間が無限大であることを示します。この場合は , tk_wup_tsk または tk_rel_wai が呼び出されるまで待ち状態になります。TMO_POL は待 ち状態には移行せずに E_TMOUT のエラーで復帰します。 起床要求キューイング数が 0 より大きい場合 , 待ち状態には移行せず , 本システムコー ルは起床要求キューイング数を 1 減らして , タスクの処理を継続します。 ■ 補足事項 本システムコールによって待ち状態になっているタスクに , ほかのタスクから tk_sus_tsk が呼び出された場合 , このタスクは二重待ち状態になります。 48 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Support 3.4.2 Soft Ma nual tk_wup_tsk(Wakeup Task) 他タスクを起床します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_wup_tsk ( ID tskid ) ; ■ パラメータ ● 入力 tskid タスク ID (Task ID) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·tskid が 0 以下または最大タスク数より大きい E_NOEXS -42 オブジェクトが存在していない ·tskid のタスクが存在しない E_OBJ -41 オブジェクトの状態が不正 · 対象タスクが自タスクまたは休止状態 E_QOVR -43 キューイングまたはネストのオーバフロー · 起床要求キューイング数が 32767 より大きい ■ ディスパッチ要因 本システムコールを呼び出したタスクより優先度の高いタスクを起床させた場合 , 起 床されたタスクにディスパッチします。 January 31, 2014, CM81-00210-2a 49 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Su pp or t So ft Manu al ■ 解説 tskid で指定されたタスクが tk_slp_tsk の呼出しにより起床待ち状態であった場合 , 本シ ステムコールにより , その待ち状態を解除します。 対象タスクが起床待ち状態でない場合 , 本システムコールによる起床要求はキューイ ングします。起床要求キューイング数は , タスク単位に管理され , 初期値 (tk_sta_tsk 実 行時の値 ) は 0 です。起床待ち状態でないタスクに本システムコールを呼び出すこと により , 対象タスクの起床要求キューイング数を 1 増やします。一方 , tk_slp_tsk を呼 び出すことにより , 対象タスクの起床要求キューイング数を 1 減らします。起床要求 キューイング数が 0 のタスクは , tk_slp_tsk を呼び出したときにそのタスクは待ち状態 になります。 起床要求キューイング数の最大値は 32767 です。 50 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Support 3.4.3 Soft Ma nual tk_can_wup(Cancel Wakeup Task) タスクの起床要求を無効化します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース INT wupcnt = tk_can_wup ( ID tskid ) ; ■ パラメータ ● 入力 tskid タスク ID (Task ID) 1 から最大タスク数の数値 , および以下のマクロが指定可能 表 3.4-2 tk_can_wup の tskid に指定できる定数マクロ 名前 値 TSK_SELF 0 意味 自タスク ● 出力 wupcnt キューイングされていた起床要求回数 (Wakeup Count) またはエラーコード (Error Code) ■ エラーコード E_ID -18 不正 ID 番号 ·tskid が負または最大タスク数より大きい · タスク独立部からの呼出しで tskid に TSK_SELF(=0) が 指定された E_NOEXS -42 オブジェクトが存在していない ·tskid のタスクが存在しない E_OBJ -41 オブジェクトの状態が不正 · 対象タスクが休止状態 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 tskid で指定されたタスクの起床要求キューイング数を復帰値 (wupcnt) として返し , 同 時にその起床要求をすべてキャンセルします。すなわち , 対象タスクの起床要求キュー イング数を 0 にします。 January 31, 2014, CM81-00210-2a 51 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Su pp or t So ft Manu al ■ 補足事項 周期的にタスクを起床して動作させる場合に , 本システムコールは時間内に処理が終 わっているかどうかを判定するために使用できます。すなわち , 前の起床要求に対する 処理が終了して tk_slp_tsk を呼び出す前に , それを監視するタスクが tk_can_wup を呼び出 し , その復帰値である wupcnt が 1 以上の値の場合 , 前の起床要求に対する処理が時間内 に終了しなかったことを確認できます。したがって , 処理の遅れに何らかの処置がとれ ます。 52 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Support 3.4.4 Soft Ma nual tk_rel_wai(Release Wait) 他タスクの待ち状態を強制解除します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_rel_wai ( ID tskid ) ; ■ パラメータ ● 入力 tskid タスク ID (Task ID) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·tskid が 0 以下または最大タスク数より大きい E_NOEXS -42 オブジェクトが存在していない ·tskid のタスクが存在しない E_OBJ -41 オブジェクトの状態が不正 · 対象タスクが実行状態 , 実行可能状態 , 強制待ち状態 , または休止状態 ■ ディスパッチ要因 本システムコールを呼び出したタスクより優先度の高いタスクの待ち状態を解除した 場合 , 待ち状態が解除されたタスクにディスパッチします。 メッセージバッファの送信待ちタスクまたは可変長メモリプールのメモリブロック獲 得待ちタスクなどの待ち状態を解除して , そのタスクの優先度が本システムコールを 呼び出したタスクより高い場合 , 待ち状態を解除したタスクにディスパッチします。 ■ 解説 tskid で指定されたタスクが待ち状態にある場合 , それを強制的に解除します。 本システムコールは待ち状態解除要求のキューイングは行いません。 本システムコールは , 強制待ち状態の解除は行いません。二重待ち状態のタスクを対象 として本システムコールを呼び出すと , 対象タスクは待ち状態が解除され , 強制待ち状 態となります。強制待ち状態も解除する必要がある場合 , 別に tk_rsm_tsk または tk_frsm_tsk を呼び出します。本システムコールの対象タスクの状態と実行結果との関 係を表 3.4-3 に示します。 January 31, 2014, CM81-00210-2a 53 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Su pp or t So ft Manu al 表 3.4-3 tk_rel_wai の対象タスクの状態と実行結果 対象タスクの状態 処理 ercd 実行できる状態 (RUNNING, READY) ( 自タスク以外 ) E_OBJ 何もしない 実行状態 (RUNNING)( 自タスク ) E_OBJ 何もしない 待ち状態 (WAITING) E_OK 待ち解除 *1 強制待ち状態 (SUSPENDED) E_OBJ 何もしない 二重待ち状態 (WAITING-SUSPENDED) E_OK 強制待ち状態に移行 *2 休止状態 (DORMANT) E_OBJ 何もしない 未登録状態 (NON-EXISTENT) E_NOEXS 何もしない *1: 対象タスクには E_RLWAI のエラーが返ります。対象タスクは , 待ち解除の条件が 満たされないまま , 待ち状態が強制的に解除されます。 *2: 強制待ち状態の解除後 , E_RLWAI のエラーで復帰します。 ■ 補足事項 あるタスクが待ち状態になって , 一定時間後 , アラームハンドラなどから本システム コールを呼び出すとタイムアウトに類似した機能を実現できます。 本システムコールと tk_wup_tsk とは , 以下の相違点があります。 表 3.4-4 tk_rel_wai と tk_wup_tsk の相違点 tk_wup_tsk 54 tk_rel_wai 解除できる待ち状態 tk_slp_tsk による起床待ち 状態のみ すべての待ち状態 待ち解除されたシステム コールの復帰値 E_OK E_RLWAI 待ち解除要求のキューイ ング キューイングする キューイングしない ( 対象タスクが待ち状態 以外は , E_OBJ のエラー ) CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Support 3.4.5 Soft Ma nual tk_sus_tsk(Suspend Task) 他タスクを強制待ち状態へ移行します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○* *: ディスパッチ禁止状態で実行状態のタスクを指定して tk_sus_tsk を呼び出した場合 には E_CTX エラーになります。 ■ C 言語インタフェース ER ercd = tk_sus_tsk ( ID tskid ) ; ■ パラメータ ● 入力 tskid タスク ID (Task ID) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·tskid が 0 以下または最大タスク数より大きい E_NOEXS -42 オブジェクトが存在していない ·tskid のタスクが存在しない E_OBJ -41 オブジェクトの状態が不正 · 対象タスクが自タスクまたは休止状態 E_CTX -25 ディスパッチ禁止状態で実行状態のタスクが指定された E_QOVR -43 キューイングまたはネストのオーバフロー · 強制待ち要求のネスト数が 32767 より大きい ■ ディスパッチ要因 ディスパッチ許可状態で,実行状態のタスクに対してタスク独立部から本システムコー ルを呼び出した場合 , 次の優先順位のタスクにディスパッチします。 ■ 解説 tskid で指定されたタスクを強制待ち状態に移行して , タスクの実行を中断させます。 強制待ち状態は , tk_rsm_tsk, tk_frsm_tsk の呼出しによって解除します。本システムコー ルの対象タスクが既に待ち状態であった場合 , 本システムコールの実行により , 対象タ スクは待ち状態と強制待ち状態が複合した二重待ち状態となります。その後 , このタス クの待ち解除の条件が満たされると対象タスクは強制待ち状態に移行します。一方 , こ の二重待ち状態のタスクに tk_rsm_tsk または tk_frsm_tsk が呼び出されると対象タスク は前と同じ待ち状態に戻ります。 January 31, 2014, CM81-00210-2a 55 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Su pp or t So ft Manu al あるタスクに複数回の本システムコールが呼び出された場合 , そのタスクは多重の強 制待ち状態になります。これを強制待ち要求のネストとよびます。この場合 , 本システ ムコールが呼び出された回数 (suscnt) と同じ回数の tk_rsm_tsk システムコールを呼び出 すか , tk_frsm_tsk を 1 回呼び出すことにより , 対象タスクが元の状態に戻ります。した がって , 本システムコール~ tk_rsm_tsk システムコールの対をネストできます。強制待 ち要求のネスト回数の最大値は 32767 です。 ■ 補足事項 あるタスクが資源獲得のための待ち状態 ( セマフォ待ちなど ) で , かつ強制待ち状態の 場合でも , 強制待ち状態でないときと同じ条件によって資源の割当て ( セマフォの割当 てなど ) を行います。強制待ち状態であっても , 資源割当ての遅延などを行うわけでは なく , 資源割当てや待ち状態の解除に関する条件や優先度は全く変わりません。 対象タスクの実行状態とは関係なく , 処理を中断してタスクの強制待ち状態への移行 を行うため , 本システムコールはシステム全体に悪影響を及ぼす場合があります。この ため , タスクを強制待ち状態に移行させる場合は注意してください。 56 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Support 3.4.6 Soft Ma nual tk_rsm_tsk(Resume Task) 強制待ち状態のタスクを再開します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_rsm_tsk ( ID tskid ) ; ■ パラメータ ● 入力 tskid タスク ID (Task ID) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·tskid が 0 以下または最大タスク数より大きい E_NOEXS -42 オブジェクトが存在していない ·tskid のタスクが存在しない E_OBJ -41 オブジェクトの状態が不正 · 対象タスクが , 実行状態 , 実行可能状態 , 待ち状態または 休止状態 ■ ディスパッチ要因 本システムコールを呼び出したタスクより優先度の高いタスクの強制待ち状態を解除 した場合 , 強制待ち状態が解除されたタスクにディスパッチします。 ■ 解説 tskid で指定されたタスクの強制待ち状態を解除します。すなわち , 対象タスクが以前に 呼び出された tk_sus_tsk によって , 強制待ち状態に入りその実行が中断している場合 , その状態を解除し実行を再開させます。 対象タスクが待ち状態と強制待ち状態の複合した二重待ち状態の場合 , 本システム コールの実行により強制待ち状態だけが解除されて対象タスクは待ち状態となりま す。 本システムコールは , 強制待ち要求のネスト回数を 1 減らします。したがって , 対象タ スクに 2 回以上の tk_sus_tsk が呼び出されている場合 , 本システムコールの終了後も対象タ スクはまだ強制待ち状態のままです。 January 31, 2014, CM81-00210-2a 57 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Su pp or t So ft Manu al ■ 補足事項 本システムコールや tk_frsm_tsk によって , 強制待ち状態のタスクが実行を再開した場 合 , そのタスクは同じ優先度のタスクの中で最低の優先順位となります。例えば , 同じ 優先度の task_A と task_B に以下のシステムコールを実行した場合 , 以下の動作をしま す。 tk_sta_tsk (tskid = task_A, stacd_A); tk_sta_tsk (tskid = task_B, stacd_B); /* この場合 , 優先順位はタスクを起動した順番 , task_A → task_B */ tk_sus_tsk (tskid = task_A); tk_rsm_tsk (tskid = task_A); /* この場合 , 優先順位は task_B → task_A となる */ 58 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Support 3.4.7 Soft Ma nual tk_frsm_tsk(Force Resume Task) 強制待ち状態のタスクを強制再開します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_frsm_tsk ( ID tskid ) ; ■ パラメータ ● 入力 tskid タスク ID (Task ID) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·tskid が 0 以下 , または最大タスク数より大きい E_NOEXS -42 オブジェクトが存在していない ·tskid のタスクが存在しない E_OBJ -41 オブジェクトの状態が不正 · 対象タスクが , 実行状態 , 実行可能状態 , 待ち状態または 休止状態 ■ ディスパッチ要因 システムコールを呼び出したタスクより優先度の高いタスクの強制待ち状態を解除し た場合 , 強制待ち状態が解除されたタスクにディスパッチします。 ■ 解説 tskid で指定されたタスクの強制待ち状態を解除します。 対象タスクが待ち状態と強制待ち状態の複合した二重待ち状態の場合 , 本システム コールの実行により強制待ち状態だけが解除されて対象タスクは待ち状態となりま す。 対象タスクに 2 回以上の tk_sus_tsk が呼び出されている場合でも , それらの要求をすべ て解除します。すなわち , 強制待ち状態は必ず解除されて対象タスクが二重待ち状態で ない限り実行を再開できます。 January 31, 2014, CM81-00210-2a 59 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Su pp or t So ft Manu al ■ 補足事項 本システムコールや tk_rsm_tsk によって , 強制待ち状態のタスクが実行を再開した場 合 , そのタスクは同じ優先度のタスクの中で最低の優先順位となります。例えば , 同じ 優先度の task_A と task_B に以下のシステムコールを実行した場合は以下の動作をし ます。 tk_sta_tsk (tskid = task_A, stacd_A); tk_sta_tsk (tskid = task_B, stacd_B); /* この場合 , 優先順位はタスクを起動した順番 , task_A → task_B */ tk_sus_tsk (tskid = task_A); tk_frsm_tsk (tskid = task_A); /* この場合に優先順位は task_B → task_A となる */ 60 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.4 タスク付属同期機能のシステムコール Support 3.4.8 Soft Ma nual tk_dly_tsk(Delay Task) 自タスクを時間経過待ち状態へ移行します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_dly_tsk ( RELTIM dlytim ) ; ■ パラメータ ● 入力 dlytim 遅延時間 (Delay Time) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 E_RLWAI -49 待ち状態強制解除 · 待ちの間に tk_rel_wai を受け付ける ■ ディスパッチ要因 本システムコールを呼び出したタスクが時間経過待ち状態になった場合 , 次の優先順 位のタスクにディスパッチします。 ■ 解説 自タスクの実行を一時的に停止し , 時間経過待ちの状態に入ります。 タスクの実行を停止する時間を dlytim により指定します。dlytim の基準時間 ( 時間の 単位 ) はシステム時刻の基準時間 ( = 1 ms) と同じです。dlytim が 0 の場合 , 何もせず に E_OK で復帰します。本システムコールを呼び出したタスクが二重待ち状態になっ ている間も時間経過のカウントを行います。 January 31, 2014, CM81-00210-2a 61 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t 3.5 So ft Manu al 同期・通信機能のシステムコール 同期・通信機能のシステムコールを説明します。 ■ 同期・通信機能のシステムコール 同期・通信機能は , 以下の 3 種類の機能のシステムコールで構成されます。 • セマフォ機能のシステムコール • イベントフラグ機能のシステムコール • メールボックス機能のシステムコール 62 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support 3.5.1 Soft Ma nual セマフォ機能のシステムコール セマフォ機能のシステムコールを説明します。 ■ セマフォ機能のシステムコール セマフォ機能は , 以下の 5 種類のシステムコールで構成されます。 • tk_cre_sem(Create Semaphore) • tk_del_sem(Delete Semaphore) • tk_sig_sem(Signal Semaphore) • tk_wai_sem(Wait on Semaphore) • tk_ref_sem(Refer Semaphore Status) January 31, 2014, CM81-00210-2a 63 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t 3.5.1.1 So ft Manu al tk_cre_sem(Create Semaphore) セマフォを生成します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID semid = tk_cre_sem ( T_CSEM *pk_csem ) ; typedef struct t_csem { VP exinf; ATR sematr; INT isemcnt; INT maxsem; } T_CSEM; ■ パラメータ ● 入力 セマフォ生成情報を渡すパケットの先頭アドレス pk_csem (Packet of Create Semaphore) ● pk_csem に設定するデータ exinf 拡張情報 (Extended Information) sematr セマフォ属性 (Semaphore Attribute) sematr:= (TA_TFIFO ∥ TA_TPRI) | (TA_FIRST ∥ TA_CNT) 表 3.5-1 tk_cre_sem の sematr で指定できる定数マクロ 属性 値 意味 TA_TFIFO 0x00000000 待ちタスクを FIFO で管理 TA_TPRI 0x00000001 待ちタスクを優先度順で管理 TA_FIRST 0x00000000 待ち行列先頭のタスクを優先 TA_CNT 0x00000002 資源を獲得できるタスクを優先 isemcnt セマフォカウントの初期値 (Initial Semaphore Count) maxsem セマフォカウントの最大値 (Maximum Semaphore Count) ● 出力 semid セマフォ ID (Semaphore ID) またはエラーコード (Error Code) 64 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support Soft Ma nual ■ エラーコード E_LIMIT -34 セマフォの数がシステムの上限より大きい E_RSATR -11 予約属性 ·sematr に未定義の値が指定された E_PAR -17 パラメータエラー ·isemcnt が負または maxsem より大きい ·maxsem が 0 以下 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 セマフォを生成してセマフォ ID 番号を割り当てます。具体的には , セマフォカウント の初期値が isemcnt, 最大値 ( 上限値 ) が maxsem のセマフォを生成します。 exinf は対象セマフォに関する情報を入れておくためにユーザが自由に使用できます。 ここで指定した情報は , tk_ref_sem で参照できます。ユーザの情報を入れるためにもっ と大きな領域が必要な場合や , 途中で内容を変更したい場合があれば , ユーザプログラ ムでそのためのメモリを確保して , そのアドレスを exinf に入れます。なお , OS は exinf の内容を関知しません。 sematr はセマフォの属性を指定します。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 が指定された場合 , 要求カウント分の資源を獲得できるタスクから順に割り 当てます。具体的には , 待ち行列の先頭のタスクから順に要求カウント数を検査し , 要 求カウント数分の資源を割り当てられるタスクに割り当てます。要求カウント数の少 ない順に割り当てる訳ではありません。 pk_csem が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 65 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t 3.5.1.2 So ft Manu al tk_del_sem(Delete Semaphore) セマフォを削除します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_del_sem ( ID semid ) ; ■ パラメータ ● 入力 semid セマフォ ID (Semaphore ID) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·semid が 0 以下または最大セマフォ数より大きい E_NOEXS -42 オブジェクトが存在していない ·semid のセマフォが存在しない ■ ディスパッチ要因 semid で指定したセマフォを削除したことにより , 本システムコールを呼び出したタス クより優先度の高いタスクの待ち状態が解除された場合 , 待ち状態が解除されたタス クにディスパッチします。 ■ 解説 semid で指定されたセマフォを削除します。具体的には , 対象セマフォを未生成状態に して ID 番号を解放します。 セマフォ待ち状態のタスクが存在していた場合 , 本システムコールはセマフォを削除 し , 正常終了します。待ち状態のタスクは tk_wai_sem が E_DLT のエラーで復帰し , 待 ち状態が解除されます。 66 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support 3.5.1.3 Soft Ma nual tk_sig_sem(Signal Semaphore) セマフォ資源を返却します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_sig_sem ( ID semid, INT cnt ) ; ■ パラメータ ● 入力 semid セマフォ ID (Semaphore ID) cnt 資源返却数 (Signal Count) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·semid が 0 以下または最大セマフォ数より大きい E_NOEXS -42 オブジェクトが存在していない ·semid のセマフォが存在しない E_QOVR -43 キューイングまたはネストのオーバフロー · セマフォ資源数がセマフォ資源の最大値を超えた E_PAR -17 パラメータエラー ·cnt が 0 以下 ■ ディスパッチ要因 本システムコールを呼び出したタスクより優先度の高いタスクのセマフォ待ち状態を 解除した場合 , 待ち状態が解除されたタスクにディスパッチします。 ■ 解説 semid で指定されたセマフォに cnt 個のセマフォ資源を返却する操作を行います。 対象セマフォにセマフォ待ちタスクがある場合 , 資源返却後の資源数が資源要求数よ りも多ければ , 資源を割り当てます。資源が割り当てられたタスクを実行可能状態に移 します。複数のタスクが要求する資源数の総和以上に資源が返却された場合 , 複数のタ スクに資源が割り当てられて実行可能状態になります。 January 31, 2014, CM81-00210-2a 67 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t So ft Manu al ■ 補足事項 セマフォ資源数 (semcnt) がセマフォ資源の初期値 (isemcnt) より大きい場合 , 正常終了 します。排他制御ではなく , 同期の目的 (tk_wup_tsk ~ tk_slp_tsk と同様 ) でセマフォを 使用する場合 , セマフォ資源数 (semcnt) を初期値 (isemcnt) より大きくする場合があり ます。一方 , 排他制御の目的でセマフォを使用する場合 , セマフォ資源の初期値 (isemcnt) とセマフォ資源の最大値 (maxsem) を等しい値にしておくことにより , セマ フォ資源数の増加によるエラーをチェックできます。 68 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support 3.5.1.4 Soft Ma nual tk_wai_sem(Wait on Semaphore) セマフォ資源を獲得します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_wai_sem ( ID semid, INT cnt, TMO tmout ) ; ■ パラメータ ● 入力 semid セマフォ ID (Semaphore ID) cnt 資源要求数 (Require Count) tmout タイムアウト指定 (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロが指定可能 表 3.5-2 tk_wai_sem の tmout で指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·semid が 0 以下または最大セマフォ数より大きい E_NOEXS -42 オブジェクトが存在していない ·semid のセマフォが存在しない E_PAR -17 パラメータエラー ·tmout が -2 以下 ·cnt が 0 以下 E_DLT -51 待ちオブジェクトが削除された · 待ちの間に対象セマフォを削除 E_RLWAI -49 待ち状態強制解除 · 待ちの間に tk_rel_wai を受け付ける January 31, 2014, CM81-00210-2a 69 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t E_TMOUT -50 So ft Manu al ポーリング失敗またはタイムアウト ·tmout の時間経過により待ち状態が解除された ·tmout が TMO_POL で , 資源が獲得できない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクがセマフォ待ち状態になった場合 , 次の優先順 位のタスクにディスパッチします。 ■ 解説 semid で指定されたセマフォから cnt 個の資源を獲得します。 tmout により待ち時間の最大値 ( タイムアウト値 ) を指定できます。tmout の基準時間 ( 時間の単位 ) はシステム時刻の基準時間 ( = 1 ms) と同じです。 TMO_FEVR は , タイムアウトまでの時間が無限大であることを示します。TMO_FEVR を指定される場合 , 資源の獲得または tk_rel_wai が呼び出されるまで待ち状態になりま す。TMO_POL を指定される場合 , 資源を獲得できなければ待ち状態には移行せずに E_TMOUT のエラーで復帰します。 資源を獲得した場合 , 本システムコールの呼出しタスクは待ち状態に入らずに実行を 継続します。この場合 , そのセマフォ資源数を cnt 分減算します。 資源が獲得できない場合 , 本システムコールを呼び出したタスクは待ち状態に入りま す。すなわち , そのセマフォに対する待ち行列につながれます。この場合 , そのセマ フォ資源数は増減しません。 70 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support 3.5.1.5 Soft Ma nual tk_ref_sem(Refer Semaphore Status) セマフォの状態を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ref_sem ( ID semid, T_RSEM *pk_rsem ) ; typedef struct t_rsem { VP exinf; ID wtsk; INT semcnt; } T_RSEM; ■ パラメータ ● 入力 semid セマフォ ID (Semaphore ID) pk_rsem セマフォの状態を返すパケットアドレス (Packet of Refer Semaphore) ● 出力 ercd エラーコード (Error Code) ● pk_rsem に返されるデータ exinf 拡張情報 (Extended Information) wtsk 待ちタスクの有無 (Wait Task) semcnt 現在のセマフォカウント値 (Semaphore Count) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·semid が 0 以下または最大セマフォ数より大きい E_NOEXS -42 オブジェクトが存在していない ·semid のセマフォが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 January 31, 2014, CM81-00210-2a 71 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t So ft Manu al ■ 解説 semid で指定された対象セマフォの各種状態を参照して , 復帰値として現在のセマフォ 資源数 (semcnt), 待ちタスクの有無 (wtsk), 拡張情報 (exinf) を返します。 wtsk は , このセマフォで待っているタスクの ID を示します。複数のタスクが待ってい る場合 , 待ち行列の先頭タスクの ID を返します。待ちタスクがない場合 , 0 を返します。 pk_rsem が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 72 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support 3.5.2 Soft Ma nual イベントフラグ機能のシステムコール イベントフラグ機能のシステムコールを説明します。 ■ イベントフラグ機能のシステムコール イベントフラグ機能は , 以下の 6 種類のシステムコールで構成されます。 • tk_cre_flg(Create Event Flag) • tk_del_flg(Delete Event Flag) • tk_set_flg(Set Event Flag) • tk_clr_flg(Clear Event Flag) • tk_wai_flg(Wait Event Flag) • tk_ref_flg(Refer Event Flag Status) January 31, 2014, CM81-00210-2a 73 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t 3.5.2.1 So ft Manu al tk_cre_flg(Create Event Flag) イベントフラグを生成します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID flgid = tk_cre_flg ( T_CFLG *pk_cflg ) ; typedef struct t_cflg { VP exinf; ATR flgatr; UINT iflgptn; } T_CFLG; ■ パラメータ ● 入力 イベントフラグの状態を返すパケットアドレス pk_cflg (Packet of Refer Event Flag) ● pk_cflg に設定するデータ exinf 拡張情報 (Extended Information) flgatr イベントフラグ属性 (Event Flag Attribute) flgatr := (TA_TFIFO ∥ TA_TPRI) | (TA_WMUL ∥ TA_WSGL) 表 3.5-3 tk_cre_flg の flgatr で指定できる定数マクロ 属性 値 意味 TA_TFIFO 0x00000000 待ちタスクを FIFO で管理 TA_TPRI 0x00000001 待ちタスクを優先度順で管理 TA_WSGL 0x00000000 複数タスクの待ちを禁止 TA_WMUL 0x00000008 複数タスクの待ちを許可 iflgptn イベントフラグの初期値 (Initial Event Flag Pattern) ● 出力 flgid イベントフラグ ID (Event Flag ID) またはエラーコード (Error Code) 74 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support Soft Ma nual ■ エラーコード E_LIMIT -34 イベントフラグの数がシステムの上限より大きい E_RSATR -11 予約属性 ·flgatr に未定義の値が指定された ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 イベントフラグを生成して , イベントフラグ ID 番号を割り当てます。具体的には , 初 期値が iflgptn のイベントフラグを生成します。 exinf は , 対象イベントフラグに関する情報を入れておくためにユーザが自由に利用で きます。ここで指定した情報を tk_ref_flg で参照できます。ユーザの情報を入れるため にもっと大きな領域が必要な場合や , 途中で内容を変更したい場合があれば , ユーザプ ログラムでそのためのメモリを確保し , そのアドレスを exinf に入れます。なお , OS で は exinf の内容については関知しません。 flgatr はイベントフラグの属性を指定します。 flgatr に TA_WSGL が指定された場合 , 複数のタスクが同時に待ち状態になることを禁 止します。TA_WMUL が指定された場合 , 同時に複数のタスクが待ち状態となります。 TA_TFIFO, TA_TPRI では , タスクがイベントフラグの待ち行列に並ぶ場合の並び方を 指定できます。TA_TFIFO の場合 , タスクの待ち行列は FIFO となり , TA_TPRI の場合 , タスクの待ち行列はタスクの優先度順となります。ただし , TA_WSGL が指定された場 合は待ち行列を作らないため , TA_TFIFO, TA_TPRI のどちらを指定しても動作に違い はありません。 複数のタスクが待っている場合 , 待ち行列の先頭から順に待ち条件が成立しているか を検査して , 待ち条件が成立しているタスクの待ちを解除します。したがって , 待ち行 列先頭のタスクを必ずしも最初に待ち解除する訳ではありません。また , 待ち条件が成 立したタスクが複数ある場合 , 複数のタスクの待ちを解除します。 pk_cflg が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 75 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t 3.5.2.2 So ft Manu al tk_del_flg(Delete Event Flag) イベントフラグを削除します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_del_flg ( ID flgid ) ; ■ パラメータ ● 入力 flgid イベントフラグ ID (Event Flag ID) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·flgid が 0 以下または最大フラグ数より大きい E_NOEXS -42 オブジェクトが存在していない ·flgid のイベントフラグが存在しない ■ ディスパッチ要因 flgid で指定したイベントフラグを削除したことにより , 本システムコールを呼び出し たタスクより優先度の高いタスクの待ち状態が解除された場合 , 待ち状態が解除され たタスクにディスパッチします。 ■ 解説 flgid で指定されたイベントフラグを削除します。具体的には , 対象イベントフラグを 未生成状態にして ID 番号を解放します。 対象イベントフラグで条件成立を待っているタスクがある場合 , 本システムコールは 正常終了しますが , 待ち状態のタスクは tk_wai_flg が E_DLT のエラーで復帰します。 76 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support 3.5.2.3 Soft Ma nual tk_set_flg(Set Event Flag) イベントフラグをセットします。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_set_flg ( ID flgid, UINT setptn ) ; ■ パラメータ ● 入力 flgid イベントフラグ ID (Event Flag ID) setptn セットするビットパターン (Set Bit Pattern) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·flgid が 0 以下または最大フラグ数より大きい E_NOEXS -42 オブジェクトが存在していない ·flgid のイベントフラグが存在しない ■ ディスパッチ要因 本システムコールを呼び出したタスクより優先度の高いタスクのイベントフラグ待ち 状態を解除した場合 , 待ち状態が解除されたタスクにディスパッチします。 ■ 解説 本システムコールは , flgid で指定されたイベントフラグへ setptn で示されているビッ トをセットします。すなわち , flgid で指定されたイベントフラグの値に setptn の値で 論理和をとります。 本システムコールによりイベントフラグの値を変更し , tk_wai_flg で待っていたタスク の待ち解除の条件を満たしていれば , そのタスクの待ち状態を解除します。その結果 , 待っていたタスクは実行状態または実行可能状態に移行します。ただし , 待っていたタ スクが二重待ち状態の場合 , 強制待ち状態へと移行します。 本システムコールで setptn の全ビットを 0 とした場合 , 対象イベントフラグに何の操作 も行わずに正常終了します。 TA_WMUL の属性のイベントフラグは , 同一のイベントフラグに複数のタスクを同時 に待てます。したがって , イベントフラグでもタスクが待ち行列を作ります。この場 合 , 1 回の本システムコールで複数のタスクが待ち解除になる場合があります。 January 31, 2014, CM81-00210-2a 77 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t 3.5.2.4 So ft Manu al tk_clr_flg(Clear Event Flag) イベントフラグをクリアします。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_clr_flg ( ID flgid, UINT clrptn ) ; ■ パラメータ ● 入力 flgid イベントフラグ ID (Event Flag ID) clrptn クリアするビットパターン (Clear Bit Pattern) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·flgid が 0 以下または最大フラグ数より大きい E_NOEXS -42 オブジェクトが存在していない ·flgid のイベントフラグが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 本システムコールは , flgid で指定されたイベントフラグの値に clrptn が 0 になっている ビットをクリアします。すなわち , flgid で指定されたイベントフラグの値に clrptn の値 で論理積をとります。 本システムコールでは , 対象イベントフラグを待っているタスクの待ち状態を解除し ません。 本システムコールで clrptn の全ビットを 1 とした場合 , 対象イベントフラグに何の操作 も行いません。ただし , この場合でも正常終了します。 78 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support 3.5.2.5 Soft Ma nual tk_wai_flg(Wait Event Flag) イベントフラグを待ちます。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_wai_flg ( ID flgid, UINT waiptn, UINT wfmode, UINT *p_flgptn, TMO tmout ) ; ■ パラメータ ● 入力 flgid イベントフラグ ID (Event Flag ID) waiptn 待ちビットパターン (Wait Bit Pattern) wfmode 待ちモード (Wait Event Flag Mode) wfmode := (TWF_ANDW ∥ TWF_ORW) | [TWF_CLR ∥ TWF_BITCLR] 表 3.5-4 tk_wai_flg の wfmode で指定できる定数マクロ モード 値 意味 TWF_ANDW 0x00 AND 待ち TWF_ORW 0x01 OR 待ち TWF_CLR 0x10 全ビットクリア指定 TWF_BITCLR 0x20 条件ビットだけをクリア指定 tmout タイムアウト指定 (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロが指定可能 表 3.5-5 tk_wai_flg の tmout で指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 ercd エラーコード (Error Code) p_flgptn 待ち解除時のビットパターン (Event Flag Bit Pattern) January 31, 2014, CM81-00210-2a 79 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t So ft Manu al ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·flgid が 0 以下または最大フラグ数より大きい E_NOEXS -42 オブジェクトが存在していない ·flgid のイベントフラグが存在しない E_PAR -17 パラメータエラー ·waiptn が 0 ·wfmode に TWF_ANDW, TWF_ORW, TWF_CLR, TWF_BITCLR 以外の値が設定されている ·tmout が -2 以下 E_OBJ -41 オブジェクトの状態が不正 ·TA_WSGL 属 性 の イ ベ ン ト フ ラ グ に 対 す る 複 数 タ ス ク の 待 ち E_DLT -51 待ちオブジェクトが削除された · 待ちの間に対象イベントフラグを削除 E_RLWAI -49 待ち状態強制解除 · 待ちの間に tk_rel_wai を受け付ける E_TMOUT -50 ポーリング失敗またはタイムアウト ·tmout の時間経過により待ち状態が解除された ·tmout が TMO_POL で , 待ち解除の条件を満たしていない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクがイベントフラグ待ち状態になった場合 , 次の 優先順位のタスクにディスパッチします。 ■ 解説 本システムコールでは , wfmode で指定された待ち解除の条件に従って , flgid で指定さ れたイベントフラグがセットされるのを待ちます。 flgid で指定されたイベントフラグが既に wfmode で指定された待ち解除条件を満たし ている場合 , 呼び出したタスクは待ち状態にならずに実行を続けます。wfmode には , 以下の 4 種類の待ちモードを指定できます。 • TWF_ORW: flgid で指定されたイベントフラグに , waiptn で指定されたビットの いずれかがセットされるのを待ちます (OR 待ち )。 • TWF_ANDW: flgid で指定されたイベントフラグに , waiptn で指定されたビットの すべてがセットされるのを待ちます (AND 待ち )。 • TWF_CLR : 条件が満足されてこのタスクが待ち解除となった場合 , イベントフ ラグの値 ( 全部のビット ) を 0 にクリアします (TWF_CLR の指定あ り )。条件が満足されてこのタスクが待ち解除となった場合 , イベ ントフラグの値はそのままです (TWF_CLR の指定なし )。 80 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support Soft Ma nual • TWF_BITCLR: 条件が満足されてこのタスクが待ち解除となった場合 , イベントフ ラグの待ち解除条件に一致したビットだけを 0 に クリアします ( イベントフラグ値 &= ~ 待ち解除条件 ) 。 p_flgptn には , 待ち状態を解除するときのイベントフラグの値 (flgptn) を設定する領域 のアドレスを指定します。TWF_CLR または TWF_BITCLR 指定の場合 , flgptn の値は イベントフラグがクリアされる前の値です。つまり , flgptn に返る値は待ち解除の条件 を満たしています。 なお , タイムアウト , tk_rel_wai または tk_del_flg により待ちが解除されると flgptn は不 定となります。 tmout により , 待ち時間の最大値 ( タイムアウト値 ) を指定できます。TMO_FEVR は , タイムアウトまでの時間が無限大であることを示します。TMO_FEVR を指定される場 合 , 条件成立または tk_rel_wai が呼び出されるまで待ち状態になります。TMO_POL を 指定される場合 , 条件成立できなければ待ち状態には移行せずに E_TMOUT のエラー で復帰します。 タイムアウトした場合は , TWF_CLR または TWF_BITCLR の指定があってもイベント フラグをクリアしません。 tmout の基準時間 ( 時間の単位 ) はシステム時刻の基準時間 ( = 1 ms) と同じです。 TA_WSGL 属性のイベントフラグで既に待ちタスクの存在する場合 , 別のタスクで本 システムコールを実行できません。この場合は , 後から本システムコールを実行したタ スクが待ち状態に入るかどうか ( 待ち解除条件が満たされているかどうか ) にかかわら ず , 後から本システムコールを実行したタスクは E_OBJ のエラーで復帰します。 一方, TA_WMUL 属性のイベントフラグは, 同一のイベントフラグに複数のタスクを同 時に待ち状態に移行できます。したがって , イベントフラグでもタスクが待ち行列を作 ります。複数タスクが待ち状態の場合 , 1 回の tk_set_flg で条件成立することで複数の タスクが待ち解除される場合があります。 TA_WMUL 属性のイベントフラグに複数のタスクが待ち行列を作った場合 , 以下の動 作をします。 • 待ち行列の順番は FIFO またはタスク優先度順です ( ただし , waiptn や wfmode との 関係により , 必ずしも行列先頭のタスクから待ち解除になるとは限りません )。 • 待ち行列中にクリア指定のタスクがある場合 , そのタスクが待ち解除になるときに フラグをクリアします。 • クリア指定を行っていたタスクよりも後ろの待ち行列にあったタスクは , クリアさ れた後のイベントフラグを確認します。 tk_set_flg によって同じ優先度の複数のタスクが同時に待ち解除となる場合 , 待ち解除 後のタスクの優先順位は元のイベントフラグの待ち行列の順序を保持します。 p_flgptn が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 81 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t So ft Manu al ■ 補足事項 本システムコールの待ち解除条件として全ビットの論理和を指定すると (waiptn = 0xffffffff, wfmode = TWF_ORW), tk_set_flg との組合せにより , CPU のビット幅分のビッ トパターンによるメッセージ転送ができます。ただし , この場合 , 全部のビットが 0 の メッセージは送れません。また , 前のメッセージが本システムコールで読み出される前 にtk_set_flgにより次のメッセージが送られると, 前のメッセージは消えてしまいます。 すなわち , メッセージのキューイングはできません。waiptn = 0 の指定は E_PAR のエ ラーになるので , イベントフラグで待つタスクの waiptn が 0 でないことを保証してい ます。したがって , tk_set_flg で全ビットをセットすると , どの条件でイベントフラグを 待つタスクであっても , 待ち行列の先頭にあるタスクは必ず待ち解除となります。 82 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support 3.5.2.6 Soft Ma nual tk_ref_flg(Refer Event Flag Status) イベントフラグの状態を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ref_flg ( ID flgid, T_RFLG *pk_rflg ) ; typedef struct t_rflg { VP exinf; ID wtsk; UINT flgptn; } T_RFLG; ■ パラメータ ● 入力 flgid イベントフラグ ID (Event Flag ID) pk_rflg イベントフラグの状態を返すパケットの先頭アドレス (Packet of Refer Event Flag) ● 出力 ercd エラーコード (Error Code) ● pk_rflg に返されるデータ exinf 拡張情報 (Extended Information) wtsk 待ちタスクの有無 (Wait Task) flgptn イベントフラグのビットパターン (Event Flag Bit Pattern) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·flgid が 0 以下または最大フラグ数より大きい E_NOEXS -42 オブジェクトが存在していない ·flgid のイベントフラグが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 January 31, 2014, CM81-00210-2a 83 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t So ft Manu al ■ 解説 flgid で指定された対象イベントフラグの各種の状態を参照し , 復帰値として現在のフ ラグ値 (flgptn), 待ちタスクの有無 (wtsk), 拡張情報 (exinf) を返します。 wtsk は , このイベントフラグで待っているタスクの ID を設定します。このイベントフ ラグで複数のタスクが待っている場合 (TA_WMUL 属性の場合 ) 待ち行列の先頭タスク の ID を返します。待ちタスクがない場合 , 0 を返します。 pk_rflg が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 84 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support 3.5.3 Soft Ma nual メールボックス機能のシステムコール メールボックス機能のシステムコールを説明します。 ■ メールボックス機能のシステムコール メールボックス機能は , 以下の 5 種類のシステムコールで構成されます。 • tk_cre_mbx(Create Mailbox) • tk_del_mbx(Delete Mailbox) • tk_snd_mbx(Send Message to Mailbox) • tk_rcv_mbx(Receive Message from Mailbox) • tk_ref_mbx(Refer Mailbox Status) January 31, 2014, CM81-00210-2a 85 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t 3.5.3.1 So ft Manu al tk_cre_mbx(Create Mailbox) メールボックスを作成します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID mbxid = tk_cre_mbx ( T_CMBX* pk_cmbx ) ; typedef struct t_cmbx { VP exinf; ATR mbxatr; } T_CMBX; ■ パラメータ ● 入力 メールボックス生成情報 (Packet of Create Mailbox) pk_cmbx ● pk_cmbx に設定するデータ exinf 拡張情報 (Extended Information) mbxatr メールボックス属性 (Mailbox Attribute) mbxatr:= (TA_TFIFO ∥ TA_TPRI) | (TA_MFIFO ∥ TA_MPRI) 表 3.5-6 tk_cre_mbx の mbxatr で指定できる定数マクロ 属性 値 意味 TA_TFIFO 0x00000000 待ちタスクを FIFO で管理 TA_TPRI 0x00000001 待ちタスクを優先度順で管理 TA_MFIFO 0x00000000 メッセージを FIFO で管理 TA_MPRI 0x00000002 メッセージを優先度順で管理 ● 出力 mbxid メールボックス ID (Mailbox ID) またはエラーコード (Error Code) ■ エラーコード E_LIMIT -34 メールボックスの数がシステムの上限より大きい E_RSATR -11 予約属性 ·mbxatr に未定義の値が指定された ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 86 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support Soft Ma nual ■ 解説 メールボックスを生成しメールボックス ID 番号を割り当てます。 exinf は , 対象メールボックスに関する情報を入れておくためにユーザが自由に使用で きます。ここで指定した情報を tk_ref_mbx で参照できます。ユーザの情報を入れるた めにもっと大きな領域が必要な場合や , 途中で内容を変更したい場合があれば , ユーザ プログラムでそのためのメモリを確保して , そのアドレスを exinf に入れます。なお , OS は exinf の内容を関知しません。 mbxatr はメールボックスの属性を指定します。 TA_TFIFO, TA_TPRI で , メッセージを受信するタスクがメールボックスの待ち行列に 並ぶ際の並び方を指定できます。属性が TA_TFIFO の場合 , タスクの待ち行列は FIFO となり , TA_TPRI の場合 , タスクの待ち行列はタスクの優先度順となります。 一方 , TA_MFIFO, TA_MPRI で , メッセージがメッセージキュー ( 受信するのを待つ メッセージの待ち行列 ) に入る際の並び方を指定できます。TA_MFIFO の場合 , メッ セージキューは FIFO となり , TA_MPRI の場合 , メッセージキューはメッセージの優 先度順となります。メッセージの優先度は , メッセージパケット内の msgpri で指定し ます (「3.5.3.3 tk_snd_mbx(Send Message to Mailbox)」を参照 )。メッセージ優先度は正 の値で , 1 が最も優先度が高く , 数値が大きくなるほど優先度は低くなります。PRI 型 で表せる最大の正の値が最も低い優先度となります。同一優先度の場合は FIFO とな ります。 pk_cmbx が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 87 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t 3.5.3.2 So ft Manu al tk_del_mbx(Delete Mailbox) メールボックスを削除します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_del_mbx ( ID mbxid ) ; ■ パラメータ ● 入力 mbxid メールボックス ID (Mailbox ID) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mbxid が 0 以下または最大メールボックス数より大きい E_NOEXS -42 オブジェクトが存在していない ·mbxid のメールボックスが存在しない ■ ディスパッチ要因 mbxid で指定したメールボックスを削除したことにより , 本システムコールを呼び出し たタスクより優先度の高いタスクの待ち状態が解除された場合 , 待ち状態が解除され たタスクにディスパッチします。 ■ 解説 mbxid で指定されたメールボックスを削除します。具体的には , 対象メールボックスを 未生成状態にして ID 番号を解放します。 対象メールボックスでメッセージを待っているタスクがあった場合 , 本システムコー ルは正常終了しますが , tk_rcv_mbx で待ち状態にあるタスクは E_DLT のエラーで復帰 します。 88 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support 3.5.3.3 Soft Ma nual tk_snd_mbx(Send Message to Mailbox) メールボックスへ送信します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_snd_mbx ( ID mbxid, T_MSG *pk_msg ) ; typedef struct t_msg { VP msgque[1]; } T_MSG; typedef struct t_msg_pri { T_MSG msgque; PRI msgpri; } T_MSG_PRI; ■ パラメータ ● 入力 mbxid メールボックス ID (Mailbox ID) pk_msg メッセージパケットの先頭アドレス (Packet of Message) ● pk_msg に設定するデータ msgque メッセージキュー用 OS 予約領域 msgpri メッセージ優先度 (Message priority) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mbxid が 0 以下または最大メールボックス数より大きい E_NOEXS -42 オブジェクトが存在していない ·mbxid のメールボックスが存在しない E_PAR -17 パラメータエラー · 対象メールボックスがメッセージ優先順で msgpri が 0 以下 January 31, 2014, CM81-00210-2a 89 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t So ft Manu al ■ ディスパッチ要因 本システムコールを呼び出したタスクより優先度の高いタスクのメッセージ待ち状態 を解除した場合 , 待ち状態が解除されたタスクにディスパッチします。 ■ 解説 mbxid で指定された対象メールボックスに , pk_msg を先頭アドレスとするメッセージ パケットを送信します。 メッセージパケットの内容をコピーせず , 受信時には先頭アドレス (pk_msg の値 ) だけ を渡します。対象メールボックスで既にメッセージを待っているタスクがある場合 , 待 ち行列の先頭タスクの待ち状態が解除されて , 本システムコールで指定された pk_msg がそのタスクに送信されて tk_rcv_mbx の復帰値となります。一方 , 対象メールボック スでメッセージを待っているタスクがない場合 , 送信されたメッセージはメールボッ クスの中のメッセージキュー ( メッセージの待ち行列 ) に入れられます。どちらの場合 も , 本システムコールを呼び出したタスクは待ち状態とはなりません。pk_msg はメッ セージヘッダをも含めたメッセージパケットの先頭アドレスです。 TA_MFIFO の場合は T_MSG 型 , TA_MPRI の場合は T_MSG_PRI 型のメッセージヘッ ダを使用してください。TA_MPRI 属性のメールボックスに対して T_MSG のメッセー ジヘッダを使用した場合は msgpri のフィールドがないため , 動作は保証されません。 また , メッセージヘッダのサイズは固定長で , sizeof(T_MSG) または sizeof(T_MSG_PRI) で獲得します。実際にメッセージを格納できるのは , メッセージヘッダより後ろの領域 となります。メッセージ本体部分のサイズには制限はありません。 pk_msg が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 ■ 補足事項 本システムコールによるメッセージ送信は , 受信側のタスクの状態とは無関係です。す なわち , 非同期のメッセージ送信を行います。待ち行列につながれるのは , そのタスク が呼び出したメッセージであって , タスクそのものではありません。すなわち , メッ セージの待ち行列 ( メッセージキュー ) や受信タスクの待ち行列は存在しますが , 送信 タスクの待ち行列は存在しません。 90 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support 3.5.3.4 Soft Ma nual tk_rcv_mbx(Receive Message from Mailbox) メールボックスから受信します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_rcv_mbx ( ID mbxid, T_MSG **ppk_msg, TMO tmout ) ; typedef struct t_msg { VP msgque[1]; } T_MSG; typedef struct t_msg_pri { T_MSG msgque; PRI msgpri; } T_MSG_PRI; ■ パラメータ ● 入力 mbxid メールボックス ID (Mailbox ID) ppk_msg メッセージパケットの先頭アドレスを返す変数の アドレス (Packet of Message) tmout タイムアウト指定 (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロが指定可能 表 3.5-7 tk_rcv_mbx の tmout で指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 ercd エラーコード (Error Code) ● ppk_msg に返されるデータ msgque メッセージキュー用 OS 予約領域 msgpri メッセージ優先度 (Message priority) January 31, 2014, CM81-00210-2a 91 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t So ft Manu al ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mbxid が 0 以下または最大メールボックス数より大きい E_NOEXS -42 オブジェクトが存在していない ·mbxid のメールボックスが存在しない E_PAR -17 パラメータエラー ·tmout が -2 以下 E_DLT -51 待ちオブジェクトが削除された · 待ちの間に対象メールボックスを削除 E_RLWAI -49 待ち状態強制解除 · 待ちの間に tk_rel_wai を受け付ける E_TMOUT -50 ポーリング失敗またはタイムアウト ·tmout の時間経過により待ち状態が解除された ·tmout が TMO_POL で , メールボックスにメッセージが 存在しない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクがメッセージ待ち状態になった場合 , 次の優先 順位のタスクにディスパッチします。 ■ 解説 本システムコールでは , mbxid で指定されたメールボックスからメッセージを受信し ます。 tmout により , 待ち時間の最大値 ( タイムアウト値 ) を指定できます。TMO_FEVR は , タイムアウトまでの時間が無限大であることを示します。この場合は , メッセージの到 着または tk_rel_wai が呼び出されるまで待ち状態になります。TMO_POL を指定される 場合 , メッセージが到着していなければ , E_TMOUT のエラーで復帰します。 tmout の基準時間 ( 時間の単位 ) はシステム時刻の基準時間 ( = 1 ms) と同じです。 対象メールボックスにまだメッセージが送信されていない場合 ( メッセージキューが 空の場合 ), 本システムコールを呼び出したタスクは待ち状態となり , メッセージの到 着を待つ待ち行列につながれます。一方 , 対象メールボックスに既にメッセージが入っ ている場合 , メッセージキューの先頭にあるメッセージを 1 つ取り出して , それを復帰 値 ppk_msg とします。 ppk_msg が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 ■ 補足事項 ppk_msg はメッセージヘッダを含めたメッセージパケットの先頭アドレスです。 TA_MFIFO の場合は T_MSG 型 , TA_MPRI の場合は T_MSG_PRI 型のメッセージヘッ ダを使用します。 92 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Support 3.5.3.5 Soft Ma nual tk_ref_mbx(Refer Mailbox Status) メールボックスの状態を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ref_mbx ( ID mbxid, T_RMBX *pk_rmbx ) ; typedef struct t_rmbx { VP exinf; ID wtsk; T_MSG *pk_msg; } T_RMBX; ■ パラメータ ● 入力 mbxid メールボックス ID (Mailbox ID) pk_rmbx メールボックスの状態を返すパケットアドレス (Packet of Refer Mailbox) ● 出力 ercd エラーコード (Error Code) ● pk_rmbx に返されるデータ extinf 拡張情報 (Extended Information) wtsk 待ちタスクの有無 (Wait Task) pk_msg 次に受信するメッセージパケットの先頭アドレス (Packet of Message) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mbxid が 0 以下または最大メールボックス数より大きい E_NOEXS -42 オブジェクトが存在していない ·mbxid のメールボックスが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 January 31, 2014, CM81-00210-2a 93 第 3 章 システムコールインタフェース 3.5 同期・通信機能のシステムコール Su pp or t So ft Manu al ■ 解説 mbxid で指定された対象メールボックスの各種状態を参照して復帰値として次に受信 するメッセージ ( メッセージキューの先頭のメッセージ ), 待ちタスクの有無 (wtsk), 拡 張情報 (exinf) を返します。 wtsk は , このメールボックスで待っているタスクの ID を設定します。このメールボッ クスで複数のタスクが待っている場合 , 待ち行列の先頭のタスクの ID を返します。待 ちタスクがない場合 , 0 を返します。 pk_msg は , 次に tk_rcv_mbx を実行した場合に受信するメッセージです。メッセージ キューにメッセージがないときには pk_msg は NULL となります。また , どんな場合で も , 「pk_msg が NULL」または「wtsk が 0 」の少なくとも一方の状態は成り立ちます。 pk_rmbx が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 94 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support 3.6 Soft Ma nual 拡張同期・通信機能のシステムコール 拡張同期・通信機能のシステムコールを説明します。 ■ 拡張同期・通信機能のシステムコール 拡張同期・通信機能は , 以下の 3 種類の機能のシステムコールで構成されます。 • ミューテックス機能のシステムコール • メッセージバッファ機能のシステムコール • ランデブポート機能のシステムコール January 31, 2014, CM81-00210-2a 95 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t 3.6.1 So ft Manu al ミューテックス機能のシステムコール ミューテックス機能のシステムコールを説明します。 ■ ミューテックス機能のシステムコール ミューテックス機能は , 以下の 5 種類のシステムコールで構成されます。 • tk_cre_mtx(Create Mutex) • tk_del_mtx(Delete Mutex) • tk_loc_mtx(Lock Mutex) • tk_unl_mtx(Unlock Mutex) • tk_ref_mtx(Refer Mutex Status) 96 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support 3.6.1.1 Soft Ma nual tk_cre_mtx(Create Mutex) ミューテックスを生成します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID mtxid = tk_cre_mtx ( T_CMTX *pk_cmtx ) typedef struct t_cmtx { VP exinf; ATR mtxatr; PRI ceilpri; } T_CMTX; ■ パラメータ ● 入力 ミューテックス生成情報を設定する pk_cmtx パケットアドレス (Packet of Create Mutex) ● pk_cmtx に設定するデータ exinf 拡張情報 (Extended Information) mtxatr ミューテックス属性 (Mutex Attribute) mtxatr:= (TA_TFIFO ∥ TA_TPRI ∥ TA_INHERIT ∥ TA_CEILING) 表 3.6-1 tk_cre_mtx の mtxatr で指定できる定数マクロ 属性 値 意味 TA_TFIFO 0x00000000 待ちタスクを FIFO で管理 TA_TPRI 0x00000001 待ちタスクを優先度順で管理 TA_INHERIT 0x00000002 優先度継承プロトコル TA_CEILING 0x00000003 優先度上限プロトコル ceilpri ミューテックスの上限優先度 (Ceiling Priority) ● 出力 mtxid ミューテックス ID (Mutex ID) またはエラーコード (Error Code) January 31, 2014, CM81-00210-2a 97 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t So ft Manu al ■ エラーコード E_LIMIT -34 ミューテックスの数がシステムの上限より大きい E_RSATR -11 予約属性 ·mtxatr に未定義の値が指定された E_PAR -17 パラメータエラー ·ceilpri が 0 以下または最大優先度より大きい (mtxatr に TA_CEILING を指定している場合 ) ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 ミューテックスを生成し , ミューテックス ID 番号を割り当てます。 exinf は , 対象ミューテックスに関する情報を入れておくためにユーザが自由に使用で きます。ここで指定した情報を tk_ref_mtx で参照できます。ユーザの情報を入れるた めにもっと大きな領域が必要な場合や , 途中で内容を変更したい場合があれば , ユーザ プログラムでそのためのメモリを確保して , そのアドレスを exinf に入れます。OS で は exinf の内容を関知しません。 mtxatr はミューテックスの属性を指定します。 mtxatr に TA_TFIFO が指定された場合 , ミューテックスのタスクの待ち行列は FIFO と なります。TA_TPRI, TA_INHERIT, TA_CEILING が指定された場合 , タスクの待ち行列 は優先度順となります。TA_INHERIT で優先度継承プロトコル , TA_CEILING で優先 度上限プロトコルを適用します。 ceilpri は , mtxatr に TA_CEILING が指定された場合だけに有効となり , ミューテックス の上限優先度を設定します。 また , pk_cmtx が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 98 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support 3.6.1.2 Soft Ma nual tk_del_mtx(Delete Mutex) ミューテックスを削除します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_del_mtx ( ID mtxid ) ; ■ パラメータ ● 入力 mtxid ミューテックス ID (Mutex ID) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mtxid が 0 以下または最大ミューテックス数より大きい E_NOEXS -42 オブジェクトが存在していない ·mtxid のミューテックスが存在しない ■ ディスパッチ要因 mtxid で指定したメールボックスを削除したことにより , 本システムコールを呼び出し たタスクより優先度の高いタスクの待ち状態が解除された場合 , 待ち状態が解除され たタスクにディスパッチします。 ■ 解説 mtxid で指定されたミューテックスを削除します。具体的には , 対象ミューテックスを 未生成状態にして ID 番号を解放します。 対象ミューテックスでロック待ちしているタスクがある場合 , 本システムコールは正 常終了しますが , 待ち状態にあったタスクは E_DLT のエラーで復帰します。ミュー テックスを削除すると , そのミューテックスをロックしているタスクにとっては , ロッ クしているミューテックスが減ります。したがって , 削除されるミューテックスが TA_INHERIT または TA_CEILING 属性の場合 , ロックしていたタスクの現在優先度を 変更する場合があります。 January 31, 2014, CM81-00210-2a 99 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t 3.6.1.3 So ft Manu al tk_loc_mtx(Lock Mutex) ミューテックスをロックします。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_loc_mtx ( ID mtxid, TMO tmout ) ; ■ パラメータ ● 入力 mtxid ミューテックス ID (Mutex ID) tmout タイムアウト指定 (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロ指定可能 表 3.6-2 tk_loc_mtx の tmout で指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 ercd 100 エラーコード (Error Code) CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support Soft Ma nual ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mtxid が 0 以下または最大ミューテックス数より大きい E_NOEXS -42 オブジェクトが存在していない ·mtxid のミューテックスが存在しない E_PAR -17 パラメータエラー ·tmout が -2 以下 E_DLT -51 待ちオブジェクトが削除された · 待ちの間に対象ミューテックスを削除 E_RLWAI -49 待ち状態強制解除 · 待ちの間に tk_rel_wai を受け付ける E_TMOUT -50 ポーリング失敗またはタイムアウト ·tmout の時間経過により待ち状態が解除された ·tmout が TMO_POL で , ロックが獲得できない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 E_ILUSE -28 不正使用 · 対象ミューテックスが自タスクでロック中 · 自タスクのベース優先度が対象ミューテックスの 上限優先度より高い (TA_CEILING が指定されている場合 ) ■ ディスパッチ要因 本システムコールを呼び出したタスクがロック待ち状態になった場合 , 次の優先順位 のタスクにディスパッチします。 ■ 解説 mtxid のミューテックスをロックします。 tmout により , 待ち時間の最大値 ( タイムアウト値 ) を指定できます。TMO_FEVR は , タイムアウトまでの時間が無限大であることを示します。この場合は , ロックの獲得 または tk_rel_wai が呼び出されるまで待ち状態になります。TMO_POL を指定される 場合 , ロックの獲得できなければ , E_TMOUT のエラーで復帰します。 tmout の基準時間 ( 時間の単位 ) はシステム時刻の基準時間 ( = 1 ms) と同じです。 ミューテックスがロックできると待ち状態に入らないで , 本システムコールの呼出し タスクは正常復帰します。この場合 , そのミューテックスはロック状態になります。 ロックできない場合 , 本システムコールを呼び出したタスクは待ち状態に入ります。す なわち , そのミューテックスに対する待ち行列につながれます。 January 31, 2014, CM81-00210-2a 101 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t So ft Manu al ■ 補足事項 • TA_INHERIT 属性のミューテックスの場合 ミューテックスを既にロックしているタスクの現在優先度が自タスクより低い場 合 , ロックしているタスクの現在優先度を自タスクと同じ現在優先度まで引き上げ ます。ミューテックスのロック獲得待ち状態のタスクがタイムアウトなどで待ちを 終了した場合 , そのミューテックスをロックしているタスクの現在優先度は , 以下 のうちの最も高い現在優先度になります。 (A) そのミューテックスでロック待ちしているほかのタスクの現在優先度のうち の最も高い優先度。 (B) ロック中のタスクのベース優先度。 • TA_CEILING 属性のミューテックスの場合 自タスクがロックを獲得し , 自タスクの現在優先度がミューテックスの上限優先度 より低い場合 , 自タスクの現在優先度をミューテックスの上限優先度まで引き上げ ます。 102 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support 3.6.1.4 Soft Ma nual tk_unl_mtx(Unlock Mutex) ミューテックスをロック解除します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_unl_mtx ( ID mtxid ) ; ■ パラメータ ● 入力 mtxid ミューテックス ID (Mutex ID) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mtxid が 0 以下または最大ミューテックス数より大きい E_NOEXS -42 オブジェクトが存在していない ·mtxid のミューテックスが存在しない E_ILUSE -28 不正使用 · 自タスクがロックしたミューテックスではない E_CTX -25 コンテキストエラー · タスク独立部で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクより優先度の高いタスクのロック待ち状態を解 除した場合 , 待ち状態が解除されたタスクにディスパッチします。 対象ミューテックスをロック解除した結果 , 自タスクの優先度が引き下げられる場合 , それより高い優先度のタスクにディスパッチする場合があります。 ■ 解説 mtxid のミューテックスのロックを解除します。ロック待ちしているタスクがある場 合 , 待ち行列の先頭タスクの待ちを解除し , そのタスクをロック獲得状態にします。 January 31, 2014, CM81-00210-2a 103 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t So ft Manu al ■ 補足事項 ロック解除したミューテックスが TA_INHERIT または TA_CEILING 属性の場合 , タス クの現在優先度を引き下げます。ロック解除により自タスクがロックしているミュー テックスがすべてなくなった場合 , 自タスクの現在優先度をベース優先度まで引き下 げます。一方 , 自タスクがロック中のミューテックスが残っている場合 , 自タスクの現 在優先度は , 以下のうちの最も高い優先度になります。 (A) そのミューテックスでロック待ちしているほかのタスクの現在優先度のうちの 最も高い優先度 (B) 自タスクのベース優先度 ミューテックスをロックした状態でタスクを終了した ( 休止状態または未登録状態に なった ) 場合 , ロックしているすべてのミューテックスを自動的にロック解除します。 104 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support 3.6.1.5 Soft Ma nual tk_ref_mtx(Refer Mutex Status) ミューテックスの状態を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ref_mtx ( ID mtxid, T_RMTX *pk_rmtx ) ; typedef struct t_rmtx { VP exinf; ID htsk; ID wtsk; } T_RMTX; ■ パラメータ ● 入力 mtxid ミューテックス ID (Mutex ID) pk_rmtx ミューテックスの状態を返すパケットアドレス (Packet of Refer Mutex Status) ● 出力 ercd エラーコード (Error Code) ● pk_cmtx に返されるデータ exinf 拡張情報 (Extended Information) htsk ロックしているタスクの ID (Hold Task ID) wtsk ロック待ちタスクの ID (Wait Task ID) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mtxid が 0 以下または最大ミューテックス数より大きい E_NOEXS -42 オブジェクトが存在していない ·mtxid のミューテックスが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 January 31, 2014, CM81-00210-2a 105 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t So ft Manu al ■ 解説 mtxid で指定された対象ミューテックスの各種の状態を参照して , 復帰値としてロック 中のタスク (htsk), ロック待ちタスク (wtsk), 拡張情報 (exinf) を返します。 htsk は , このミューテックスをロックしているタスクの ID を設定します。このミュー テックスをロックしているタスクがない場合 , 0 を返します。 wtsk はこのミューテックスで待っているタスクの ID を設定します。複数のタスクが 待っている場合 , 待ち行列の先頭タスクの ID を返します。待ちタスクがない場合 , 0 を 返します。 pk_rmtx が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 106 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support 3.6.2 Soft Ma nual メッセージバッファ機能のシステムコール メッセージバッファ機能のシステムコールを説明します。 ■ メッセージバッファ機能のシステムコール メッセージバッファ機能は , 以下の 5 種類のシステムコールで構成されます。 • tk_cre_mbf(Create Message Buffer) • tk_del_mbf(Delete Message Buffer) • tk_snd_mbf(Send Message to Message Buffer) • tk_rcv_mbf(Receive Message from Message Buffer) • tk_ref_mbf(Refer Message Buffer Status) January 31, 2014, CM81-00210-2a 107 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t 3.6.2.1 So ft Manu al tk_cre_mbf(Create Message Buffer) メッセージバッファを生成します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID mbfid = tk_cre_mbf ( T_CMBF *pk_cmbf ) ; typedef struct t_cmbf { VP exinf; ATR mbfatr; W bufsz; INT maxmsz; VP bufptr; } T_CMBF; ■ パラメータ ● 入力 メッセージバッファ生成情報のパケット先頭アドレス pk_cmbf (Packet of Create Message Buffer) ● pk_cmbf に設定するデータ exinf 拡張情報 (Extended Information) mbfatr メッセージバッファ属性 (Message Buffer Attribute) mbfatr := (TA_TFIFO ∥ TA_TPRI) | [TA_USERBUF] 表 3.6-3 tk_cre_mbf の mbfatr で指定できる定数マクロ 属性 値 意味 TA_TFIFO 0x00000000 メッセージ送信待ちタスクを FIFO で管理 TA_TPRI 0x00000001 メッセージ送信待ちタスクを優先度順で管理 TA_USERBUF 0x00000020 メッセージバッファ領域としてユーザが指定し た領域を使用する bufsz メッセージバッファのサイズ ( バイト数 )(Buffer Size) maxmsz メッセージの最大長 ( バイト数 ) (Maximum Message Size) bufptr 108 ユーザバッファのアドレス (Buffer Pointer) CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support Soft Ma nual ● 出力 mbfid メッセージバッファ ID (MessageBuffer ID) またはエラーコード (Error Code) ■ エラーコード E_NOMEM -33 メモリ不足 · メッセージバッファ領域を確保できない (TA_USERBUF が指定されていない場合 ) E_LIMIT -34 メッセージバッファの数がシステムの上限より大きい E_RSATR -11 予約属性 ·mtxatr に未定義の値が指定された E_PAR -17 パラメータエラー ·bufsz が負 , maxmsz が 0 以下 , bufsz が 4 の倍数でない (TA_USERBUF が指定されている場合 ) ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 メッセージバッファを生成し , メッセージバッファ ID 番号を割り当てます。 exinf は , 対象メッセージバッファに関する情報を入れておくためにユーザが自由に使 用できます。ここで指定した情報を tk_ref_mbf で参照できます。ユーザの情報を入れ るためにもっと大きな領域が必要な場合や , 途中で内容を変更したい場合があれば , ユーザプログラムでそのためのメモリを確保し , そのアドレスを exinf に入れます。な お , OS は exinf の内容を関知しません。 mbfatr はメッセージバッファの属性を指定します。 TA_TFIFO, TA_TPRI では , バッファが一杯の場合にメッセージを送信するタスクが メッセージバッファの待ち行列に並ぶ際の並び方を指定できます。TA_TFIFO の場合 , タスクの待ち行列は FIFO となり , TA_TPRI の場合 , タスクの待ち行列はタスクの優先 度順となります。 なお , メッセージキュー , およびメッセージ受信待ちタスクの待ち行列の順序は FIFO だけです。 TA_USERBUF が指定された場合に bufptr が有効になり , bufptr を先頭とする bufsz バ イトのメモリ領域をメッセージバッファ領域として使用します。この場合 , OS はメッ セージバッファ領域を確保しません。TA_USERBUF が指定されなかった場合 , bufptr は無視され , OS はメッセージバッファ領域を確保します。bufsz に 0 を指定すること で , メッセージバッファを使用しない同期通信になります。メッセージバッファ領域 の先頭 4 バイトはカーネルが使用します。また , mbfatr に TA_USERBUF が指定されて いる場合 , 8 バイトの倍数でない bufsz が指定されると , 8 バイトの倍数に切り上げて bufsz は獲得されます。 January 31, 2014, CM81-00210-2a 109 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t So ft Manu al pk_cmbf, bufptr が不正な場合でも , エラーチェックを行わずに動作は保証されません。 メッセージバッファは , 可変長メッセージの送受信の管理を行うオブジェクトです。 メールボックス (mbx) との相違点は , 送信時と受信時に可変長のメッセージ内容をコ ピーする点です。また , バッファが一杯の場合に , メッセージ送信側も待ち状態に入る 機能があります。 110 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support 3.6.2.2 Soft Ma nual tk_del_mbf(Delete Message Buffer) メッセージバッファを削除します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_del_mbf ( ID mbfid ) ; ■ パラメータ ● 入力 メッセージバッファ ID mbfid (Message Buffer ID) ● 出力 エラーコード (Error Code) ercd ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mbfid が 0 以下または最大メッセージバッファ数より大きい E_NOEXS -42 オブジェクトが存在していない ·mbfid のメッセージバッファが存在しない ■ ディスパッチ要因 mbfid で指定したメッセージバッファを削除したことにより , 本システムコールを呼び 出したタスクより優先度の高いタスクの待ち状態が解除された場合 , 待ち状態が解除 されたタスクにディスパッチします。 ■ 解説 mbfid で指定されたメッセージバッファを削除します。具体的には , 対象メッセージ バッファを未生成状態にして ID 番号およびメッセージを入れるバッファ領域を解放 します。 対象メッセージバッファでメッセージ受信またはメッセージ送信を待っているタスク があった場合 , 本システムコールは正常終了します。ただし , 待ち状態にあったタスク には E_DLT のエラーで復帰します。また , 対象メッセージバッファの中にメッセージ が残っている場合でもエラーとはならず , メッセージバッファの削除が行われて中に あったメッセージは消滅します。 January 31, 2014, CM81-00210-2a 111 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t 3.6.2.3 So ft Manu al tk_snd_mbf(Send Message to Message Buffer) メッセージバッファへ送信します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_snd_mbf ( ID mbfid, VP msg, INT msgsz, TMO tmout ) ; ■ パラメータ ● 入力 mbfid メッセージバッファ ID (Message Buffer ID) msgsz 送信メッセージのサイズ ( バイト数 ) (Message Size) msg 送信メッセージの先頭アドレス (Message) tmout タイムアウト指定 (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロが指定可能 表 3.6-4 tk_snd_mbf の tmout で指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mbfid が 0 以下または最大メッセージバッファ数より大きい E_NOEXS -42 オブジェクトが存在していない ·mbfid のメッセージバッファが存在しない E_PAR -17 パラメータエラー ·msgsz が 0 以下または maxmsz より大きい ·tmout が -2 以下 E_DLT -51 待ちオブジェクトが削除された · 待ちの間に対象メッセージバッファ削除 E_RLWAI -49 待ち状態強制解除 · 待ちの間に tk_rel_wai を受け付ける E_TMOUT -50 ポーリング失敗またはタイムアウト ·tmout の時間経過により待ち状態が解除された 112 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support Soft Ma nual ·tmout が TMO_POL で , メッセージバッファに空きがない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 (tmout が TMO_POL 以外 ) ■ ディスパッチ要因 本システムコールを呼び出したタスクより優先度の高いタスクのメッセージ受信待ち 状態を解除した場合 , 待ち状態が解除されたタスクにディスパッチします。または , シ ステムコールを呼び出したタスクがメッセージ送信待ち状態になった場合 , 次の優先 順位のタスクにディスパッチします。 ■ 解説 本システムコールは , mbfid で指定されたメッセージバッファに msg のアドレスに入っ ているメッセージを送信します。 メッセージのサイズは msgsz で指定します。すなわち , msg 以下の msbsz ( バイト ) を mbfid で指定されたメッセージバッファのメッセージキューにコピーします。メッセー ジキューは , リングバッファによって実現しています。 tmout により , 待ち時間の最大値 ( タイムアウト値 ) を指定できます。TMO_FEVR は , タイムアウトまでの時間が無限大であることを示します。この場合は , メッセージバッ ファに空きができるまで , または tk_rel_wai が呼び出されるまで待ち状態になります。 TMO_POL を指定される場合 , メッセージバッファに空きがなければ , E_TMOUT のエ ラーで復帰します。 tmout の基準時間 ( 時間の単位 ) はシステム時刻の基準時間 ( = 1 ms) と同じです。 バッファの空き領域が少なく , msg のメッセージをメッセージキューに入れられない 場合 , 本システムコールを呼び出したタスクはメッセージ送信待ち状態となり , バッ ファの空きを待つための待ち行列 ( 送信待ち行列 ) につながれます。待ち行列の順序は tk_cre_mbf 呼出し時の指定により FIFO またはタスク優先度順となります。 msg が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 113 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t 3.6.2.4 So ft Manu al tk_rcv_mbf(Receive Message from Message Buffer) メッセージバッファから受信します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース INT msgsz = tk_rcv_mbf ( ID mbfid, VP msg, TMO tmout ) ; ■ パラメータ ● 入力 mbfid メッセージバッファ ID (Message Buffer ID) msg 受信メッセージを入れるアドレス (Message) tmout タイムアウト指定 (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロが指定可能 表 3.6-5 tk_rcv_mbf の tmout で指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 msgsz 受信したメッセージのサイズ ( バイト数 ) (Message size) またはエラーコード (Error Code) ■ エラーコード E_ID -18 不正 ID 番号 ·mbfid が 0 以下または最大メッセージバッファ数より大きい E_NOEXS -42 オブジェクトが存在していない ·mbfid のメッセージバッファが存在しない E_PAR -17 パラメータエラー ·tmout が -2 以下 E_DLT -51 待ちオブジェクトが削除された · 待ちの間に対象メッセージバッファを削除 E_RLWAI -49 待ち状態強制解除 · 待ちの間に tk_rel_wai を受け付ける E_TMOUT -50 ポーリング失敗またはタイムアウト ·tmout の時間経過により待ち状態が解除された 114 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support Soft Ma nual ·tmout が TMO_POL で , メッセージバッファに メッセージがない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクがメッセージ受信待ち状態になった場合 , 次の 優先順位のタスクにディスパッチします。または , システムコールを呼び出したタスク より優先度の高いタスクのメッセージ送信待ち状態を解除した場合 , 待ち状態が解除 されたタスクにディスパッチします。 ■ 解説 本システムコールは , mbfid で指定されたメッセージバッファからメッセージを受信し て msg で指定された領域に入れます。すなわち , mbfid で指定されたメッセージバッ ファのメッセージキューの先頭メッセージの内容を msg 以下の msbsz ( バイト ) にコ ピーします。 tmout により , 待ち時間の最大値 ( タイムアウト値 ) を指定できます。TMO_FEVR は , タイムアウトまでの時間が無限大であることを示します。この場合は , メッセージの到 着または tk_rel_wai が呼び出されるまで待ち状態になります。TMO_POL を指定される 場合 , メッセージが到着していなければ , E_TMOUT のエラーで復帰します。 mbfid で指定されたメッセージバッファにまだメッセージが送信されていない場合 ( メッセージキューが空の場合 ) , 本システムコールを呼び出したタスクは待ち状態と なり , メッセージの到着を待つ待ち行列 ( 受信待ち行列 ) につながれます。受信待ちタ スクの待ち行列は FIFO だけです。 msg が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 115 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t 3.6.2.5 So ft Manu al tk_ref_mbf(Refer Message Buffer Status) メッセージバッファの状態を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ref_mbf ( ID mbfid, T_RMBF *pk_rmbf ) ; typedef struct t_rmbf { VP exinf; ID wtsk; ID stsk; INT msgsz; W frbufsz; INT maxmsz; } T_RMBF; ■ パラメータ ● 入力 mbfid メッセージバッファ ID (Message Buffer ID) pk_rmbf メッセージバッファの状態を返すパケットアドレス (Packet of Refer Message Buffer) ● 出力 ercd エラーコード (Error Code) ● pk_rmbf に返されるデータ exinf 拡張情報 (Extended Information) wtsk 受信待ちタスクの有無 (Wait Task) stsk 送信待ちタスクの有無 (Send Task) msgsz メッセージサイズ (Message Size) frbufsz 空きバッファのサイズ ( バイト数 ) (Free Buffer Size) maxmsz メッセージの最大長 ( バイト数 ) (Maximum Message Size) 116 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support Soft Ma nual ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mbfid が 0 以下または最大メッセージバッファ数より大きい E_NOEXS -42 オブジェクトが存在していない ·mbfid のメッセージバッファが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 mbfid で指定された対象メッセージバッファの各種状態を参照して , 復帰値として拡張 情報 (exinf), 受信待ちタスクの有無 (wtsk), 送信待ちタスクの有無 (stsk), 次に受信する メッセージのサイズ (msgsz), 空きバッファのサイズ (frbufsz), メッセージの最大長 (maxmsz) を返します。 wtsk は , このメッセージバッファで受信待ちしているタスクの ID を設定します。また , stsk は送信待ちしているタスクの ID を設定します。このメッセージバッファで複数の タスクが待っている場合 , 待ち行列の先頭タスクの ID を返します。待ちタスクがない 場合 , 0 を返します。 msgsz には , メッセージキューの先頭メッセージ ( 次に受信するメッセージ ) のサイズ が返します。メッセージキューにメッセージがない場合 , 0 を返します。 なお , サイズが 0 のメッセージは送れません。どんな場合でも , msgsz = 0 と wtsk = 0 の少なくとも一方は成り立ちます。 frbufsz はメッセージキューを構成するリングバッファの空き領域のサイズを示すもの です。この値により , 送信可能なメッセージ量を確認できます。 maxmsz は tk_cre_mbf で指定されたメッセージの最大長を返します。 pk_rmbf が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 117 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t 3.6.3 So ft Manu al ランデブポート機能のシステムコール ランデブポート機能のシステムコールを説明します。 ■ ランデブポート機能のシステムコール ランデブポート機能は , 以下の 7 種類のシステムコールで構成されます。 • tk_cre_por(Create Port for Rendezvous) • tk_del_por(Delete Port for Rendezvous) • tk_cal_por(Call Port for Rendezvous) • tk_acp_por(Accept Port for Rendezvous) • tk_fwd_por(Forward Rendezvous to Another Port) • tk_rpl_rdv(Reply Rendezvous) • tk_ref_por(Refer Port Status) 118 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support 3.6.3.1 Soft Ma nual tk_cre_por(Create Port for Rendezvous) ランデブポートを生成します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID porid = tk_cre_por ( T_CPOR *pk_cpor ) ; typedef struct t_cpor { VP exinf; ATR poratr; INT maxcmsz; INT maxrmsz; } T_CPOR; ■ パラメータ ● 入力 ランデブポートの生成情報のパケット先頭アドレス(Packet of Create Port) pk_cpor ● pk_cpor に設定するデータ exinf 拡張情報 (Extended Information) poratr ランデブポート属性 (Port Attribute) poratr := (TA_TFIFO ∥ TA_TPRI) 表 3.6-6 tk_cre_por の poratr で指定できる定数マクロ 属性 値 意味 TA_TFIFO 0x00000000 呼出し待ちタスクを FIFO で管理 TA_TPRI 0x00000001 呼出し待ちタスクを優先度順で管理 maxcmsz 呼出し時のメッセージの最大長 ( バイト数 ) (Maximum Call Message Size) maxrmsz 返答時のメッセージの最大長 ( バイト数 ) (Maximum Reply Message Size) ● 出力 porid ランデブポート ID (Port ID) またはエラーコード (Error Code) January 31, 2014, CM81-00210-2a 119 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t So ft Manu al ■ エラーコード E_LIMIT -34 ランデブポートの数がシステムの上限より大きい E_RSATR -11 予約属性 ·poratr に未定義の値が指定された E_PAR -17 パラメータエラー ·maxcmsz が負 ·maxrmsz が負 E_CTX -25 コンテキストエラー · タスク独立部で実行 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 ランデブポートを生成し , ランデブポート ID 番号を割り当てます。ランデブポートは , ランデブを実現するための基本となるオブジェクトです。 exinf は , 対象ランデブポートに関する情報を入れておくためにユーザが自由に使用で きます。ここで指定した情報を tk_ref_por で参照できます。ユーザの情報を入れるため にもっと大きな領域が必要な場合や , 途中で内容を変更したい場合があれば , ユーザプ ログラムでそのためのメモリを確保し , そのアドレスを exinf に入れます。なお , OS で は exinf の内容を関知しません。 poratr はランデブポートの属性を指定します。TA_TFIFO, TA_TPRI では , ランデブ呼出 し待ちのタスクの待ち行列の並び順を指定します。ランデブ受付け待ちのタスクの待 ち行列は FIFO だけです。 maxcmsz は呼出し時のメッセージの最大長をバイト数で指定します。また , maxrmsz は , 返答時のメッセージの最大長をバイト数で指定します。 pk_cpor が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 120 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support 3.6.3.2 Soft Ma nual tk_del_por(Delete Port for Rendezvous) ランデブポートを削除します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_del_por ( ID porid ) ; ■ パラメータ ● 入力 porid ランデブポート ID (Port ID) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·porid が 0 以下または最大ランデブポート数より大きい E_NOEXS -42 オブジェクトが存在していない ·porid のランデブポートが存在しない E_CTX -25 コンテキストエラー · タスク独立部で実行 ■ ディスパッチ要因 porid で指定したランデブーポートを削除したことにより , 本システムコールを呼び出 したタスクより優先度の高いタスクの待ち状態が解除された場合,待ち状態が解除され たタスクにディスパッチします。 ■ 解説 porid で指定されたランデブポートを削除します。具体的には , 対象ランデブポートを 未生成状態にして ID 番号を解放します。 対象ランデブポートでランデブ受付け (tk_acp_por) や呼出し (tk_cal_por) を待っている タスクがあった場合 , 本システムコールは正常終了しますが , 待ち状態にあったタスク には E_DLT のエラーで復帰します。 tk_del_por によりランデブポートが削除されても , 既にランデブ成立済みのタスクに影 響しません。ランデブ受付け側タスク ( 待ち状態ではない ) には何も通知されず , ラン デブ呼出し側タスク ( ランデブ終了待ち状態 ) の状態も変化しません。 ランデブ受付け側タスクが tk_rpl_rdv を呼び出すときに , ランデブ成立に使ったランデ ブポートが既に削除されていても tk_rpl_rdv を正常に実行します。 January 31, 2014, CM81-00210-2a 121 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t 3.6.3.3 So ft Manu al tk_cal_por(Call Port for Rendezvous) ランデブポートに対するランデブを呼び出します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース INT rmsgsz = tk_cal_por ( ID porid, UINT calptn, VP msg, INT cmsgsz, TMO tmout ) ; ■ パラメータ ● 入力 porid ランデブポート ID (Port ID) calptn 呼出し側選択条件を表すビットパターン (Call Bit Pattern) msg メッセージを入れるアドレス (Message) cmsgsz 呼出しメッセージのサイズ ( バイト数 ) (Call Message Size) tmout タイムアウト指定 (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロが指定可能 表 3.6-7 tk_cal_por の tmout で指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 rmsgsz 返答メッセージのサイズ ( バイト数 )(Reply Message Size) またはエラー コード (Error Code) ■ エラーコード E_ID -18 不正 ID 番号 ·porid が 0 以下または最大ランデブポート数より大きい E_NOEXS -42 オブジェクトが存在していない ·porid のランデブポートが存在しない E_PAR -17 パラメータエラー ·cmsgsz が負 , または maxcmsz より大きい ·calptn が 0 ·tmout が -2 以下 E_DLT -51 待ちオブジェクトが削除された · 待ちの間に対象ランデブポートを削除 122 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support E_RLWAI -49 Soft Ma nual 待ち状態強制解除 · 待ちの間に tk_rel_wai を受け付ける E_TMOUT -50 ポーリング失敗またはタイムアウト ·tmout の時間経過により待ち状態が解除された ·tmout が TMO_POL で , ランデブが成立しない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクがランデブ呼出し待ち状態になった場合 , 次の 優先順位のタスクにディスパッチします。または , システムコールを呼び出したタスク より優先度の高いタスクのランデブ受付け待ち状態を解除した場合 , 待ち状態が解除 されたタスクにディスパッチします。 ■ 解説 porid で指定されたランデブポートに対するランデブを呼び出します。 呼出しメッセージのサイズを cmsgsz で指定します。本システムコールで指定した msg 領域 ( 呼出し側タスクの msg 領域 ) の cmsgsz ( バイト ) のデータを , tk_acp_por で指定 された msg 領域 ( 受付け側タスクの msg 領域 ) にコピーします。 tmout により , 待ち時間の最大値 ( タイムアウト値 ) を指定できます。TMO_FEVR は , タイムアウトまでの時間が無限大であることを示します。この場合は , ランデブが成立 するまで , または tk_rel_wai が呼び出されるまで待ち状態になります。TMO_POL を指 定される場合, 対象ランデブポートにランデブ受付け待ちタスクがない,または ランデ ブ成立条件が満たされなければ , E_TMOUT のエラーで復帰します。 tmout の基準時間 ( 時間の単位 ) はシステム時刻の基準時間 ( = 1 ms) と同じです。 本システムコール動作は以下のようになります。 porid で指定されたランデブポートでランデブ受付け待ち状態のタスクがあり , そのタ スクと本システムコール呼出しタスクとの間でランデブ成立条件が満たされた場合 , ラ ンデブ成立となります。この場合 , ランデブ受付け待ちだったタスクは実行可能状態と なり , 本システムコール呼出しタスクはランデブ終了待ちの状態になります。ランデブ 終了待ちの状態になったタスクは , ランデブの相手のタスク ( ランデブ受付けタスク ) が tk_rpl_rdv システムコールを実行することにより待ち状態を解除します。この時点で 本システムコールが終了します。 porid で指定されたランデブポートに受付け待ちタスクがなかった場合や , 受付け待ち タスクがあってもランデブ成立条件が満たされなかった場合 , 本システムコール呼出 しタスクはこのランデブ呼出し待ち行列に並び , ランデブ呼出し待ちの状態となりま す。ランデブ呼出し待ち行列の順序は , tk_cre_por の指定により FIFO またはタスク優 先度順となります。 ランデブ成立条件は , 受付け側タスクの acpptn と呼出し側タスクの calptn との論理積 が 0 かどうかによって判定します。論理積が 0 以外の場合 , ランデブ成立となります。 ランデブ成立時には , 呼出し側タスクから受付け側タスクにメッセージ ( 呼出しメッセー ジ ) を送れます。 逆に , ランデブ終了時には , 受付け側タスクから呼出し側タスクにメッセージ ( 返答 メッセージ ) を送れます。tk_rpl_rdv で指定した応答メッセージ ( 呼出し側タスクの応 January 31, 2014, CM81-00210-2a 123 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t So ft Manu al 答メッセージ ) の内容を , 本システムコールで指定した msg 領域 ( 呼出し側タスクの msg 領域 ) にコピーします。また , 返答メッセージのサイズ rmsgsz は , 本システムコー ルの復帰値となります。結局 , 本システムコールの msg パラメータで指定されたメッ セージ領域を tk_rpl_rdv 実行のときに送られてくるメッセージによって破壊します。 なお , ランデブが回送された場合は , 本システムコールで指定された msg のアドレスか ら最大で maxrmsz の領域をバッファとして使用するため , その内容を破壊する可能性 があります。したがって , 本システムコールで要求したランデブが回送される可能性が ある場合 , 期待する返答メッセージのサイズにかかわらず , msg 以下に少なくとも maxrmsz のサイズの領域を確保してください ( 詳細は「3.6.3.5 tk_fwd_por(Forward Rendezvous to Another Port)」を参照 ) 。 msg が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 124 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support 3.6.3.4 Soft Ma nual tk_acp_por(Accept Port for Rendezvous) ランデブポートに対するランデブを受け付けます。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース INT cmsgsz = tk_acp_por ( ID porid, UINT acpptn, RNO *p_rdvno, VP msg, TMO tmout ) ; ■ パラメータ ● 入力 porid ランデブポート ID (Port ID) acpptn 受付け側選択条件を表すビットパターン (Accept Bit Pattern) p_rdvno ランデブ番号を入れるアドレス (Rendezvous Number) msg メッセージを入れるアドレス (Message) tmout タイムアウト指定 (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロが指定可能 表 3.6-8 tk_acp_por の tmout で指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 cmsgsz 呼出しメッセージのサイズ ( バイト数 ) またはエラーコード (Call Message Size or Error Code) ■ エラーコード E_ID -18 不正 ID 番号 ·porid が 0 以下または最大ランデブポート数より大きい E_NOEXS -42 オブジェクトが存在していない ·porid のランデブポートが存在しない E_PAR -17 パラメータエラー ·acpptn が 0 ·tmout が -2 以下 E_DLT -51 待ちオブジェクトが削除された · 待ちの間に対象ランデブポートを削除 January 31, 2014, CM81-00210-2a 125 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t E_RLWAI -49 So ft Manu al 待ち状態強制解除 · 待ちの間に tk_rel_wai を受け付ける E_TMOUT -50 ポーリング失敗またはタイムアウト ·tmout の時間経過により待ち状態が解除された ·tmout が TMO_POL で , ランデブが成立しない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクがランデブ受付け待ち状態になった場合 , 次の 優先順位のタスクにディスパッチします。 ■ 解説 ランデブポートに対するランデブを受け付けます。 tmout により , 待ち時間の最大値 ( タイムアウト値 ) を指定できます。TMO_FEVR は , タイムアウトまでの時間が無限大であることを示します。この場合は , ランデブが成立 するまで , または tk_rel_wai が呼び出されるまで待ち状態になります。TMO_POL を指 定される場合 , 対象ランデブポートにランデブ呼出し待ちタスクがない , ランデブ成立 条件が満たされなければ , E_TMOUT のエラーで復帰します。 tmout の基準時間 ( 時間の単位 ) はシステム時刻の基準時間 ( = 1 ms) と同じです。 本システムコールの動作は以下のようになります。 porid で指定されたランデブ呼出し待ち行列に入っているタスクと , このタスクとの間 でランデブ成立条件が満たされた場合はランデブ成立となります。この場合 , 呼出し側 待ち行列にあったタスクは行列から外れ , ランデブ呼出し待ち ( ランデブ成立待ち ) の 状態からランデブ終了待ちの状態に変わります。本システムコールの呼出しタスクは 実行を継続します。 porid で指定されたランデブ呼出し待ち行列にタスクがなかった場合や , タスクがあっ てもランデブ成立条件が満たされなかった場合 , 本システムコールの呼出しタスクは そのランデブポートに対するランデブ受付け待ち状態になります。 この場合 , 既に別のタスクがランデブ受付け待ち状態であったとしても , エラーとはな らず , 本システムコールを呼び出したタスクはランデブ受付け待ち行列につながれま す。また , 1 つのランデブポートを使って複数のタスクが同時にランデブを行えます。 そのため , porid で指定されたランデブポートで別のタスクがランデブを行っている間 に ( 前に成立したランデブに関する tk_rpl_rdv が実行される前に ) 次のランデブを行っ ても正常終了します。 ランデブ成立条件は , 受付け側タスクの acpptn と呼出し側タスクの calptn との論理積 が 0 かどうかによって判定します。論理積が 0 以外の場合 , ランデブ成立となります。 先頭のタスクが条件を満たさなければ , 待ち行列の次のタスクについて順にチェック します。calptn と acpptn に 0 以外の同じ値を指定すると条件がない ( 無条件 ) のと同じ になります。ランデブ成立までの処理に関しては , ランデブ呼出し側とランデブ受付け 側で完全に対称です。 126 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support Soft Ma nual ランデブ成立時には , 呼出し側タスクから受付け側タスクに呼出しメッセージを送れ ます。呼出し側タスクが指定した呼出しメッセージの内容を , 受付け側タスクが本シス テムコールで指定した msg 以下の領域にコピーします。また , 呼出しメッセージのサ イズ cmsgsz は , 本システムコールの復帰値となります。 ランデブ受付け側のタスクが同時に複数のランデブを行うこともできます。具体的に は , 本システムコールによりあるランデブを受け付けたタスクが , tk_rpl_rdv を実行す る前にもう一度本システムコールを実行しても構いません。また , この場合の本システ ムコールは , 前と異なるランデブポートを対象としたものであっても , 前と同じランデ ブポートを対象としたものであっても構いません。特殊な例ですが , ランデブ中のタス クが同じランデブポートにもう一度本システムコールを実行してランデブが成立した 場合 , 同一のタスクが同一のランデブポートに複数の ( 多重の ) ランデブを行っている 状態になります。もちろん , この場合にランデブの相手 ( 呼出し側タスク ) は異なって います。 本システムコールの復帰値として返すランデブ番号 , p_rdvno は , 同時に成立している 複数のランデブを区別するための情報であり , ランデブ終了時に tk_rpl_rdv のパラメー タとして使用します。また , ランデブ回送時には tk_fwd_por のパラメータとして使用 します。ランデブ番号は , 下位 16 ビットがランデブを受け付けたタスクのタスク ID, 上位 16 ビットはランデブ受付順に採番される番号となります。 p_rdvno, msg が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 127 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t 3.6.3.5 So ft Manu al tk_fwd_por(Forward Rendezvous to Another Port) ランデブポートに対するランデブを回送します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_fwd_por ( ID porid, UINT calptn, RNO rdvno, VP msg, INT cmsgsz ) ; ■ パラメータ ● 入力 porid 回送先のランデブポート ID (Port ID) calptn 呼出し側選択条件を表すビットパターン (Call Bit Pattern) rdvno 回送前のランデブ番号 (Rendezvous Number) msg 呼出しメッセージを入れるアドレス (Message) cmsgsz 呼出しメッセージのサイズ ( バイト数 ) (Call Message Size) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·porid が 0 以下または最大ランデブポート数より大きい E_NOEXS -42 オブジェクトが存在していない ·porid のランデブポートが存在しない E_PAR -17 パラメータエラー ·cmsgsz が負 ·cmsgsz が回送後の maxcmsz より大きい ·cmsgsz が回送前の maxrmsz より大きい ·calptn が 0 E_OBJ -41 オブジェクトの状態が不正 ·rdvno に含まれるタスク ID が負または最大タスク数より大き い · 呼出し側タスクの状態がランデブ終了待ち (TTW_RDV) 以外 ·rdvno が tk_acp_por の復帰値と一致しない 128 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support Soft Ma nual · 回送後の maxrmsz が回送前の maxrmsz より大きい E_CTX -25 コンテキストエラー · タスク独立部で実行 ■ ディスパッチ要因 システムコールを呼び出したタスクより優先度の高いタスクのランデブ受付け待ち状 態を解除した場合 , 待ち状態が解除されたタスクにディスパッチします。 ■ 解説 ランデブ成立後 , 別のランデブポートに回送します。 本システムコールは , ランデブ成立後 , tk_acp_por を呼び出したタスクから呼び出して ください。 例えば , 図 3.6-1 のように , 呼出し側タスク ( タスク X とする ) と受付け側タスク ( タ スク Y とする ) でランデブポート ( ランデブポート A) でランデブ成立した状態で , 本 システムコールを呼び出します。その結果 , タスク X とタスク Y との間のランデブ状 態が解除され , その後 , 別のランデブポート ( ランデブポート B) にタスク X がランデ ブ呼出しを行ったのと同じ状況になります。そしてタスク Y とは別のタスク Z で tk_acp_por を呼び出し , 再度ランデブを成立させます。最終的にタスク Z から tk_rpl_rdv を呼び出し , タスク X の終了待ちを解除します。 図 3.6-1 ランデブの回送 タスク X (呼出し側タスク) タスク Y (受付け側タスク) tk cal por タスク Z tk acp por ランデブポートA (ランデブ成立) (ランデブ解除) tk fwd por tk acp por ランデブポートB (ランデブ成立) tk rpl rdv 本システムコールの具体的な動作は以下のようになります。 1. rdvno で指定されたランデブを解除します。 2. タスク X を porid のランデブポートに対してランデブ呼出し待ちの状態にします。 この場合 , ランデブ成立のための呼出し側選択条件を表すビットパターン calptn は , タスク X が tk_cal_por で指定したものではなく , タスク Y が本システムコールで指 定したものを使用します。タスク X から見ると , ランデブ終了待ちの状態からラン デブ呼出し待ちの状態に戻ります。 3. その後 , porid のランデブポートに対するランデブが受け付けられると , それを受け 付けたタスクとタスク X との間でランデブ成立となります。もちろん , porid のラン デブポートに既にランデブ受付け待ちタスクが存在し , ランデブ成立条件が満たさ January 31, 2014, CM81-00210-2a 129 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t So ft Manu al れていると , 本システムコールの実行により即座にランデブ成立となることもあり ます。ここで , ランデブ成立時に受付け側に送られるメッセージは , タスク X が tk_cal_por で指定したものではなく , タスク Y が本システムコールで指定したもの を使用します (calptn と同様 )。 4. 新しいランデブが終了したときに tk_rpl_rdv で返すメッセージは , タスク Y が本シ ステムコールで指定したmsg の領域ではなく, タスクX がtk_cal_por で指定したmsg の領域にコピーします。 基本的には , 「tk_cal_por(porid=portA, calptn=ptnA, msg=mesA) の後で tk_fwd_por (porid=portB, calptn=ptnB, msg=mesB) が実行された状態」と , 「tk_cal_por(porid=portB, calptn=ptnB, msg=mesB) が実行された状態」とは全く同じ状態になります。ランデブ回 送の履歴を覚えておく必要はありません。 本システムコールによってランデブ呼出し待ち状態に戻ったタスクに tk_ref_tsk を実行 した場合 , tskwait は TTW_CAL となります。また , wid も回送先のランデブポートの ID 番号になります。 本システムコールの実行は即座に終了します。本システムコールで待ち状態になりま せん。また , 本システムコールの実行が終わった後の本システムコール呼出しタスク は , 回送前のランデブが成立したランデブポート , 回送後のランデブポート (porid のラ ンデブポート ), それらのうえでランデブを行ったタスクのいずれとも無関係になりま す。 本システムコールで指定された送信メッセージは , 本システムコール実行時にほかの 領域 ( 例えば tk_cal_por で指定したメッセージ領域 ) にコピーします。したがって , 回 送されたランデブが成立する前に本システムコールの msg で指定されたメッセージ領 域の内容が変更されても , 回送されたランデブには影響しません。 本システムコールでランデブを回送する場合, 回送後のランデブポート(porid のランデ ブポート ) の maxrmsz を回送前のランデブの成立したランデブポートの maxrmsz と等 しいか , それよりも小さくしてください。回送後のランデブポートの maxrmsz が回送 前のランデブポートの maxrmsz よりも大きかった場合 , 回送先のランデブポートが不 適当なのでE_OBJ のエラーで復帰します。ランデブ呼出し側は, 回送前のランデブポー トの maxrmsz に合わせて返答メッセージ受信領域を用意しているため , ランデブの回 送によって返答メッセージの最大サイズが大きくなると , 呼出し側に予期せぬ大きさ の返答メッセージを返す可能性があり問題を起こします。maxrmsz の大きなランデブ ポートにランデブを回送できないのは , この理由によります。また , 本システムコール で送信するメッセージのサイズ cmsgsz は , 回送前のランデブの成立したランデブポー トの maxrmsz と等しいか , それよりも小さくしてください。これは , 本システムコール の実装方法として , tk_cal_por で指定されたメッセージ領域を送信メッセージのバッ ファとして使うことを想定しているためです。 ディスパッチ禁止中あるいは割込み禁止中のタスクから本システムコール , tk_rpl_rdv を呼び出した場合も , これらのシステムコールは正常に動作します。この機能は , 本シ ステムコールや tk_rpl_rdv と不可分に何らかの処理を行う場合に使用できます。 本システムコールにより , ランデブ終了待ち状態であったタスク X がランデブ呼出し 待ちの状態に戻った場合 , 次にランデブが成立するまでのタイムアウトは常に永久待 ち (TMO_FEVR) として扱われます。 回送先のランデブポートは , 前のランデブに使用していたランデブポート (rdvno のラ ンデブが成立したランデブポート ) と同じランデブポートであっても構いません。こ 130 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support Soft Ma nual の場合は , 本システムコールによって , いったん受け付けたランデブの受付け処理をと りやめます。ただし , この場合でも , 呼出しメッセージや calptn は , 呼出し側タスクが tk_cal_por で指定したものではなく , 受付け側タスクが本システムコールで指定したも のに変更します。また , いったん回送されてきたランデブをさらに回送することもでき ます。 msg が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 131 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t 3.6.3.6 So ft Manu al tk_rpl_rdv(Reply Rendezvous) ランデブポートに対するランデブに返答します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_rpl_rdv ( RNO rdvno, VP msg, INT rmsgsz ) ; ■ パラメータ ● 入力 rdvno ランデブ番号 (Rendezvous Number) msg メッセージを入れるアドレス (Message) rmsgsz 返答メッセージのサイズ ( バイト数 ) (Reply Message Size) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_PAR -17 パラメータエラー ·rmsgsz が負 , または maxrmsz より大きい E_OBJ -41 オブジェクトの状態が不正 ·rdvno に含まれるタスク ID が 0 以下または最大タスク数 より大きい · 呼出し側タスクが待ち状態でない · 呼出し側タスクの待ち状態がランデブ終了待ち (TTW_RDV) でない ·rdvno が tk_acp_por の復帰値と一致しない E_CTX -25 コンテキストエラー · タスク独立部から実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクより優先度の高いタスクのランデブ終了待ち状 態を解除した場合 , 待ち状態が解除されたタスクにディスパッチします。 132 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support Soft Ma nual ■ 解説 ランデブの相手のタスク ( 呼出し側タスク ) に返答してランデブを終了します。 本システムコールは , ランデブ中の状態 (tk_acp_por を実行した後の状態 ) のタスクか ら呼び出してください。 本システムコールでランデブを終了させる場合 , 受付け側タスク Y から呼出し側タス ク X に返答メッセージを送れます。受付け側タスクが指定した返答メッセージの内容 を呼出し側タスクが tk_cal_por で指定した msg 以下の領域にコピーします。また , 返答 メッセージのサイズ rmsgsz は tk_cal_por の復帰値となります。 msg が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 133 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Su pp or t 3.6.3.7 So ft Manu al tk_ref_por(Refer Port Status) ランデブポートの状態を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ref_por ( ID porid, T_RPOR *pk_rpor ) ; typedef struct t_rpor { VP exinf; ID wtsk; ID atsk; INT maxcmsz; INT maxrmsz; } T_RPOR; ■ パラメータ ● 入力 porid ランデブポート ID (Port ID) pk_rpor ランデブポート状態を返すパケットの先頭アドレス (Packet of Refer Port) ● 出力 ercd エラーコード (Error Code) ● pk_rpor に返されるデータ exinf 拡張情報 (Extended Information) wtsk 呼出し待ちタスクの有無 (Wait Task) atsk 受付け待ちタスクの有無 (Accept Task) 呼出し時のメッセージの最大長 ( バイト数 ) maxcmsz (Maximum Call Message Size) 返答時のメッセージの最大長 ( バイト数 ) maxrmsz (Maximum Receive Message Size) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·porid が 0 以下または最大ランデブポート数より大きい E_NOEXS -42 オブジェクトが存在していない ·porid のランデブポートが存在しない 134 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.6 拡張同期・通信機能のシステムコール Support Soft Ma nual ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 porid で指定された対象ランデブポートの各種の状態を参照し , 復帰値として受付け待 ちタスクの有無 (atsk), 呼出し待ちタスクの有無 (wtsk), メッセージの最大長 (maxcmsz, maxrmsz), 拡張情報 (exinf) を返します。 wtsk は , このランデブポートでランデブ呼出し待ちになっているタスクの ID を設定し ます。ランデブ呼出し待ちタスクがない場合 , 0 が返ります。一方 , atsk は , このラン デブポートでランデブ受付け待ちになっているタスクの ID を設定します。ランデブ受 付け待ちタスクがない場合 , 0 が返ります。 このランデブポートで複数のタスクが呼出し待ち状態または受付け待ち状態になって いる場合 , それぞれ呼出し待ち行列または受付け待ち行列の先頭タスクの ID を返しま す。 pk_rpor が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 ■ 補足事項 本システムコールでは , 現在ランデブ中のタスクに関する情報を確認できません。 January 31, 2014, CM81-00210-2a 135 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Su pp or t 3.7 So ft Manu al メモリプール管理機能のシステムコール メモリプール管理機能のシステムコールを説明します。 ■ メモリプール管理機能のシステムコール メモリプール機能は , 以下の 2 種類の機能のシステムコールで構成されます。 • 固定長メモリプール機能のシステムコール • 可変長メモリプール機能のシステムコール 136 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Support 3.7.1 Soft Ma nual 固定長メモリプール機能のシステムコール 固定長メモリプール機能のシステムコールを説明します。 ■ 固定長メモリプール機能のシステムコール 固定長メモリプール機能は , 以下の 5 種類のシステムコールで構成されます。 • tk_cre_mpf(Create Fixed-size Memory Pool) • tk_del_mpf(Delete Fixed-size Memory Pool) • tk_get_mpf(Get Fixed-size Memory Block) • tk_rel_mpf(Release Fixed-size Memory Block) • tk_ref_mpf(Refer Fixed-size Memory Pool Status) January 31, 2014, CM81-00210-2a 137 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Su pp or t 3.7.1.1 So ft Manu al tk_cre_mpf(Create Fixed-size Memory Pool) 固定長メモリプールを生成します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ID mpfid = tk_cre_mpf ( T_CMPF *pk_cmpf ) ; typedef struct t_cmpf { VP exinf; ATR mpfatr; W mpfcnt; W blfsz; VP bufptr; } T_CMPF; ■ パラメータ ● 入力 固定長メモリプール生成情報 pk_cmpf (Packet of Create Memory Pool) ● pk_cmpf に設定するデータ exinf 拡張情報 (Extended Information) mpfatr 固定長メモリプール属性 (Fixed-size Memory Pool Attribute) mpfatr:= (TA_TFIFO ∥ TA_TPRI) | [TA_USERBUF] 表 3.7-1 tk_cre_mpf の mpfatr で指定できる定数マクロ 属性 値 意味 TA_TFIFO 0x00000000 待ちタスクを FIFO で管理 TA_TPRI 0x00000001 待ちタスクを優先度順で管理 TA_USERBUF 0x00000020 スタック領域としてユーザが 指定した領域を使用する mpfcnt 固定長メモリプール全体のブロック数 (Fixed-size Memory Pool Block Count) blfsz メモリブロックサイズ ( バイト数 ) (Fixed-size Memory Pool Block Size) bufptr 138 ユーザバッファのアドレス (Buffer Pointer) CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Support Soft Ma nual ● 出力 固定長メモリプール ID (Fixed-size Memory Pool ID) mpfid またはエラーコード (Error Code) ■ エラーコード E_NOMEM -33 メモリ不足 · メモリプール用の領域を確保できない (TA_USERBUF が指定されていない場合 ) E_LIMIT -34 固定長メモリプールの数がシステムの上限より大きい E_RSATR -11 予約属性 ·mpfatr に未定義の値が指定された E_PAR -17 パラメータエラー ·mpfcnt, blfsz が 0 以下 ·bufsz が 4 の倍数でない (TA_USERBUF が指定されている場合 ) E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 固定長メモリプールを生成し , 固定長メモリプール ID を割り当てます。具体的には , mpfcnt, blfsz の情報を元にメモリプールとして使用するメモリ領域を確保します。ここ で生成されたメモリプールに tk_get_mpf を呼び出すことにより , blfsz のサイズ ( バイ ト数 ) をもつメモリブロックを獲得できます。 exinf は , 対象メモリプールに関する情報を入れておくためにユーザが自由に使用でき ます。ここで指定した情報を tk_ref_mpf で参照できます。ユーザの情報を入れるため にもっと大きな領域が必要な場合や , 途中で内容を変更したい場合があれば , ユーザプ ログラムでそのためのメモリを確保して , そのアドレスを exinf に入れます。OS では exinf の内容を関知しません。 表 3.7-2 tk_cre_mpf の mpfatr で無視される定数マクロ 属性 値 意味 TA_RNG0 0x00000000 保護レベル 0 で実行 TA_RNG1 0x00000100 保護レベル 1 で実行 TA_RNG2 0x00000200 保護レベル 2 で実行 TA_RNG3 0x00000300 保護レベル 3 で実行 mpfatr は固定長メモリプールの属性を指定します。TA_TFIFO, TA_TPRI では , タスクが メモリブロック獲得のためにメモリプールの待ち行列に並ぶときの並び方を指定でき ます。属性が TA_TFIFO の場合 , タスクの待ち行列は FIFO となり , TA_TPRI の場合 , タスクの待ち行列はタスクの優先度順となります。 January 31, 2014, CM81-00210-2a 139 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Su pp or t So ft Manu al TA_USERBUF が指定された場合 , bufptr が有効になり , bufptr を先頭とする mpfcnt*blfsz バイトのメモリ領域をメモリプール領域として使用します。 この場合 , OSはメモリプー ル領域を確保しません。TA_USERBUF を指定しなかった場合 , bufptr は無視され , OS はメモリプール領域を確保します。この場合 , bufsz は 8 の倍数になるように切り上げ られて領域が確保されます。 pk_cmpf, bufptr が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 ■ 補足事項 固定長メモリプールの場合にブロックサイズを変えるには別のメモリプールを用意し てください。すなわち , 何種類かのメモリブロックサイズが必要となる場合 , サイズご とに複数のメモリプールを設けてください。 140 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Support 3.7.1.2 Soft Ma nual tk_del_mpf(Delete Fixed-size Memory Pool) 固定長メモリプールを削除します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_del_mpf ( ID mpfid ) ; ■ パラメータ ● 入力 mpfid 固定長メモリプール ID (Fixed-size Memory Pool ID) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mpfid が 0 以下または最大固定長メモリプール数より大きい E_NOEXS -42 オブジェクトが存在していない ·mpfid の固定長メモリプールが存在しない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 mpfid で指定した固定長メモリプールを削除したことにより , 本システムコールを呼び 出したタスクより優先度の高いタスクの待ち状態が解除された場合 , 待ち状態が解除 されたタスクにディスパッチします。 ■ 解説 mpfid で指定された固定長メモリプールを削除します。具体的には , 対象メモリプール を未生成状態にして ID 番号およびメモリプール本体の領域を解放します。 このメモリプールからメモリブロックを獲得しているタスクが存在しても , その チェックや通知は行いません。すべてのメモリブロックが返却されていなくても , 本シ ステムコールは正常終了します。 対象メモリプールでメモリブロック獲得を待っているタスクがあった場合 , 本システ ムコールは正常終了しますが , 待ち状態にあったタスクには E_DLT のエラーで復帰し ます。 January 31, 2014, CM81-00210-2a 141 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Su pp or t 3.7.1.3 So ft Manu al tk_get_mpf(Get Fixed-size Memory Block) 固定長メモリブロックを獲得します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_get_mpf ( ID mpfid, VP *p_blf, TMO tmout ) ; ■ パラメータ ● 入力 mpfid 固定長メモリプール ID (Fixed-size Memory Pool ID) tmout タイムアウト指定 (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロが指定可能 表 3.7-3 tk_get_mpf の tmout で指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 ercd エラーコード (Error Code) p_blf メモリブロックの先頭アドレス (Fixed-size Block Start Address) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mpfid が 0 以下または最大固定長メモリプール数より大きい E_NOEXS -42 オブジェクトが存在していない ·mpfid の固定長メモリプールが存在しない E_PAR -17 パラメータエラー ·tmout が -2 以下 E_DLT -51 待ちオブジェクトが削除された · 待ちの間に対象メモリプールを削除 E_RLWAI -49 待ち状態強制解除 · 待ちの間に tk_rel_wai を受け付ける E_TMOUT 142 -50 ポーリング失敗またはタイムアウト CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Support Soft Ma nual ·tmout の時間経過により待ち状態が解除された ·tmout が TMO_POL で , メモリブロックが獲得できない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクがメモリプール待ち状態になった場合 , 次の優 先順位のタスクにディスパッチします。 ■ 解説 mpfid で指定された固定長メモリプールからメモリブロックを獲得します。獲得した メモリブロックの先頭アドレスを p_blf に返します。獲得するメモリブロックのサイ ズは , 固定長メモリプール生成時に blfsz で指定された値になります。獲得したメモリ ブロックのゼロクリアは行わず , 内容は不定となります。 tmout により , 待ち時間の最大値 ( タイムアウト値 ) を指定できます。TMO_FEVR は , タイムアウトまでの時間が無限大であることを示します。この場合は , メモリブロック が獲得できるまで , または tk_rel_wai が呼び出されるまで待ち状態になります。 TMO_POL はメモリブロックが獲得できなければ , E_TMOUT のエラーで復帰します。 tmout の基準時間 ( 時間の単位 ) はシステム時刻の基準時間 ( = 1 ms) と同じです。 指定されたメモリプールからメモリブロックが獲得できない場合 , tk_get_mpf 呼出し タスクがそのメモリプールのメモリブロック獲得待ち行列につながれ , メモリブロッ クを獲得できるようになるまで待ちます。 メモリブロック獲得待ちを行う場合の待ち行列の順序は , メモリプールの属性によっ て , FIFO またはタスク優先度順のいずれかとなります。 p_blf が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 143 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Su pp or t 3.7.1.4 So ft Manu al tk_rel_mpf(Release Fixed-size Memory Block) 固定長メモリブロックを返却します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_rel_mpf ( ID mpfid, VP blf ) ; ■ パラメータ ● 入力 mpfid 固定長メモリプール ID (Fixed-size Memory Pool ID) blf メモリブロックの先頭アドレス (Fixed-size Block Start Address) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mpfid が 0 以下または最大固定長メモリプール数より大きい E_NOEXS -42 オブジェクトが存在していない ·mpfid の固定長メモリプールが存在しない E_PAR -17 パラメータエラー ·blf がメモリプール領域の範囲外 , (blf - メモリプール領域 先頭アドレス ) がメモリブロックサイズの倍数でない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクより優先度の高いタスクのメモリプール待ち状 態を解除した場合 , 待ち状態が解除されたタスクにディスパッチします。 144 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Support Soft Ma nual ■ 解説 blf で指定されたメモリブロックを mpfid で指定された固定長メモリプールへ返却しま す。 本システムコールの実行により , mpfid のメモリプールでメモリブロックを待っていた 別のタスクがメモリブロックを獲得し , そのタスクの待ち状態を解除する場合があり ます。 メモリブロックは獲得を行った固定長メモリプールに必ず返却してください。 January 31, 2014, CM81-00210-2a 145 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Su pp or t 3.7.1.5 So ft Manu al tk_ref_mpf(Refer Fixed-size Memory Pool Status) 固定長メモリプールの状態を参照します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_ref_mpf ( ID mpfid, T_RMPF *pk_rmpf ) ; typedef struct t_rmpf { VP exinf; ID wtsk; W frbcnt; } T_RMPF; ■ パラメータ ● 入力 mpfid 固定長メモリプール ID (Fixed-size Memory Pool ID) pk_rmpf メモリプールの状態を返すパケットアドレス (Packet of Refer Fixed-size Memory Pool) ● 出力 ercd エラーコード (Error Code) ● pk_rmpf に返されるデータ exinf 拡張情報 (Extended Information) wtsk 待ちタスクの有無 (Wait Task) frbcnt 空き領域のブロック数 (Free Block Count) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mpfid が 0 以下または最大固定長メモリプール数より大きい E_NOEXS -42 オブジェクトが存在していない ·mpfid の固定長メモリプールが存在しない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 146 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Support Soft Ma nual ■ 解説 mpfid で指定された対象固定長メモリプールの各種状態を参照して復帰値として現在 の空きブロック数 frbcnt, 待ちタスクの有無 (wtsk), 拡張情報 (exinf) を返します。 wtsk は , この固定長メモリプールで待っているタスクの ID を指定します。この固定長メモ リプールで複数のタスクが待っている場合 , 待ち行列の先頭タスクの ID を返します。待ち タスクがない場合 , 0 を返します。どんな場合でも frbcnt = 0 と wtsk = 0 の少なくとも一 方の状態は成り立ちます。 pk_rmpf が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 ■ 補足事項 tk_ref_mpl の frsz は , メモリプールの空き領域の合計サイズがバイト数で返るのに対し て , 本システムコールの frbcnt は空きブロックの数が返ります。 January 31, 2014, CM81-00210-2a 147 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Su pp or t 3.7.2 So ft Manu al 可変長メモリプール機能のシステムコール 可変長メモリプール機能のシステムコールを説明します。 ■ 可変長メモリプール機能のシステムコール 可変長メモリプール機能は , 以下の 5 種類のシステムコールで構成されます。 • tk_cre_mpl(Create Variable-size Memory Pool) • tk_del_mpl(Delete Variable-size Memory Pool) • tk_get_mpl(Get Variable-size Memory Block) • tk_rel_mpl(Release Variable-size Memory Block) • tk_ref_mpl(Refer Variable-size Memory Pool Status) 148 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Support 3.7.2.1 Soft Ma nual tk_cre_mpl(Create Variable-size Memory Pool) 可変長メモリプールを生成します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ID mplid = tk_cre_mpl ( T_CMPL *pk_cmpl ) ; typedef struct t_cmpl { VP exinf; ATR mplatr; W mplsz; VP bufptr; } T_CMPL; ■ パラメータ ● 入力 可変長メモリプール生成情報 pk_cmpl (Packet of Create Memory Pool) ● pk_cmpl に設定するデータ exinf 拡張情報 (Extended Information) mplatr メモリプール属性 (Memory Pool Attribute) mplatr:= (TA_TFIFO ∥ TA_TPRI) | [TA_USERBUF] 表 3.7-4 tk_cre_mpl の mplatr で指定できる定数マクロ 属性 値 意味 TA_TFIFO 0x00000000 待ちタスクを FIFO で管理 TA_TPRI 0x00000001 待ちタスクを優先度順で管理 TA_USERBUF 0x00000020 スタック領域としてユーザが 指定した領域を使用する mplsz メモリプール全体のサイズ ( バイト数 ) (Memory Pool Size) bufptr ユーザバッファのアドレス (Buffer Pointer) ● 出力 mplid 可変長メモリプール ID (Memory Pool ID) またはエラーコード (Error Code) January 31, 2014, CM81-00210-2a 149 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Su pp or t So ft Manu al ■ エラーコード E_NOMEM -33 メモリ不足 · メモリプール用の領域を確保できない (TA_USERBUF が指定されていない場合 ) E_LIMIT -34 可変長メモリプールの数がシステムの上限より大きい E_RSATR -11 予約属性 ·mplatr に未定義の値が指定された E_PAR -17 パラメータエラー ·mplsz が 0 以下 ·mplsz が 8 の倍数でない (TA_USERBUF が指定されている場合 ) ·mplsz が 16 よりも小さい (TA_USERBUF が指定されている場合 ) E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 可変長メモリプールを生成し , 可変長メモリプール ID を割り当てます。具体的には , mplsz の情報を元に , メモリプールとして使用するメモリ領域を確保します。 exinf は , 対象メモリプールに関する情報を入れておくためにユーザが自由に使用でき ます。ここで指定した情報を tk_ref_mpl で参照できます。ユーザの情報を入れるため にもっと大きな領域が必要な場合や , 途中で内容を変更したい場合があれば , ユーザプ ログラムでそのためのメモリを確保して , そのアドレスを exinf に入れます。なお , OS では exinf の内容を関知しません。 表 3.7-5 tk_cre_mpl の mplatr で無視される定数マクロ 属性 値 意味 TA_RNG0 0x00000000 保護レベル 0 で実行 TA_RNG1 0x00000100 保護レベル 1 で実行 TA_RNG2 0x00000200 保護レベル 2 で実行 TA_RNG3 0x00000300 保護レベル 3 で実行 mplatr は可変長メモリプールの属性を指定します。TA_TFIFO, TA_TPRI では , タスク がメモリブロック獲得のためにメモリプールの待ち行列に並ぶときの並び方を指定で きます。TA_TFIFO の場合 , タスクの待ち行列は FIFO となり , TA_TPRI の場合 , タス クの待ち行列はタスクの優先度順となります。 TA_USERBUF が指定された場合 , bufptr が有効になり , bufptr を先頭とする mplsz バイ トのメモリ領域をメモリプール領域として使用します。この場合 , OS はメモリプール 領域を確保しません。TA_USERBUF を指定しなかった場合 , bufptr は無視されて OS は 150 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Support Soft Ma nual メモリプール領域を確保します。 pk_cmpl, bufptr が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 タスクがメモリブロック獲得待ちの行列を作った場合 , 待ち行列先頭のタスクに優先 してメモリブロックを割り当てます。待ち行列の 2 番目以降により少ないメモリサイ ズを要求しているタスクがあった場合 , そのタスクが先にメモリブロックを獲得でき ません。例えば , ある可変長メモリプールに要求メモリサイズ= 400 のタスク A と要 求メモリサイズ= 100 のタスク B がこの順で待っており , 別のタスクの tk_rel_mpl に よりメモリサイズ= 200 の連続空きメモリ領域ができたとします。この場合 , 要求サイ ズの少ないタスク B は先にメモリブロックを獲得できません。 ■ 補足事項 以下のように待ち行列の順序が変化した場合 , 新たに待ち行列の先頭になったタスク にメモリブロック割当てが試みられます。その結果 , メモリブロックを割り当てられて いるとそのタスクの待ちを解除します。したがって , tk_rel_mpl によるメモリの解放が なくても , メモリブロックの獲得を行い , 待ちを解除する場合があります。 • メモリブロック獲得待ち行列の先頭タスクの待ちが強制解除された。 • メモリブロック獲得待ち行列の先頭タスクが強制終了した。 • 優先度順のメモリブロック獲得待ち行列で , 先頭タスク以外のタスクの優先度が変 更されて先頭タスクの優先度よりも高くなった。 January 31, 2014, CM81-00210-2a 151 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Su pp or t 3.7.2.2 So ft Manu al tk_del_mpl(Delete Variable-size Memory Pool) 可変長メモリプールを削除します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_del_mpl ( ID mplid ) ; ■ パラメータ ● 入力 mplid 可変長メモリプール ID (Memory Pool ID) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mplid が 0 以下 · 最大可変長メモリプール数より大きい E_NOEXS -42 オブジェクトが存在していない ·mplid の可変長メモリプールが存在しない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 mplid で指定した可変長メモリプールを削除したことにより , 本システムコールを呼び 出したタスクより優先度の高いタスクの待ち状態が解除された場合 , 待ち状態が解除 されたタスクにディスパッチします。 ■ 解説 mplid で指定された可変長メモリプールを削除します。具体的には , 対象メモリプール を未生成状態にして ID 番号およびメモリプール本体の領域を解放します。 このメモリプールからメモリブロックを獲得しているタスクが存在しても , その チェックや通知は行いません。すべてのメモリブロックが返却されていなくても , 本シ ステムコールは正常終了します。 対象メモリプールでメモリブロック獲得を待っているタスクがあった場合 , 本システ ムコールは正常終了しますが , 待ち状態にあったタスクには E_DLT のエラーで復帰し ます。 152 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Support 3.7.2.3 Soft Ma nual tk_get_mpl(Get Variable-size Memory Block) 可変長メモリブロックを獲得します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_get_mpl ( ID mplid, W blksz, VP *p_blk, TMO tmout ) ; ■ パラメータ ● 入力 mplid 可変長メモリプール ID (Memory Pool ID) blksz メモリブロックサイズ ( バイト数 ) (Block Size) tmout タイムアウト指定 (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロが指定可能 表 3.7-6 tk_get_mpl の tmout で指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 ercd エラーコード (Error Code) p_blk メモリブロックの先頭アドレス (Block Start Address) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mplid が 0 以下または最大可変長メモリプール数より大きい E_NOEXS -42 オブジェクトが存在していない ·mplid の固定長メモリプールが存在しない E_PAR -17 パラメータエラー ·blksz が 0 以下またはメモリプールの領域サイズより大きい ·tmout が -2 以下 E_DLT -51 待ちオブジェクトが削除された · 待ちの間に対象メモリプールを削除 E_RLWAI -49 待ち状態強制解除 · 待ちの間に tk_rel_wai を受け付ける January 31, 2014, CM81-00210-2a 153 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Su pp or t E_TMOUT -50 So ft Manu al ポーリング失敗またはタイムアウト ·tmout の時間経過により待ち状態が解除された ·tmout が TMO_POL で , メモリブロックが獲得できない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクがメモリプール待ち状態になった場合 , 次の優 先順位のタスクにディスパッチします。 ■ 解説 mplid で指定された可変長メモリプールから blksz で指定されたサイズ ( バイト数 ) の メモリブロックを獲得します。 獲得したメモリブロックの先頭アドレスを p_blk に返します。獲得したメモリブロック のゼロクリアは行わず , 内容は不定となります。メモリブロックが獲得できない場合 , 本システムコールを呼び出したタスクは待ち状態に入ります。 tmout により , 待ち時間の最大値 ( タイムアウト値 ) を指定できます。TMO_FEVR は , タイムアウトまでの時間が無限大であることを示します。この場合は , メモリブロック が獲得できるまで , または tk_rel_wai が呼び出されるまで待ち状態になります。 TMO_POL はメモリブロックが獲得できなかった場合 , 待ち状態には移行せずに E_TMOUT のエラーで復帰します。 tmout の基準時間 ( 時間の単位 ) はシステム時刻の基準時間 ( = 1 ms) と同じです。 メモリブロック獲得待ちを行う場合の待ち行列の順序はメモリプールの属性によって, FIFO またはタスク優先度順のいずれかとなります。 p_blk が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 154 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Support 3.7.2.4 Soft Ma nual tk_rel_mpl(Release Variable-size Memory Block) 可変長メモリブロックを返却します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_rel_mpl ( ID mplid, VP blk ) ; ■ パラメータ ● 入力 mplid 可変長メモリプール ID (Memory Pool ID) blk メモリブロックの先頭アドレス (Block Start Address) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mplid が 0 以下または最大可変長メモリプール数より大きい E_NOEXS -42 オブジェクトが存在していない ·mplid の可変長メモリプールが存在しない E_PAR -17 パラメータエラー ·blk がメモリプール領域の範囲外 E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールを呼び出したタスクより優先度の高いタスクのメモリプール待ち状 態を解除した場合 , 待ち状態が解除されたタスクにディスパッチします。 ■ 解説 blk で指定されたアドレスのメモリブロックを mplid で指定された可変長メモリプール へ返却します。 tk_rel_mpl の実行により , mplid のメモリプールでメモリブロックを待っていた別のタ スクがメモリブロックを獲得し , そのタスクの待ち状態を解除する場合があります。 メモリブロックは , メモリブロックの獲得を行った可変長メモリプールに必ず返却し てください。 January 31, 2014, CM81-00210-2a 155 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Su pp or t So ft Manu al ■ 補足事項 複数のタスクが待っている可変長メモリプールにメモリブロックを返却する場合 , 複 数のタスクの要求メモリサイズの総和以上のメモリブロックを返却した場合,複数のタ スクが同時に待ち解除となります。この場合の待ち解除後のタスクの優先順位は , 同じ 優先度のタスクの間では待ち行列に並んでいたときと同じ順序となります。 156 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Support 3.7.2.5 Soft Ma nual tk_ref_mpl(Refer Variable-size Memory Pool Status) 可変長メモリプールの状態を参照します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 × ■ C 言語インタフェース ER ercd = tk_ref_mpl ( ID mplid, T_RMPL *pk_rmpl ) ; typedef struct t_rmpl { VP exinf; ID wtsk; W frsz; W maxsz; } T_RMPL; ■ パラメータ ● 入力 mplid 可変長メモリプール ID (Memory Pool ID) pk_rmpl メモリプールの状態を返すパケットアドレス (Packet of Refer Memory Pool) ● 出力 ercd エラーコード (Error Code) ● pk_rmpl に返されるデータ exinf 拡張情報 (Extended Information) wtsk 待ちタスクの有無 (Wait Task) frsz 空き領域の合計サイズ ( バイト数 ) (Free Memory Size) maxsz 最大の空き領域のサイズ ( バイト数 ) (Max Memory Size) January 31, 2014, CM81-00210-2a 157 第 3 章 システムコールインタフェース 3.7 メモリプール管理機能のシステムコール Su pp or t So ft Manu al ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·mplid が 0 以下または最大可変長メモリプール数より大きい E_NOEXS -42 オブジェクトが存在していない ·mplid の可変長メモリプールが存在しない E_CTX -25 コンテキストエラー · タスク独立部またはディスパッチ禁止状態で実行 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 mplid で指定された対象可変長メモリプールの各種状態を参照して復帰値として現在 の空き領域の合計サイズ frsz, 獲得可能な最大の空き領域のサイズ maxsz, 待ちタスクの 有無 (wtsk), 拡張情報 (exinf) を返します。 wtsk は , この可変長メモリプールで待っているタスクの ID を設定します。この可変長 メモリプールで複数のタスクが待っている場合 , 待ち行列の先頭タスクの ID を返しま す。待ちタスクがない場合 , 0 を返します。 pk_rmpl が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 158 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Support 3.8 Soft Ma nual 時間管理機能のシステムコール 時間管理機能のシステムコールを説明します。 ■ 時間管理機能のシステムコール 時間管理機能は , 以下の 3 種類の機能のシステムコールで構成されます。 • システム時刻管理機能のシステムコール • 周期ハンドラ機能のシステムコール • アラームハンドラ機能のシステムコール January 31, 2014, CM81-00210-2a 159 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Su pp or t 3.8.1 So ft Manu al システム時刻管理機能のシステムコール システム時刻管理機能のシステムコールを説明します。 ■ システム時刻管理機能のシステムコール システム時刻管理機能は , 以下の 4 種類のシステムコールで構成されます。 • tk_set_tim(Set Time) • tk_get_tim(Get Time) • tk_get_otm(Get Operating Time) • isig_tim(Signal Time) 160 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Support 3.8.1.1 Soft Ma nual tk_set_tim(Set Time) システム時刻を設定します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_set_tim ( SYSTIM *pk_tim ) ; typedef struct systim { W hi; UW lo; } SYSTIM; ■ パラメータ ● 入力 pk_tim 現在時刻を示すパケットアドレス (Packet of Current Time) ● pk_tim に設定するデータ hi システム設定用の現在時刻 ( 上位 32 ビット ) lo システム設定用の現在時刻 ( 下位 32 ビット ) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_PAR -17 パラメータエラー ·pk_tim.hi が負 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 システム時刻の値を systim で指定された値に設定します。システム時刻は , 1985 年 1 月 1 日 0 時 (GMT) からの通算の ms とします。 pk_tim が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 161 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Su pp or t So ft Manu al ■ 補足事項 システムの動作中に本システムコールを使ってシステム時刻を変更した場合, RELTIM や TMO で指定された相対時間は変化しません。例えば , 60 秒後にタイムアウトするよ うに指定された場合 , タイムアウト待ちの間に本システムコールで時間を 60 秒進めて も , そこでタイムアウトすることはなく , 60 秒後にタイムアウトします。ただし , 本シ ステムコールによってタイムアウトするシステム時刻は変化します。 162 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Support 3.8.1.2 Soft Ma nual tk_get_tim(Get Time) システムの現在時刻を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_get_tim ( SYSTIM *pk_tim ) ; typedef struct systim { W hi; UW lo; } SYSTIM; ■ パラメータ ● 入力 pk_tim 現在時刻を返すパケットアドレス (Packet of Current Time) ● 出力 ercd エラーコード (Error Code) ● pk_tim に返されるデータ hi システムの現在時刻 ( 上位 32 ビット ) lo システムの現在時刻 ( 下位 32 ビット ) ■ エラーコード E_OK 0 正常終了 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 システム時刻の現在の値を読み出して復帰値pk_tim に返します。システム時刻は, 1985 年 1 月 1 日 0 時 0 分 0 秒 (GMT) からの通算の ms とします。 pk_tim が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 163 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Su pp or t 3.8.1.3 So ft Manu al tk_get_otm(Get Operating Time) システム稼働時間を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_get_otm ( SYSTIM *pk_tim ) ; typedef struct systim { W hi; UW lo; } SYSTIM; ■ パラメータ ● 入力 pk_tim 稼働時間を返すパケットアドレス (Packet of Operating Time) ● 出力 ercd エラーコード (Error Code) ● pk_tim に返されるデータ hi システムの稼動時刻 ( 上位 32 ビット ) lo システムの稼動時刻 ( 下位 32 ビット ) ■ エラーコード E_OK 0 正常終了 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 システム稼働時間を獲得します。システム稼働時間はシステム時刻 ( 時刻 ) と異なり , システム起動時からの単純増加する稼働時間を表し , 単位は 1ms です。 システム稼働時間は tk_set_tim による時刻設定に影響しません。 pk_tim が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 164 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Support 3.8.1.4 Soft Ma nual isig_tim(Signal Time) システム時刻を更新します。 タスク部 × タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = isig_tim ( void ) ; ■ パラメータ ● 入力 なし ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 システム時刻を更新します。本システムコールは T-REALOS 独自の機能です。 本システムコールをユーザプログラムから , システム時刻の基準時間 ( = 1 ms) ごとに 呼び出すことによりシステム時刻を更新します。周期が 1ms のタイマ割込みを発生さ せ , その割込みハンドラから本システムコールを呼び出してください。 本システムコールをタスク部から呼び出すことはできません。タスク部から呼び出し た場合はその動作は保証されません。 January 31, 2014, CM81-00210-2a 165 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Su pp or t 3.8.2 So ft Manu al 周期ハンドラ機能のシステムコール 周期ハンドラ機能のシステムコールを説明します。 ■ 周期ハンドラ機能のシステムコール 周期ハンドラ機能は , 以下の 5 種類のシステムコールで構成されます。 • tk_cre_cyc(Create Cyclic Handler) • tk_del_cyc(Delete Cyclic Handler) • tk_sta_cyc(Start Cyclic Handler) • tk_stp_cyc(Stop Cyclic Handler) • tk_ref_cyc(Refer Cyclic Handler Status) 166 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Support 3.8.2.1 Soft Ma nual tk_cre_cyc(Create Cyclic Handler) 周期ハンドラを生成します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID cycid = tk_cre_cyc ( T_CCYC *pk_ccyc ) ; typedef struct t_ccyc { VP exinf; ATR cycatr; FP cychdr; RELTIM cyctim; RELTIM cycphs; } T_CCYC; ■ パラメータ ● 入力 pk_ccyc 周期ハンドラ定義情報 (Packet of Create Cyclic Handler) ● pk_ccyc に設定するデータ exinf 拡張情報 (Extended Information) cycatr 周期ハンドラ属性 (Cyclic Handler Attribute) cycatr := (TA_HLNG) | [TA_STA] | [TA_PHS] 表 3.8-1 tk_cre_cyc の cycatr で指定できる定数マクロ 属性 値 意味 TA_HLNG 0x00000001 対象周期ハンドラを C 言語で記述 TA_STA 0x00000002 周期ハンドラ起動 TA_PHS 0x00000004 周期ハンドラ起動位相を保存 cychdr 周期ハンドラアドレス (Cyclic Handler Address) cyctim 周期起動時間間隔 (Cycle Time) cycphs 周期起動位相 (Cyclic Handler Phase) ● 出力 cycid 周期ハンドラ ID (Cyclic Handler ID) またはエラーコード (Error Code) January 31, 2014, CM81-00210-2a 167 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Su pp or t So ft Manu al ■ エラーコード E_LIMIT -34 周期ハンドラの数がシステムの制限より大きい E_RSATR -11 予約属性 ·cycatr に未定義の値が指定された E_PAR -17 パラメータエラー ·cychdr が NULL ·cyctim が 0 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 周期ハンドラを生成し , 周期ハンドラ ID を割り当てます。周期ハンドラは , 指定され た時間間隔で動くタスク独立部のハンドラです。 exinf は , 対象となる周期ハンドラに関する情報を入れておくためにユーザが自由に使 用できます。ここで指定した情報は , 周期ハンドラにパラメータとして渡すほか , tk_ref_cyc で参照できます。ユーザの情報を入れるためにもっと大きな領域が必要な場 合や , 途中で内容を変更したい場合があれば , ユーザプログラムでそのためのメモリを 確保し , そのアドレスを exinf に入れます。OS では exinf の内容については関知しませ ん。 表 3.8-2 tk_cre_cyc の cycatr で無視される定数マクロ 属性 TA_ASM 値 0x00000000 意味 対象周期ハンドラをアセンブラで記述 cycatr には , TA_HLNG を必ず指定してください。 T-REALOS は , 周期ハンドラの記述言語は C 言語だけをサポートしています。そのた め , cycatr に TA_ASM を指定した場合も , 周期ハンドラが C 言語で記述されているも のとして処理されますが , T-Kernel 仕様との互換性は保証されません。 TA_STA が指定された場合は , 周期ハンドラの生成時から周期ハンドラは動作状態と なり, cyctimおよびcycphsで指定された時間間隔で周期ハンドラを起動します。 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 以上の時間が経過した後となります。 cychdr は起動する周期ハンドラの先頭アドレスを指定します。cychdr が不正な場合で も , エラーチェックを行わず , 動作は保証されません。周期ハンドラの記述形式につい ては , 「 ユーザーズガイド 『4.6 周期ハンドラ』」を参照してください。 168 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Support Soft Ma nual cycphs は本システムコールによって周期ハンドラを生成してから最初の周期ハンドラ の起動までの時間を表します。その後は cyctim 間隔で周期起動を繰り返します。この 場合 , 周期ハンドラの n 回目の起動は周期ハンドラを生成してから cycphs + cyctim × (n - 1) 以上の時間が経過した後になります。cycphs に 0 が指定された場合 , 周期ハンド ラの生成直後に周期ハンドラを起動します。 TA_STA, TA_PHS と cyctim, cycphs の関係について , 図 3.8-1 に示します。 図 3.8-1 周期ハンドラの起動タイミング 周期ハンドラ 起動 tk_cre_cyc (TA_STAあり) 起動位相 (cycphs) 起動周期 (cyctim) 起動周期 (cyctim) 起動周期 (cyctim) (a) TA_STAが指定された場合 周期ハンドラ tk_sta_cyc 起動 tk_cre_cyc (TA_STAなし) 起動位相 (cycphs) 起動周期 (cyctim) 起動周期 (cyctim) 周期ハンドラ 起動 起動周期 (cyctim) (b) TA_STAが指定なし, TA_PHSが指定された場合 tk_cre_cyc (TA_STAなし) 起動位相 (cycphs) tk_sta_cyc 起動周期 (cyctim) 周期ハンドラ 起動 起動周期 (cyctim) 周期ハンドラ 起動 起動周期 (cyctim) (c) TA_STAが指定なし, TA_PHSが指定なしの場合 pk_ccyc が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 169 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Su pp or t 3.8.2.2 So ft Manu al tk_del_cyc(Delete Cyclic Handler) 周期ハンドラを削除します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_del_cyc ( ID cycid ) ; ■ パラメータ ● 入力 cycid 周期ハンドラ ID (Cyclic Handler ID) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·cycid が 0 以下または最大周期ハンドラ数より大きい E_NOEXS -42 オブジェクトが存在していない ·cycid の周期ハンドラが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 周期ハンドラを削除します。具体的には , 対象周期ハンドラを未生成状態にして ID 番 号を解放します。 170 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Support 3.8.2.3 Soft Ma nual tk_sta_cyc(Start Cyclic Handler) 周期ハンドラの動作を開始します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_sta_cyc ( ID cycid ) ; ■ パラメータ ● 入力 cycid 周期ハンドラ ID (Cyclic Handler ID) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·cycid が 0 以下または最大周期ハンドラ数より大きい E_NOEXS -42 オブジェクトが存在していない ·cycid の周期ハンドラが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 cycid で指定された周期ハンドラを動作状態にします。 TA_PHS 属性を指定している場合 , 周期ハンドラの起動周期はリセットされずに周期 ハンドラを動作状態にします。既に動作状態の場合 , 動作状態を維持して本システム コールは正常終了します。 TA_PHS 属性を指定していない場合 , 起動周期をリセットして周期ハンドラを動作状 態にします。既に動作状態の場合 , 起動周期のリセットをしたうえで動作状態を維持し ます。したがって , 次に周期ハンドラを起動するのは cyctim 後となります。 January 31, 2014, CM81-00210-2a 171 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Su pp or t 3.8.2.4 So ft Manu al tk_stp_cyc(Stop Cyclic Handler) 周期ハンドラの動作を停止します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_stp_cyc ( ID cycid ) ; ■ パラメータ ● 入力 cycid 周期ハンドラ ID (Cyclic Handler ID) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·cycid が 0 以下または最大周期ハンドラ数より大きい E_NOEXS -42 オブジェクトが存在していない ·cycid の周期ハンドラが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 cycid で指定された周期ハンドラを停止します。既に停止状態の場合 , その状態を維持 したまま正常終了します。 ■ 補足事項 tk_cre_cyc では回数の指定がないので , いったん定義された周期ハンドラは , tk_stp_cyc によって停止するか , 周期起動ハンドラを削除するまで周期起動を繰り返します。 複数のタイムイベントハンドラが同時に動く場合 , それらのハンドラはシリアルに起 動します (1 つのハンドラの実行を終了してから別のハンドラの実行を始める )。また , タイムイベントハンドラはタスク独立部なので遅延ディスパッチの原則を適用しま す。 172 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Support 3.8.2.5 Soft Ma nual tk_ref_cyc(Refer Cyclic Handler Status) 周期ハンドラの状態を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ref_cyc ( ID cycid, T_RCYC *pk_rcyc ) ; typedef struct t_rcyc { VP exinf; RELTIM lfttim; UINT cycstat; } T_RCYC; ■ パラメータ ● 入力 cycid 周期ハンドラ ID (Cyclic Handler ID) pk_rcyc 周期ハンドラの状態を返すパケットの先頭アドレス (Packet of Refer Cyclic Handler) ercd エラーコード (Error Code) ● 出力 ● pk_rcyc に返されるデータ exinf 拡張情報 (Extended Information) lfttim 次のハンドラ起動までの残り時間 (Left Time) cycstat 周期ハンドラの状態 (Cyclic Handler Status) cycstat:= (TCYC_STP | TCYC_STA) 表 3.8-3 tk_ref_cyc の cycstat に返される値 状態 値 意味 TCYC_STP 0x00 周期ハンドラが動作していない TCYC_STA 0x01 周期ハンドラが動作している January 31, 2014, CM81-00210-2a 173 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Su pp or t So ft Manu al ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·cycid が 0 以下または最大周期ハンドラ数より大きい E_NOEXS -42 オブジェクトが存在していない ·cycid の周期ハンドラが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 cycid で指定された周期ハンドラの状態を参照して周期ハンドラの状態 cycstat, 次のハ ンドラ起動までの残り時間 lfttim, 拡張情報 exinf を復帰値として返します。 pk_rcyc が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 174 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Support 3.8.3 Soft Ma nual アラームハンドラ機能のシステムコール アラームハンドラ機能のシステムコールを説明します。 ■ アラームハンドラ機能のシステムコール アラームハンドラ機能は , 以下の 5 種類のシステムコールで構成されます。 • tk_cre_alm(Create Alarm Handler) • tk_del_alm(Delete Alarm Handler) • tk_sta_alm(Start Alarm Handler) • tk_stp_alm(Stop Alarm Handler) • tk_ref_alm(Refer Alarm Handler Status) January 31, 2014, CM81-00210-2a 175 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Su pp or t 3.8.3.1 So ft Manu al tk_cre_alm(Create Alarm Handler) アラームハンドラを生成します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID almid = tk_cre_alm ( T_CALM *pk_calm ) ; typedef struct t_calm { VP exinf; ATR almatr; FP almhdr; } T_CALM; ■ パラメータ ● 入力 アラームハンドラ定義情報 pk_calm (Packet of Create Alarm Handler) ● pk_calm に設定するデータ exinf 拡張情報 (Extended Information) almatr アラームハンドラ属性 (Alarm Handler Attribute) almatr := TA_HLNG 表 3.8-4 tk_cre_alm の almatr で指定できる定数マクロ 属性 値 TA_HLNG almhdr 0x00000001 意味 対象アラームハンドラを C 言 語で記述 アラームハンドラアドレス (Alarm Handler Address) ● 出力 almid アラームハンドラ ID (Alarm Handler ID) またはエラーコード (Error Code) ■ エラーコード E_LIMIT -34 アラームハンドラの数がシステムの制限より大きい E_RSATR -11 予約属性 ·almatr に未定義の値が指定された E_PAR -17 パラメータエラー ·almhdr が NULL 176 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Support Soft Ma nual ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 アラームハンドラを生成してアラームハンドラ ID を割り当てます。アラームハンドラ ( 指定時刻起動ハンドラ ) は , 指定された時刻に起動するタスク独立部のハンドラです。 exinf は , 対象となるアラームハンドラに関する情報を入れておくためにユーザが自由 に使用できます。ここで指定した情報は , アラームハンドラにパラメータとして渡すほ か , tk_ref_alm で参照できます。ユーザの情報を入れるためにもっと大きな領域が必要 な場合や , 途中で内容を変更したい場合があれば , ユーザプログラムでそのためのメモ リを確保して , そのアドレスを exinf に入れます。なお , OS は exinf の内容を関知しま せん。 表 3.8-5 tk_cre_alm の almatr で無視される定数マクロ 属性 TA_ASM 値 0x00000000 意味 対象アラームハンドラをアセンブラで記述 almatr には , TA_HLNG を必ず指定してください。 T-REALOS は , アラームハンドラの記述言語は C 言語だけをサポートしています。そ のため , almatr に TA_ASM を指定した場合も , アラームハンドラが C 言語で記述され ているものとして処理されますが , T-Kernel 仕様との互換性は保証されません。 almhdr は起動するアラームハンドラの先頭アドレスを指定します。また , almhdr が不 正な場合でも , エラーチェックを行わず , 動作は保証されません。アラームハンドラの 記述形式は , 「 ユーザーズガイド 『4.7 アラームハンドラ』」を参照してください。 pk_calm が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 177 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Su pp or t 3.8.3.2 So ft Manu al tk_del_alm(Delete Alarm Handler) アラームハンドラを削除します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_del_alm ( ID almid ) ; ■ パラメータ ● 入力 almid アラームハンドラ ID (Alarm Handler ID) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·almid が 0 以下または最大アラームハンドラ数より大きい E_NOEXS -42 オブジェクトが存在していない ·almid のアラームハンドラが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 アラームハンドラを削除します。具体的には , 対象アラームハンドラを未生成状態にし て ID 番号を解放します。 178 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Support 3.8.3.3 Soft Ma nual tk_sta_alm(Start Alarm Handler) アラームハンドラの動作を開始します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_sta_alm ( ID almid, RELTIM almtim ) ; ■ パラメータ ● 入力 almid アラームハンドラ ID (Alarm Handler ID) almtim アラームハンドラ起動時刻 (Alarm Handler Time) ercd エラーコード (Error Code) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·almid が 0 以下または最大アラームハンドラ数より大きい E_NOEXS -42 オブジェクトが存在していない ·almid のアラームハンドラが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 almid で指定されたアラームハンドラの起動時刻を設定して動作状態にします。 almtim は相対時刻で , 本システムコールが呼び出された時刻から almtim で指定された 時間が経過した後にアラームハンドラを起動します。既にアラームハンドラの起動時 刻が設定されて動作状態であった場合 , その設定を解除した後に新たに起動時刻を設 定して動作状態とします。almtim=0 の場合 , 起動時刻設定直後にアラームハンドラを 起動します。起動されたアラームハンドラの処理終了後に停止状態となります。 January 31, 2014, CM81-00210-2a 179 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Su pp or t 3.8.3.4 So ft Manu al tk_stp_alm(Stop Alarm Handler) アラームハンドラの動作を停止します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_stp_alm ( ID almid ) ; ■ パラメータ ● 入力 almid アラームハンドラ ID (Alarm Handler ID) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·almid が 0 以下または最大アラームハンドラ数より大きい E_NOEXS -42 オブジェクトが存在していない ·almid のアラームハンドラが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 アラームハンドラを停止状態にします。既に停止状態の場合 , その状態を継続して正常 終了します。 180 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Support 3.8.3.5 Soft Ma nual tk_ref_alm(Refer Alarm Handler Status) アラームハンドラの状態を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ref_alm ( ID almid, T_RALM *pk_ralm ) ; typedef struct t_ralm { VP exinf; RELTIM lfttim; UINT almstat; } T_RALM; ■ パラメータ ● 入力 almid アラームハンドラ ID (Alarm Handler ID) pk_ralm アラームハンドラの状態を返すパケットの先頭アドレス (Packet of Refer Alarm Handler) ● 出力 エラーコード (Error Code) ercd ● pk_ralm に返されるデータ exinf 拡張情報 (Extended Information) lfttim 次のハンドラ起動までの残り時間 (Left Time) almstat アラームハンドラの状態 (Alarm Handler Status) almstat := (TALM_STP | TALM_STA) 表 3.8-6 tk_ref_alm の almstat に返される値 状態 値 意味 TALM_STP 0x00 アラームハンドラが動作して いない TALM_STA 0x01 アラームハンドラが動作して いる January 31, 2014, CM81-00210-2a 181 第 3 章 システムコールインタフェース 3.8 時間管理機能のシステムコール Su pp or t So ft Manu al ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·almid が 0 以下または最大アラームハンドラ数より大きい E_NOEXS -42 オブジェクトが存在していない ·almid のアラームハンドラが存在しない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 almid で指定されたアラームハンドラの状態を参照してハンドラ起動までの残り時間 lfttim, 拡張情報 exinf を復帰値として返します。 アラームハンドラが動作している (TALM_STA) 場合 , lfttim には次にアラームハンドラ を起動するまでの相対時間を返します。tk_sta_alm で指定された almtim ≧ lfttim ≧ 0 の 範囲の値となります。lfttim はタイマ割込みごとに減算するため , 次のタイマ割込みで アラームハンドラが起動する場合 , lfttim は 0 となります。 アラームハンドラが動作していない (TALM_STP) 場合 , lfttim は不定です。 pk_ralm が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 182 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.9 割込み管理機能のシステムコール Support 3.9 Soft Ma nual 割込み管理機能のシステムコール 割込み管理機能のシステムコールを説明します。 ■ 割込み管理機能のシステムコール 割込み管理機能のシステムコールは , 以下の 2 種類のシステムコールで構成されます。 • tk_def_int(Define Interrupt Handler) • tk_ret_int(Return from Interrupt Handler) また , 割込み管理機能には , 以下の 3 種類のマクロがあります。 • DI • EI • isDI January 31, 2014, CM81-00210-2a 183 第 3 章 システムコールインタフェース 3.9 割込み管理機能のシステムコール Su pp or t 3.9.1 So ft Manu al tk_def_int(Define Interrupt Handler) 割込みハンドラを定義または解除します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_def_int ( UINT dintno, T_DINT *pk_dint ) ; typedef struct t_dint { ATR intatr; FP inthdr; } T_DINT; ■ パラメータ ● 入力 dintno 割込みベクタ番号 pk_dint 割込みハンドラ定義情報の先頭アドレス (Packet of Define Interrupt Handler) ● pk_dint に設定するデータ 割込みハンドラ属性 (Interrupt Handler Attribute) intatr intatr := (TA_ASM ∥ TA_HLNG) 表 3.9-1 tk_def_int の intatr で指定できる定数マクロ 属性 値 意味 TA_ASM 0x00000000 対象ハンドラをアセンブラで 記述 TA_HLNG 0x00000001 対象ハンドラを C 言語で記述 割込みハンドラアドレス inthdr (Interrupt Handler Address) ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_RSATR -11 予約属性 ·intatr に未定義の属性が指定された 184 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.9 割込み管理機能のシステムコール Support E_PAR -17 Soft Ma nual パラメータエラー ·dintno がコンフィギュレータで定義した最大割込み数より も大きい ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 割込みハンドラを定義して割込みハンドラを使用可能にします。または , 割込みハンド ラの定義を解除します。割込みは , デバイスからの外部割込み , 例外による割込みおよ びソフトウェア割込みのすべてを含みます。 dintno は , 割込みハンドラを定義する割込みベクタ番号を指定します。0 から 255 まで の値を指定可能です。既に定義済みの割込み番号に割込みハンドラを再定義すること もできます。再定義の場合も , あらかじめその番号のハンドラの定義解除を行っておく 必要はありません。 pk_dint は , 割込みハンドラの定義情報を格納する T_DINT 構造体のアドレスです。 pk_dint の値と pk_def_int の動作の関係を以下に示します。 表 3.9-2 tk_def_int と pk_dint との動作関係 pk_dint の値 tk_def_int の動作 正常アドレス (NULL 以外 ) 割込みハンドラの定義 NULL 割込みハンドラの定義解除 不正アドレス 動作は保証しない intatr は , 割込みハンドラの記述言語を指定します。inthdr は , 割込みハンドラの先頭ア ドレスを指定します。inthdr のアドレスが不当な場合は , 対応する割込みが発生したと きに不当アドレスにジャンプするため , その後のシステムの動作は保証されません。 なお , 割込みハンドラとタスクの実行優先順位については , 「ユーザーズガイド 『2.6 タスク / ハンドラの実行優先順位』」を参照してください。また , 割込みハンドラの記 述形式は , 「ユーザーズガイド 『4.8 割込みハンドラ』」を参照してください。 January 31, 2014, CM81-00210-2a 185 第 3 章 システムコールインタフェース 3.9 割込み管理機能のシステムコール Su pp or t 3.9.2 So ft Manu al tk_ret_int(Return from Interrupt Handler) 割込みハンドラから復帰します。 タスク部 × タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース void tk_ret_int ( void ) ; ■ パラメータ ● 入力 なし ● 出力 なし ■ エラーコード なし ■ ディスパッチ要因 現在実行中のタスクより優先度の高いタスクが実行可能状態になった場合 , 実行可能 状態になったタスクにディスパッチします。 ■ 解説 アセンブラ言語で記述された割込みハンドラの終了時に本システムコールを呼び出す ことにより , 遅延ディスパッチを発生させます。 186 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.9 割込み管理機能のシステムコール Support 3.9.3 Soft Ma nual DI すべての外部割込みを禁止します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース void DI ( UINT intsts ); ■ パラメータ ● 入力 なし ● 出力 intsts 割込みの状態 (FAULTMASK レジスタの値 ) ■ エラーコード なし ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 FAULTMASK レジスタの値を 1( 割込み禁止 ) に設定してすべての外部割込みを禁止し ます。本システムコールを呼び出す前の FAULTMASK レジスタの値を intsts に保存し ます。 〈使用例〉 void foo() { UINT intsts; DI(intsts); if ( isDI(intsts) ) { /* この関数が呼び出された時点で既に割込み禁止であった */ } else { /* この関数が呼び出された時点では割込み許可であった */ } EI(intsts); } January 31, 2014, CM81-00210-2a 187 第 3 章 システムコールインタフェース 3.9 割込み管理機能のシステムコール Su pp or t 3.9.4 So ft Manu al EI すべての外部割込みを許可します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース void EI ( UINT intsts ); ■ パラメータ ● 入力 intsts 割込みの状態 (FAULTMASK レジスタの値 ) ● 出力 なし ■ エラーコード なし ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 すべての外部割込みを許可します。正確には , intsts で指定された FAULTMASK レジス タの値が 0( 割込み許可 ) の場合 , FAULTMASK レジスタの値を 0 に設定して割込み許 可の状態に戻します。 intsts で指定された FAULTMASK レジスタの値が 1 ( 割込み禁止 ) の場合 , EI() を実行 しても割込みを許可しません。ただし , intsts として 0 が指定された場合 , 必ず割込み を許可します。 intsts は , DI() で保存した値または 0 のいずれかです。それ以外の値を指定した場合 , 動 作は保証されません。 〈使用例〉 void foo() { UINT intsts; DI(intsts); if ( isDI(intsts) ) { /* この関数が呼び出された時点で既に割込み禁止であった */ } else { /* この関数が呼び出された時点では割込み許可であった */ } EI(intsts); } 188 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.9 割込み管理機能のシステムコール Support 3.9.5 Soft Ma nual isDI 外部割込み禁止状態を調べます。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース BOOL stat = isDI ( UINT intsts ); ■ パラメータ ● 入力 intsts 割込みの状態 (FAULTMASK レジスタの値 ) stat TRUE(0 以外の値 ): 割込み禁止状態 ● 出力 FALSE: 割込み許可状態 ■ エラーコード なし ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 intsts に保存されている FAULTMASK レジスタの値を元に割込み許可 / 禁止状態を調べ ます。intsts に保存された FAULTMASK レジスタの値が 1 の場合は割込み禁止状態と 判断し , 0 の場合は割込み許可と判断します。ただし , 本システムコールで調べること ができるのは intsts を保存した DI() 発行前の割込み禁止状態だけです。現在の割込み 禁止状態を確認する場合 , tk_ref_sys を使用してください。 intsts は DI() で保存した値です。それ以外の値を指定した場合 , 動作は保証されません。 〈使用例〉 void foo() { UINT intsts; DI(intsts); if ( isDI(intsts) ) { /* この関数が呼び出された時点で既に割込み禁止であった */ } else { /* この関数が呼び出された時点では割込み許可であった */ } EI(intsts); } January 31, 2014, CM81-00210-2a 189 第 3 章 システムコールインタフェース 3.10 システム状態管理機能のシステムコール Su pp or t 3.10 So ft Manu al システム状態管理機能のシステムコール システム状態管理機能のシステムコールを説明します。 ■ システム状態管理機能のシステムコール システム状態管理機能は , 以下の 6 種類のシステムコールで構成されます。 • tk_rot_rdq(Rotate Ready Queue) • tk_get_tid(Get Task Identifier) • tk_dis_dsp(Disable Dispatch) • tk_ena_dsp(Enable Dispatch) • tk_ref_sys(Refer System Status) • tk_ref_ver(Refer Version Information) 190 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.10 システム状態管理機能のシステムコール Support 3.10.1 Soft Ma nual tk_rot_rdq(Rotate Ready Queue) タスクの優先順位を回転します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_rot_rdq ( PRI tskpri ) ; ■ パラメータ ● 入力 tskpri 優先度 (Task Priority) 表 3.10-1 tk_rot_rdq の tskpri で指定できる定数マクロ 名前 値 TPRI_RUN 0 意味 現在実行中のタスクの優先度 ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_PAR -17 パラメータエラー ·tskpri が負または最大優先度より大きい ■ ディスパッチ要因 本システムコールを呼び出したタスクと同じ優先度が指定された場合 , かつその優先 度のタスクがほかにある場合に , 次の優先順位のタスクにディスパッチします。 ■ 解説 tskpri で指定された優先度のタスクの優先順位を回転します。すなわち , 対象優先度を 持った実行できる状態のタスクの中で最も高い優先順位を持つタスクを同じ優先度を 持つタスクの中で最低の優先順位とします。 tskpri に TPRI_RUN(=0) を指定すると , 実行状態にあるタスクの優先度が tskpri に指定 された場合と同じ動作をします。周期ハンドラなどのタスク独立部から tskpri に TPRI_RUN を指定して本システムコールを呼び出すこともできます。 January 31, 2014, CM81-00210-2a 191 第 3 章 システムコールインタフェース 3.10 システム状態管理機能のシステムコール Su pp or t So ft Manu al ■ 補足事項 対象優先度を持った実行できる状態のタスクがない場合や , 1 つしかない場合 , 何もせ ずに正常終了します。 ディスパッチ禁止状態では , 同じ優先度を持つタスクの中で最高の優先順位を持った タスクが実行されているとは限らないため , この方法で自タスクの実行順位が同じ優 先度を持つタスクの中で最低になるとは限りません。 tk_rot_rdq の実行例を図 3.10-1 と図 3.10-2 に示します。図 3.10-1 の状態で tskpri = 2 を パラメータとして本システムコールが呼び出されると , 新しい優先順位は図 3.10-2 に なり , 次に実行するのはタスク C になります。 図 3.10-1 tk_rot_rdq 実行前の優先順位 優先度 高 ↑ │ ↓ 低 1 2 [タスクB]→[タスクC]→[タスクD] 3 [タスクE] 図 3.10-2 tk_rot_rdq(tskpri=2) 実行後の優先順位 優先度 高 ↑ │ ↓ 低 1 2 [タスクC]→[タスクD]→[タスクB] 3 [タスクE] (注意事項) 次に実行されるのはタスクC です。 192 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.10 システム状態管理機能のシステムコール Support 3.10.2 Soft Ma nual tk_get_tid(Get Task Identifier) 実行状態タスクのタスク ID を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID tskid = tk_get_tid ( void ) ; ■ パラメータ ● 入力 なし ● 出力 tskid 実行状態のタスク ID (Task ID) ■ エラーコード なし ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 現在実行状態にあるタスクの ID 番号を tskid に設定して復帰します。 タスク部から呼び出した場合 , 自タスクの ID が返ります。現在実行状態のタスクがな い場合 , 0 が返ります。 ■ 補足事項 本システムコールで返すタスク ID は tk_ref_sys で返す runtskid と同一です。 January 31, 2014, CM81-00210-2a 193 第 3 章 システムコールインタフェース 3.10 システム状態管理機能のシステムコール Su pp or t 3.10.3 So ft Manu al tk_dis_dsp(Disable Dispatch) ディスパッチを禁止します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_dis_dsp ( void ) ; ■ パラメータ ● 入力 なし ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_CTX -25 コンテキストエラー · タスク独立部からの呼出し ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 タスクのディスパッチを禁止します。これ以後 , tk_ena_dsp を実行するまでの間はディ スパッチ禁止状態となり , 自タスクが実行状態から実行可能状態に移りません。また , 待ち状態に移ることもできなくなります。ただし , 外部割込みは禁止しませんので , ディスパッチ禁止状態の場合でも割込みハンドラは起動します。 ディスパッチ禁止状態は , 実行中のタスクが割込みハンドラによってプリエンプト (CPU の実行権の横取り ) される可能性がありますが , ほかのタスクによってプリエン プトされる可能性はありません。 ディスパッチ禁止状態の間は , 具体的には以下の動作をします。 • 割込みハンドラあるいは tk_dis_dsp を実行したタスクから呼び出されたシステム コールによって , tk_dis_dsp を実行したタスクより高い優先度のタスクが実行可能 状態となっても , そのタスクにはディスパッチしません。優先度の高いタスクへの ディスパッチはディスパッチ禁止状態が終了するまで遅延します。 • tk_dis_dsp を実行したタスクが , 自タスクを待ち状態に移す可能性があるシステム コール (tk_slp_tsk, tk_wai_sem など ) を呼び出した場合 , E_CTX のエラーで復帰しま す。 • tk_ref_sys によってシステム状態を参照した場合, sysstat としてTSS_DDSP が返りま す。 既にディスパッチ禁止状態にあるタスクが tk_dis_dsp を呼び出した場合, ディスパッチ 194 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.10 システム状態管理機能のシステムコール Support Soft Ma nual 禁止状態がそのまま継続するだけで正常終了します。ただし , tk_dis_dsp を何回か呼び 出しても , その後に tk_ena_dsp を 1 回呼び出すだけでディスパッチ禁止状態を解除し ますので注意してください。 ■ 補足事項 ディスパッチ禁止状態では実行状態のタスクを休止状態や未登録状態に移行できませ ん。割込みおよびディスパッチ禁止状態で実行状態のタスクが tk_ext_tsk または tk_exd_tsk を呼び出した場合 , E_CTX のエラーを検出します。ただし , tk_ext_tsk や tk_exd_tsk は元のコンテキストに復帰しないシステムコールなので , これらのシステム コールの復帰値としてエラーを通知できません。 January 31, 2014, CM81-00210-2a 195 第 3 章 システムコールインタフェース 3.10 システム状態管理機能のシステムコール Su pp or t 3.10.4 So ft Manu al tk_ena_dsp(Enable Dispatch) ディスパッチを許可します。 タスク部 ○ タスク独立部 × ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ena_dsp ( void ) ; ■ パラメータ ● 入力 なし ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_CTX -25 コンテキストエラー · タスク独立部からの呼出し ■ ディスパッチ要因 遅延されているディスパッチがある場合にディスパッチします。 ■ 解説 タスクのディスパッチを許可します。すなわち , tk_dis_dsp によって設定されていた ディスパッチ禁止状態を解除します。 ディスパッチ禁止状態ではないタスクが本システムコールを呼び出した場合 , ディス パッチを許可した状態がそのまま継続するだけで正常終了します。 196 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.10 システム状態管理機能のシステムコール Support 3.10.5 Soft Ma nual tk_ref_sys(Refer System Status) システム状態を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ref_sys ( T_RSYS *pk_rsys ) ; typedef struct t_rsys { UINT sysstat; ID runtskid; ID schedtskid; } T_RSYS; ■ パラメータ ● 入力 システム状態を返すパケットアドレス pk_rsys (Packet of Refer System) ● 出力 エラーコード (Error Code) ercd ● pk_rsys に返されるデータ sysstat システム状態 (System State) sysstat:= ( TSS_TSK | [TSS_DDSP] | [TSS_DINT] ) ∥ ( TSS_QTSK | [TSS_DDSP] | [TSS_DINT] ) ∥ ( TSS_INDP ) 表 3.10-2 tk_ref_sys の sysstat で指定できる定数マクロ 状態 値 意味 TSS_TSK 0 タスク部実行中 TSS_DDSP 1 ディスパッチ禁止中 TSS_DINT 2 割込み禁止中 TSS_INDP 4 タスク独立部実行中 TSS_QTSK 8 準タスク部実行中 runtskid 現在実行状態にあるタスクの ID (Running Task ID) schedtskid 実行状態にすべきタスクの ID (Scheduled Task ID) January 31, 2014, CM81-00210-2a 197 第 3 章 システムコールインタフェース 3.10 システム状態管理機能のシステムコール Su pp or t So ft Manu al ■ エラーコード E_OK 0 正常終了 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 実行状態を参照してディスパッチ禁止中 , タスク独立部実行中などといった情報を復 帰値として返します。 runtskid には現在実行中のタスクの ID, schedtskid には実行状態にすべきタスクの ID を 返します。通常は runtskid = schedtskid となりますが , ディスパッチ禁止中やタスク独 立部実行中に , より優先度の高いタスクが存在する場合は runtskid ≠ schedtskid となり ます。 なお , 該当タスクがない場合 , 0 を返します。 pk_rsys が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 198 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.10 システム状態管理機能のシステムコール Support 3.10.6 Soft Ma nual tk_ref_ver(Refer Version Information) カーネルのバージョン情報を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ref_ver ( T_RVER *pk_rver ) ; typedef struct t_rver { UH maker; UH prid; UH spver; UH prver; UH prno[4]; } T_RVER; ■ パラメータ ● 入力 pk_rver バージョン情報を返すパケットの先頭アドレス (Packet of Version Information) ● 出力 ercd エラーコード (Error Code) ● pk_rver に返されるデータ カーネルのメーカコード (Maker) maker =0x0009( メーカコード = 富士通,Spansion ) カーネルの識別番号 (Product ID) prid =0x6B00(T-REALOS/M3) 仕様書バージョン番号 (Specification Version) spver =0x6101(T-Kernel ver.1.01) カーネルのバージョン番号 (Product Version) prver =0x0100(V01L00) カーネル製品の管理情報 (Product Number) prno[4] prno[0] = 0x0000(R00) prno[1] ~ [3] = 0x0000( 未使用 ) ■ エラーコード E_OK 0 正常終了 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 January 31, 2014, CM81-00210-2a 199 第 3 章 システムコールインタフェース 3.10 システム状態管理機能のシステムコール Su pp or t So ft Manu al ■ 解説 使用しているカーネルのバージョン情報を参照して pk_rver で指定されるパケットに 返します。 pk_rver が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 200 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.11 サブシステム機能のシステムコール Support 3.11 Soft Ma nual サブシステム機能のシステムコール サブシステム機能のシステムコールを説明します。 ■ サブシステム機能のシステムコール サブシステム機能は , 以下の 2 種類のシステムコールで構成されます。 • tk_def_ssy(Define Subsystem) • tk_ref_ssy(Refer Subsystem Status) January 31, 2014, CM81-00210-2a 201 第 3 章 システムコールインタフェース 3.11 サブシステム機能のシステムコール Su pp or t 3.11.1 So ft Manu al tk_def_ssy(Define Subsystem) サブシステムを定義または解除します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_def_ssy ( ID ssid, T_DSSY *pk_dssy ) ; typedef struct t_dssy { ATR ssyatr; PRI ssypri; FP svchdr; FP breakfn; FP startupfn; FP cleanupfn; FP eventfn; W resblksz; } T_DSSY; ■ パラメータ ● 入力 ssid サブシステム ID (Subsystem ID) pk_dssy サブシステム定義情報 (Packet of Define Subsystem) のパケット先頭 アドレス ● pk_dssy に設定するデータ ssyatr サブシステム属性 (Subsystem Attribute) ssypri サブシステム優先度 (Subsystem Priority) svchdr 拡張 SVC ハンドラアドレス (SVC Handler) breakfn ブレーク関数アドレス (Break Function) startupfn スタートアップ関数アドレス (Start-up Function) cleanupfn クリーンアップ関数アドレス (Clean-up Function) eventfn イベント処理関数アドレス (Event Function) resblksz リソース管理ブロックサイズ ( バイト数 ) (Resource Block Size) ● 出力 ercd 202 エラーコード (Error Code) CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.11 サブシステム機能のシステムコール Support Soft Ma nual ■ エラーコード E_OK 0 正常終了 E_RSATR -11 予約属性 ·ssyatr に未定義の値が指定された E_PAR -17 パラメータエラー ·ssypri が 1 より小さい,または最大サブシステム優先度より 大きい E_ID -18 不正 ID 番号 ·ssid が 10 より小さい , または最大サブシステム数より 大きい E_OBJ -41 ssid は既に定義済みである ·pk_dssy ≠ NULL の場合 E_NOEXS -42 ssid は定義されていない ·pk_dssy = NULL の場合 ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 ssid のサブシステムを定義または定義を削除します。 ほかのサブシステムと重複しないように 1 つのサブシステムに 1 つのサブシステム ID を割り当ててください。OS に自動割当ての機能はありません。 サブシステム ID は 1 ~ 9 が T-Kernel 用に予約されています。10 ~最大サブシステム 数(コンフィギュレータで設定した最大サブシステム数)が使用できる番号となります。 T-Kernelは,サブシステムの機能は , 拡張 SVC ハンドラの呼出し機能だけをサポートし ます。このため , t_dssy のパケットのデータのうち , svchdr 以外は T-Kernel との互換の ために用意されており , その値は無視されます。 svchdr は拡張 SVC ハンドラとして呼び出す関数の先頭アドレスを指定します。拡張 SVC ハンドラは , サブシステムの API となる部分で , システムコールと同様の方法で 呼び出せます。 拡張 SVC ハンドラは C 言語だけで記述可能で , 以下の形式となります。 INT shdr( VP pk_para, FN fncd ) { /* fncd により分岐して処理 */ return retcode; /* 拡張 SVC ハンドラの終了 */ } fncd は機能コードです。機能コードの下位 8 ビットにはサブシステム ID が入ります。 残りの上位ビットは , サブシステム側で任意に使用できます。通常は , サブシステム内 January 31, 2014, CM81-00210-2a 203 第 3 章 システムコールインタフェース 3.11 サブシステム機能のシステムコール Su pp or t So ft Manu al の機能コードとして使用します。ただし , 機能コードは正の値でなければならないた め , 最上位ビットは必ず 0 となります。 pk_para は呼出し側から渡されたパラメータをパケット形式にしたものです。パケット の形式は , サブシステム側で任意に決められます。一般的には , C 言語で関数に引数を 渡すときのスタックの形式と同じになります。これは , 多くの場合 , C 言語の構造体の 形式と同じです。 拡張SVC ハンドラからの復帰値は, そのまま呼出し元へ関数の復帰値として戻します。 原則として , 負の値をエラー値 , 0 または正の値を正常時の復帰値とします。 なお , 何らかの理由で拡張 SVC の呼出しに失敗した場合は , 拡張 SVC ハンドラは呼び 出されずに呼出し元には OS のエラーコード ( 負の値 ) を返すため , それと混同しない ようにしてください。 拡張 SVC ハンドラはタスク部から呼び出された場合 , 準タスク部として実行します。 タスク独立部からも呼出しが可能ですが , タスク独立部から呼び出された場合 , 拡張 SVC ハンドラもタスク独立部として実行します。 pk_dssy=NULL の場合 , ssid で指定されたサブシステムの定義を解除します。 204 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.11 サブシステム機能のシステムコール Support 3.11.2 Soft Ma nual tk_ref_ssy(Refer Subsystem Status) サブシステム定義情報を参照します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ref_ssy ( ID ssid, T_RSSY *pk_rssy ) ; typedef struct t_rssy { PRI ssypri; W resblksz; } T_RSSY; ■ パラメータ ● 入力 ssid サブシステム ID (Subsystem ID) pk_rssy サブシステム定義情報 (Packet of Refer Subsystem) ercd エラーコード (Error Code) ● 出力 ● pk_rssy に返されるデータ ssypri サブシステム優先度 (Subsystem Priority) resblksz リソース管理ブロックサイズ ( バイト数 ) (Resource Block Size) ■ エラーコード E_OK 0 正常終了 E_ID -18 不正 ID 番号 ·ssid が 10 より小さい , または 255 より大きい E_NOEXS -42 ssid は定義されていない。 ·ssid のサブシステムが定義されていない ■ ディスパッチ要因 本システムコールでディスパッチは起きません。 ■ 解説 ssid で指定された対象サブシステムの各種情報を参照します。 ssypri, resblksz は T-Kernel との互換性のために存在するメンバであり , T-REALOS は 使用しません。このため , これらの値は不定値となります。 pk_rssy が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 205 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t 3.12 So ft Manu al デバイス管理機能のシステムコール デバイス管理機能のシステムコールを説明します。 ■ デバイス管理機能のシステムコール デバイス管理機能は , 以下の 15 種類のシステムコールで構成されます。 • tk_def_dev(Define Device) • tk_ref_idv(Refer Initial Device Information) • tk_opn_dev(Open Device) • tk_cls_dev(Close Device) • tk_rea_dev(Read Device) • tk_srea_dev(Synchronous Read Device) • tk_wri_dev(Write Device) • tk_swri_dev(Synchronous Write Device) • tk_wai_dev(Wait Device) • tk_sus_dev(Suspend Device) • tk_get_dev(Get Device) • tk_ref_dev(Refer Device) • tk_oref_dev(Refer Device) • tk_lst_dev(List Device) • tk_evt_dev(Event Device) なお , 本節の内容をより理解するために ,「第 4 章 デバイスドライバ インタフェース」 もあわせてお読みください。 206 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support 3.12.1 Soft Ma nual tk_def_dev(Define Device) デバイスを登録または登録を削除します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID devid = tk_def_dev ( UB *devnm, T_DDEV *ddev, T_IDEV *idev ) ; typedef struct t_ddev { VP exinf; ATR drvatr; ATR devatr; INT nsub; W blksz; FP openfn; FP closefn; FP execfn; FP waitfn; FP abortfn; FP eventfn; } T_DDEV; typedef struct t_idev { ID evtmbfid; } T_IDEV; January 31, 2014, CM81-00210-2a 207 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t So ft Manu al ■ パラメータ ● 入力 devnm 物理デバイス名 (Device Name) ddev デバイス登録情報 (Packet of Define Device) ● ddev に設定するデータ exinf 拡張情報 drvatr ドライバ属性 (Driver Attribute) drvatr := [ TDA_OPENREQ ] 表 3.12-1 tk_def_dev の drvatr で指定できる定数マクロ 属性 値 TDA_OPENREQ 0x0001 意味 毎回オープン / クローズ devatr デバイス属性 (Device Attribute) nsub サブユニット数 ( Sub Unit No.) blksz デバイスのブロック数 (Block Size) openfn オープン関数エントリアドレス (Open Function) closefn クローズ関数エントリアドレス (Close Function) execfn 処理開始関数エントリアドレス (Execute Function) waitfn 完了待ち関数エントリアドレス (Wait Function) abortfn 中止処理関数エントリアドレス (Abort Function) eventfn イベント関数エントリアドレス (Event Function) ● 出力 devid デバイス ID (Device ID) またはエラーコード (Error Code) idev デバイス初期情報 (Initial Device Information) ● idev に返されるデータ evtmbfid 事象通知用メッセージバッファ ID ■ エラーコード E_LIMIT -34 デバイスの登録数がシステムの上限より大きい E_PAR -17 パラメータエラー ·devnm の長さが 0 または 8 より大きい ·nsub が負または 256 以上 E_NOEXS -42 devnm のデバイスは存在しない ·ddev が NULL ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。 208 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support Soft Ma nual ■ 解説 devnm のデバイス名でデバイスを登録します。devnm のデバイスが既に登録されてい るときには新しい登録情報で更新します。更新の場合はデバイス ID を変更しません。 ddev=NULL の場合 , devnm のデバイス登録を削除します。 T_DDEV には以下の値を指定します。 • exinf デバイス管理機能の API からデバイス処理関数 (openfn ~ eventfn) を呼び出したと きに , デバイス処理関数の引数としてデバイスドライバに渡します。デバイスドラ イバ側で任意に使用できます。 • drvatr ドライバ属性を指定します。 • devatr デバイス属性を指定します。デバイス属性の詳細は , 「第 4 章 デバイスドライバ インタフェース」を参照してください。 • nsub サブユニット数を指定します。サブユニットがないデバイスには 0 を指定します。 • blksz デバイスのブロックサイズをバイト数で指定します。通常は , このサイズがデバイ スの最小アクセスサイズとなります。 • openfn ~ eventfn デバイス処理関数のエントリアドレスを指定します。デバイス処理関数の詳細は , 「第 4 章 デバイスドライバ インタフェース」を参照してください。 evtmbfid にシステムデフォルトの事象通知用メッセージバッファ ID を返します。 idev=NULL とした場合 , デバイス初期情報を格納しません。システムデフォルトの事 象通知用メッセージバッファがない場合 , evtmbfid に 0 を設定します。 事象通知用メッセージバッファは , デバイスで発生した様々な事象 ( 例えば , メディア の挿入 , バッテリ異常など ) を上位プログラムに通知するために使用するメッセージ バッファの ID 番号です。デバイスの事象通知は , 「第 4 章 デバイスドライバ インタ フェース」を参照してください。 ddev, idev が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 209 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t 3.12.2 So ft Manu al tk_ref_idv(Refer Initial Device Information) デバイス初期情報を獲得します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_ref_idv ( T_IDEV *idev ) ; typedef struct t_idev { ID evtmbfid; } T_IDEV; ■ パラメータ ● 入力 idev デバイス初期情報を格納する領域のアドレス (Initial Device Information) ● 出力 ercd エラーコード (Error Code) ● idev に返されるデータ evtmbfid 事象通知用メッセージバッファ ID (Event Messagebuffer ID) ■ エラーコード E_OK 0 正常終了 ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。 ■ 解説 デバイス初期情報を獲得します。tk_def_dev システムコールで得られるものと同じ内容 です。 idev が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 210 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support 3.12.3 Soft Ma nual tk_opn_dev(Open Device) デバイスをオープンします。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID dd = tk_opn_dev ( UB *devnm, UINT omode ) ; ■ パラメータ ● 入力 devnm デバイス名 (Device Name) omode オープンモード (Open Mode) omode := (TD_READ ∥ TD_WRITE ∥ TD_UPDATE) | [TD_EXCL ∥ TD_WEXCL ∥ TD_REXCL] 表 3.12-2 tk_opn_dev の omode で指定できる定数マクロ モード 値 意味 TD_READ 0x0001 読出し専用 TD_WRITE 0x0002 書込み専用 TD_UPDATE 0x0003 読出しおよび書込み TD_EXCL 0x0100 排他 TD_WEXCL 0x0200 排他書込み TD_REXCL 0x0400 排他読出し ● 出力 dd デバイスディスクリプタ (Device Descriptor) またはエラーコード (Error Code) ■ エラーコード E_PAR -17 TD_READ, TD_WRITE, TD_UPDATE のいずれもが未設定または 未定義のモード E_BUSY -65 デバイスは使用中 · 排他オープン中 E_NOEXS -42 デバイスは存在しない E_LIMIT -34 オープン可能な最大数より大きい その他 デバイスドライバから返されたエラー January 31, 2014, CM81-00210-2a 211 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t So ft Manu al ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。また , デバイスドライバ にも依存します。 ■ 解説 devnm で指定されたデバイスを omode で指定されたモードでオープンします。また , デバイスへのアクセスを準備します。復帰値にデバイスディスクリプタを返します。 omode は以下の値を指定します。 • TD_READ, 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) に よる同時オープンを禁止します。 なお , 物理デバイスをオープンした場合 , その物理デバイスに属する論理デバイスをす べて同じモードでオープンしたのと同様に扱って排他オープンの処理を行います。 devnm が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 212 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support 3.12.4 Soft Ma nual tk_cls_dev(Close Device) デバイスをクローズします。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_cls_dev ( ID dd, UINT option ) ; ■ パラメータ ● 入力 dd デバイスディスクリプタ (Device Descriptor) option クローズオプション (Option) 表 3.12-3 tk_cls_dev の option で指定できる定数マクロ オプション TD_EJECT 値 0x0001 意味 クローズ時にメディア排出 ● 出力 ercd エラーコード (Error Code) ■ エラーコード E_OK 0 正常終了 E_ID -18 dd が不正 ·dd が 0 以下 · 最大デバイスオープン数より大きい · オープンされていない E_OACV -27 オープンしたタスクとは別のタスクからの要求 その他 デバイスドライバから返されたエラー ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。また , デバイスドライバ にも依存します。 ■ 解説 dd のデバイスディスクリプタをクローズします。処理中の要求があった場合 , その処 理を中止させてクローズします。 option に TD_EJECT が指定されていた場合 , 同一デバイスがほかのタスクからオープ ンされていないとメディアを排出します。ただし , メディアの排出ができないデバイス では無視します。また , 他のタスクからオープンされている場合 , TD_EJECT が指定さ れていてもメディアは排出しません。 January 31, 2014, CM81-00210-2a 213 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t 3.12.5 So ft Manu al tk_rea_dev(Read Device) デバイスの読出しを開始します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID reqid = tk_rea_dev ( ID dd, W start, VP buf, W size, TMO tmout ) ; ■ パラメータ ● 入力 dd デバイスディスクリプタ (Device Descriptor) start 読出し開始位置 ( ≧ 0: 固有データ , < 0: 属性データ ) (Start) buf 読み出したデータを格納するバッファ (Buffer) size 読み出すサイズ (Size) tmout 要求受付け待ちタイムアウト時間 (ms) (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロが指定可能 表 3.12-4 tk_cre_alm の almatr で指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 reqid リクエスト ID (Request ID) またはエラーコード (Error Code) ■ エラーコード E_ID -18 dd が不正 ·dd が 0 以下 · 最大デバイスオープン数より大きい · オープンされていない E_OACV -27 オープンモードが不正 ·TD_WRITE でオープンされている E_LIMIT -34 最大リクエスト数より大きい その他 デバイスドライバから返されたエラー 214 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support Soft Ma nual ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。また , デバイスドライバ にも依存します。 ■ 解説 デバイスから固有データまたは属性データの読出しを開始します。読出しを開始する だけで読出し完了を待たずに呼出し元へ復帰します。読出しが完了するまで buf を保 持してください。tk_wai_dev により読出し完了を待ちます。読出し開始のための処理 にかかる時間はデバイスドライバにより異なります。必ずしも即座に復帰するとは限 りません。 固有データの場合 , start および size の単位はデバイスごとに決められます。属性デー タの場合, start は属性データ番号, size はバイト数となり, start のデータ番号の属性デー タを読み出します。通常 , size は読み出す属性データのサイズ以上です。複数の属性 データを一度に読み出せません。size=0 が指定された場合 , 実際の読出しは行わずに現 時 点 で 読 出 し 可 能 な サ イ ズ を 調 べ ま す。size=0 で本システムコール呼出し後 , tk_wai_dev を呼び出すことにより , tk_wai_dev の復帰値 , asize に読出し可能なサイズを 設定します。 読出しまたは書込みの動作中である場合 , 新たな要求を受け付けられるか否かはデバ イスドライバによります。新たな要求を受け付けられない状態の場合 , 要求受付け待ち となります。要求受付け待ちのタイムアウト時間を tmout に指定します。 なお , タイムアウトするのは要求受付けまでです。要求が受け付けられた後にはタイム アウトしません。 January 31, 2014, CM81-00210-2a 215 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t 3.12.6 So ft Manu al tk_srea_dev(Synchronous Read Device) デバイスの同期読出しを行います。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_srea_dev ( ID dd, W start, VP buf, W size, W *asize ) ; ■ パラメータ ● 入力 dd デバイスディスクリプタ (Device Descriptor) start 読出し開始位置 ( ≧ 0: 固有データ , < 0: 属性データ ) (Start) buf 読み出したデータを格納するバッファ (Buffer) size 読み出すサイズ (Size) ercd エラーコード (Error Code) asize 読み出したサイズ (Size) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 dd が不正 ·dd が 0 以下 · 最大デバイスオープン数より大きい · オープンされていない E_OACV -27 オープンモードが不正 ·TD_WRITE でオープンされている E_LIMIT -34 最大リクエスト数より大きい その他 デバイスドライバから返されたエラー ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。デバイスドライバにも依 存します。 216 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support Soft Ma nual ■ 解説 デバイスデータの同期読出しを行います。本システムコールが正常に復帰した場合 , buf に指定されたアドレスを先頭として asize 分のデバイスデータを格納します。本シ ステムコールは以下の処理と同等です。 ER tk_srea_dev( ID dd, W start, VP buf, W size, W *asize ) { ER er, err, ioer; err = tk_rea_dev(dd, start, buf, size, TMO_FEVR); if ( err > 0 ) { err = tk_wai_dev(dd, er, asize, &ioer, TMO_FEVR); if ( err > 0 ) err = ioerr; } return err; } asize が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 217 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t 3.12.7 So ft Manu al tk_wri_dev(Write Device) デバイスの書込みを開始します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID reqid = tk_wri_dev ( ID dd, W start, VP buf, W size, TMO tmout ) ; ■ パラメータ ● 入力 dd デバイスディスクリプタ (Device Descriptor) start 書込み開始位置 ( ≧ 0: 固有データ , < 0: 属性データ ) (Start) buf 書き込むデータを格納するバッファ (Buffer) size 書き込むサイズ (Size) tmout 要求受付け待ちタイムアウト時間 (ms) (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロが指定可能 表 3.12-5 tk_wri_dev の tmout で指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 reqid リクエスト ID (Request ID) またはエラーコード (Error Code) ■ エラーコード E_ID -18 dd が不正 ·dd が 0 以下 · 最大デバイスオープン数より大きい · オープンされていない E_OACV -27 オープンモードが不正 ·TD_READ でオープンされている · オープンしたタスクと別のタスクからの要求 E_RONLY -67 書き込めないデバイス E_LIMIT -34 最大リクエスト数より大きい その他 デバイスドライバから返されたエラー 218 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support Soft Ma nual ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。また , デバイスドライバ にも依存します。 ■ 解説 デバイスへ固有データまたは属性データの書込みを開始します。書込みを開始するだ けで書込み完了を待たずに呼出し元へ復帰します。書込みが完了するまで buf を保持 してください。tk_wai_dev により書込み完了を待ちます。書込み開始のための処理に かかる時間はデバイスドライバにより異なります。必ずしも即座に復帰するとは限り ません。 固有データの場合 , start および size の単位はデバイスごとに決められます。属性デー タの場合, start は属性データ番号, size はバイト数となり, start のデータ番号の属性デー タに書き込みます。通常 , size は書き込む属性データのサイズと同じです。複数の属性 データを一度に書き込めません。size=0 が指定された場合 , 実際の書込みを行わずに現 時 点 で 書 込 み 可 能 な サ イ ズ を 調 べ ま す。size=0 で本システムコール呼出し後 , tk_wai_dev を呼び出すことにより , tk_wai_dev の復帰値 , asize に書込み可能なサイズを 設定します。 読出しまたは書込みの動作中である場合に新たな要求を受け付けられるか否かはデバ イスドライバによります。新たな要求を受け付けられない状態の場合 , 要求受付け待ち となります。要求受付け待ちのタイムアウト時間を tmout に指定します。tmout には TMO_POL(=0) または TMO_FEVR(=-1) も指定できます。 なお , タイムアウトするのは要求受付けまでです。要求が受け付けられた後にはタイム アウトしません。 January 31, 2014, CM81-00210-2a 219 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t 3.12.8 So ft Manu al tk_swri_dev(Synchronous Write Device) デバイスの同期書込みを行います。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ER ercd = tk_swri_dev ( ID dd, W start, VP buf, W size, W *asize ) ; ■ パラメータ ● 入力 dd デバイスディスクリプタ (Device Descriptor) start 書込み開始位置 ( ≧ 0: 固有データ , < 0: 属性データ ) (Start) buf 書き込むデータを格納したバッファ (Buffer) size 書き込むサイズ (Size) ercd エラーコード (Error Code) asize 書き込んだサイズ (Size) ● 出力 ■ エラーコード E_OK 0 正常終了 E_ID -18 dd が不正 ·dd が 0 以下 · 最大デバイスオープン数より大きい · オープンされていない E_OACV -27 オープンモードが不正 ·TD_READ でオープンされている E_RONLY -67 書き込めないデバイス E_LIMIT -34 最大リクエスト数より大きい その他 デバイスドライバから返されたエラー ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。また , デバイスドライバ にも依存します。 220 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support Soft Ma nual ■ 解説 デバイスの同期書込みを行います。以下の処理と同等です。 ER tk_swri_dev( ID dd, W start, VP buf, W size, W *asize ) { ER er, err, ioer; err = tk_wri_dev(dd, start, buf, size, TMO_FEVR); if ( err > 0 ) { err = tk_wai_dev(dd, er, asize, &ioer, TMO_FEVR); if ( err > 0 ) err = ioer; } return err; } asize が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 221 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t 3.12.9 So ft Manu al tk_wai_dev(Wait Device) デバイスの要求完了を待ちます。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID creqid = tk_wai_dev ( ID dd, ID reqid, W *asize, ER *ioer, TMO tmout ) ; ■ パラメータ ● 入力 dd デバイスディスクリプタ (Device Descriptor) reqid リクエスト ID (Request ID) tmout 要求受付け待ちタイムアウト時間 (ms) (Timeout) 0 から 0x7fffffff の数値 , および以下のマクロが指定可能 表 3.12-6 tk_wai_dev の tmout で指定できる定数マクロ 名前 値 意味 TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング ● 出力 creqid 完了したリクエスト ID (Request ID) またはエラーコード (Error Code) asize 読み出したサイズまたは書き込んだサイズ (Size) ioer 入出力エラー (IO Error) ■ エラーコード E_ID -18 dd が不正 ·dd が 0 以下 · 最大デバイスオープン数より大きい · オープンされていない ·reqid が負かシステムの上限値より大きい ·dd に対する要求ではない E_OACV -27 オープンしたタスクとは別のタスクからの要求 E_OBJ -41 reqid の要求はほかのタスクで完了待ちしている E_NOEXS -42 処理中の要求はない (reqid が 0 の場合 ) E_TMOUT -50 ポーリング失敗 , またはタイムアウト ·tmout の時間経過により待ち状態が解除された ·tmout が TMO_POL で , reqid の要求が完了していない。 その他 デバイスドライバから返されたエラー 222 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support Soft Ma nual ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。また , デバイスドライバ にも依存します。 ■ 解説 dd に対する reqid の要求の完了を待ちます。 reqid=0 の場合 , dd に対する要求のうちのいずれかが完了するのを待ちます。この場合 , tk_wai_dev 呼出し時点で処理中の要求だけが完了待ちの対象となります。本システム コールの呼出し後に要求された処理は完了待ちの対象外です。 複数の要求を同時に処理している場合 , その要求の完了順序は必ずしも要求した順序 ではなくデバイスドライバに依存します。ただし , 要求した順序で処理した場合と結 果が矛盾しない順序で処理することを保証します。例えば , ディスクからの読出しの 場合 , 以下の処理順序の変更が考えられます。 要求順ブロック番号 1 4 3 2 5 処理順ブロック番号 1 2 3 4 5 このように順序を入れ替えて処理することにより , シークや回転待ちを減らすことが でき , より効率的にディスクアクセスができます。 tmout に完了待ちのタイムアウト時間を指定します。タイムアウト (E_TMOUT) した場 合 , 要求された処理を継続中なので , 再度本システムコールにより完了を待つ必要があ ります。reqid>0 かつ tmout=TMO_FEVR の場合 , タイムアウトすることはなく , 必ず処 理が完了します。 要求された処理結果のエラー ( 入出力エラーなど ) を creqid ではなく ioer に格納しま す。creqid は , 要求の完了待ちが正しくできなかった場合 , エラーで復帰します。creqid にエラーが返された場合 , ioer の内容は不定値です。 表 3.12-7 tk_wai_dev の creqid と ioer の意味 creqid 意味 ioer 正の値 E_OK 待ち対象の処理が正常に完了しました。 正の値 エラー 待ち対象の処理がエラーで完了しました。処理エ ラー要因をエラーコードとして ioer に格納します。 負の値 不定 完了待ちが失敗しました。失敗した要因を creqid に エラーコードとして格納します。 また, creqidにエラーコードが返された場合, 処理を継続中なので, 再度本システムコー ルにより完了を待つ必要があります。 同じリクエスト ID に複数のタスクから同時に完了待ちできません。reqid=0 で待って いるタスクがあれば , 同じ dd に対する他のタスクの完了待ちは , E_OBJ のエラーとな ります。 同様に , reqid>0 で待っているタスクがあれば , 他のタスクで reqid=0 の完了待ちはでき ません。この場合も E_OBJ のエラーとなります。 asize, ioer が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 January 31, 2014, CM81-00210-2a 223 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t 3.12.10 So ft Manu al tk_sus_dev(Suspend Device) デバイスをサスペンドします。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース INT cnt = tk_sus_dev ( UINT mode ) ; ■ パラメータ ● 入力 モード (Mode) mode mode := ( (TD_SUSPEND | [TD_FORCE]) ∥ TD_DISSUS ∥ TD_ENASUS ∥ TD_CHECK) 表 3.12-8 tk_sus_dev の mode で指定できる定数マクロ モード 値 意味 TD_SUSPEND 0x0001 サスペンド TD_DISSUS 0x0002 サスペンドを禁止 TD_ENASUS 0x0003 サスペンドを許可 TD_CHECK 0x0004 サスペンド禁止要求カウント 獲得 TD_FORCE 0x8000 強制サスペンド指定 ● 出力 cnt サスペンド禁止要求カウント数 (Count) またはエラーコード (Error Code) ■ エラーコード E_PAR -17 モードが未定義 E_BUSY -65 サスペンド禁止中 E_QOVR -43 サスペンド禁止要求カウントオーバ ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。また , デバイスドライバ にも依存します。 224 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support Soft Ma nual ■ 解説 mode に従って処理を行って , その処理を行った後のサスペンド禁止要求カウント数を 復帰値に返します。 • TD_SUSPEND サスペンド サスペンド許可状態の場合 , サスペンドします。サスペンド禁止状態の場合 , E_BUSY を返します。 • TD_SUSPEND|TD_FORCE 強制サスペンド サスペンド禁止状態の場合 , サスペンドします。 • TD_DISSUS サスペンド禁止 サスペンドを禁止します。 • TD_ENASUS サスペンド許可 サスペンドを許可します。サスペンドを禁止した回数以上に許可した場合 , 何もし ません。 • TD_CHECK サスペンド禁止カウント獲得 サスペンド禁止要求を行っている回数の獲得だけを行います。 ■ 補足事項 サスペンドは , 以下の手順によって行います。 1. 各ディスクデバイス以外のサスペンド処理 2. 各ディスクデバイスのサスペンド処理 3. サスペンド状態へ移行 リジューム ( サスペンドからの復帰 ) は , 以下の手順によって行います。 1. サスペンド状態から復帰 2. 各ディスクデバイスのリジューム処理 3. 各ディスクデバイス以外のリジューム処理 サスペンド禁止は , その要求回数をカウントします。同じ回数だけサスペンド許可を要 求しないとサスペンドを許可しません。システム起動時はサスペンド許可 ( サスペン ド禁止要求カウント= 0) です。サスペンド禁止要求カウントはシステム全体で 1 つで す。サスペンド禁止要求カウントの上限は 2147483647(0x7fffffff) です。この上限より 大きい場合 , E_QOVR のエラーで復帰します。 January 31, 2014, CM81-00210-2a 225 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t 3.12.11 So ft Manu al tk_get_dev(Get Device) デバイス名を獲得します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID phyid = tk_get_dev ( ID devid, UB *devnm ) ; ■ パラメータ ● 入力 devid デバイス ID (Device ID) phyid 物理デバイスのデバイス ID (Physical Device ID) またはエラーコード ● 出力 (Error Code) devnm デバイス名 (Device Name) ■ エラーコード E_NOEXS -42 devid のデバイスは存在しない ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。 ■ 解説 devid で指定されたデバイス名を獲得して devnm に格納します。 devid は物理デバイスのデバイス ID または論理デバイスのデバイス ID です。devid が 物理デバイスの場合は devnm には物理デバイス名が格納され , 論理デバイスの場合は devnm には論理デバイス名を格納します。devnm には L_DEVNM(8)+1 バイト以上の領 域が必要です。 phyid には , devid のデバイスが属する物理デバイスのデバイス ID を返します。 devnm が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 226 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support 3.12.12 Soft Ma nual tk_ref_dev(Refer Device) デバイス名からデバイス情報を獲得します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID devid = tk_ref_dev ( UB *devnm, T_RDEV *rdev ) ; typedef struct t_rdev { ATR devatr; W blksz; INT nsub; INT subno; } T_RDEV; ■ パラメータ ● 入力 devnm デバイス名 (Device Name) rdev デバイス情報を格納する領域のアドレス (Packet of Refer Device) ● 出力 devid デバイス ID (Device ID) またはエラーコード (Error Code) ● rdev に返されるデータ devatr デバイス属性 (Device Attribute) blksz 固有データのブロックサイズ (-1: 不明 ) (Block Size) nsub サブユニット数 (Number of Sub-unit) subno 0: 物理デバイス , 1 ~ nsub: サブユニット番号 +1 (Sub-unit Number) ■ エラーコード E_NOEXS -42 devnm のデバイスは存在しない ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。 January 31, 2014, CM81-00210-2a 227 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t So ft Manu al ■ 解説 devnm で指定されたデバイス情報を獲得して rdev に格納します。rdev=NULL とした場 合 , デバイス情報を格納しません。 nsub は , devnm で指定されたデバイスが属する物理デバイスのサブユニット数です。 復帰値にデバイス ID を返します。 devnm, rdev が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 デバイス属性については , 「第 4 章 デバイスドライバ インタフェース」を参照してく ださい。 228 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support 3.12.13 Soft Ma nual tk_oref_dev(Refer Device) デバイスディスクリプタからデバイス情報を獲得します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース ID devid = tk_oref_dev ( ID dd, T_RDEV *rdev ) ; typedef struct t_rdev { ATR devatr; W blksz; INT nsub; INT subno; } T_RDEV; ■ パラメータ ● 入力 dd デバイスディスクリプタ (Device Descriptor) rdev デバイス情報を格納する領域のアドレス (Packet of Refer Device) ● 出力 devid デバイス ID (Device ID) またはエラーコード (Error Code) ● rdev に返されるデータ devatr デバイス属性 (Device Attribute) blksz 固有データのブロックサイズ (-1: 不明 ) (Block Size) nsub サブユニット数 (Number of Sub-unit) subno 0: 物理デバイス , 1 ~ nsub: サブユニット番号 +1 (Sub-unit Number) ■ エラーコード E_OACV -27 オープンしたタスクとは別のタスクからの要求 ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。 January 31, 2014, CM81-00210-2a 229 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t So ft Manu al ■ 解説 dd で指定されたデバイス情報を獲得して rdev に格納します。rdev=NULL とした場合 , デバイス情報を格納しません。 nsub は , dd で指定されたデバイスが属する物理デバイスのサブユニット数です。 復帰値にデバイス ID を返します。 rdev が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 デバイス属性については , 「第 4 章 デバイスドライバ インタフェース」を参照してく ださい。 230 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support 3.12.14 Soft Ma nual tk_lst_dev(List Device) 登録済みデバイスの一覧を獲得します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース INT cnt = tk_lst_dev ( T_LDEV *ldev, INT start, INT ndev ) ; typedef struct t_ldev { ATR devatr; W blksz; INT nsub; UB devnm[L_DEVNM]; } T_LDEV; ■ パラメータ ● 入力 ldev 登録デバイス情報の格納領域 ( 配列 ) (Packet of List Device) start 開始番号 (Start) ndev 獲得数 (Number of Device) cnt 残りのカウント数 (Count) ● 出力 またはエラーコード (Error Code) ● ldev に返されるデータ devatr デバイス属性 (Device Attribute) blksz 固有データのブロックサイズ (-1: 不明 ) (Block Size) nsub サブユニット数 (Number of Sub-unit) devnm[L_DEVNM] 物理デバイス名 (Device Name) ■ エラーコード E_NOEXS -42 獲得すべき情報がない ·start が登録済みのデバイスの個数以上 E_PAR -17 start または ndev が負 ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。 January 31, 2014, CM81-00210-2a 231 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t So ft Manu al ■ 解説 登録済みのデバイスの情報を獲得します。 登録デバイスは物理デバイス単位で管理します。したがって , 登録デバイス情報も物理 デバイス単位で獲得します。 登録デバイスの数が N の場合 , 登録デバイスに 0 ~ N-1 の連番を振ります。この連番 に従って , start 番目から ndev 個の登録情報を獲得して ldev に格納します。ldev には ndev 個の情報を格納するために十分な大きさが必要です。 復帰値には残りのカウント数 (N - start) を返します。残りカウント数が ndev 個に満た ない場合 , 残りのすべてを格納します。復帰値≦ ndev の場合 , すべての登録情報が獲 得できたことを示します。 なお , この連番はデバイスの登録・抹消があると変化します。したがって , 複数回に分 けて獲得すると , 正確な情報が得られない場合があります。 例えば , 10 個のデバイスが登録されている状態で 3 個ずつ登録情報を獲得する場合 , start を 0 → 3 → 6 → 9 と変化させて本システムコールを 4 回呼び出すことにより , すべ てのデバイスの登録情報を獲得できます。本システムコールの 1 回目の呼出しから 4 回目の呼出しの間にデバイスの登録 , 削除を行った場合 , 正確な情報が得られない可能 性があります。この場合 , 再度 start に 0 を指定して , 最初からデバイス情報の獲得をや り直してください。 ldev が不正な場合でも , エラーチェックを行わず , 動作は保証されません。 232 CM81-00210-2a, January 31, 2014 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Support 3.12.15 Soft Ma nual tk_evt_dev(Event Device) デバイスにドライバ要求イベントを送信します。 タスク部 ○ タスク独立部 ○ ディスパッチ禁止状態 ○ ■ C 言語インタフェース INT retval = tk_evt_dev ( ID devid, INT evttyp, VP evtinf ) ; ■ パラメータ ● 入力 devid イベント送信先デバイス ID (Device ID) evttyp ドライバ要求イベントタイプ (Event Type) 表 3.12-9 tk_evt_dev の evttyp で指定できる定数マクロ イベント 値 意味 TDV_CARDEVT 1 PC カードイベント TDV_USBEVT 2 USB イベント evtinf イベントタイプ別の情報 (Event Information) retval デバイスドライバからの復帰値 (Return Value) ● 出力 またはエラーコード (Error Code) ■ エラーコード E_NOEXS -42 devid のデバイスは存在しない E_PAR -17 デバイス管理内部イベント (evttyp < 0) ■ ディスパッチ要因 他タスクがデバイス管理機能の API を呼び出して待ち状態の場合 , それが完了するま で待ち状態となり , ディスパッチが発生する場合があります。 ■ 解説 devid のデバイス ( デバイスドライバ ) にドライバ要求イベントを送信します。 各イベントタイプの詳細は , 「T-Kernel 標準デバイスドライバ仕様書」を参照してくだ さい ( 本仕様書は T-Engine フォーラムのホームページから無料でダウンロードできま す )。 January 31, 2014, CM81-00210-2a 233 第 3 章 システムコールインタフェース 3.12 デバイス管理機能のシステムコール Su pp or t 234 So ft Manu al CM81-00210-2a, January 31, 2014 Support Soft Ma nual 第4章 デバイスドライバ インタフェース デバイスドライバインタフェースを説明します。 4.1 デバイスドライバインタフェース 4.2 デバイス名 4.3 デバイス ID 4.4 デバイスディスクリプタ 4.5 リクエスト ID 4.6 データ番号 4.7 属性データ 4.8 事象通知 4.9 デバイスのサスペンド / リジューム 4.10 入出力要求のデータ形式 4.11 デバイス処理関数 January 31, 2014, CM81-00210-2a 235 第 4 章 デバイスドライバ インタフェース 4.1 デバイスドライバインタフェース Su pp or t 4.1 So ft Manu al デバイスドライバインタフェース カーネルとデバイスドライバ間のインタフェースを説明します。 ■ デバイスドライバインタフェース デバイスドライバインタフェースは , T-REALOS のデバイス管理機能とユーザプログ ラムのデバイスドライバ間のインタフェースです。 ユーザプログラムは T-REALOS のデバイス管理機能を利用して , デバイスドライバの 各種機能を使用します。ユーザプログラム-デバイスドライバ間のインタフェースを 統一することで , デバイスへのアクセスを単純化し , デバイスドライバの移植性を向上 させることができます。 デバイスドライバインタフェースは以下の内容で構成されます。 • デバイス名 • デバイス ID • デバイス属性 • デバイスディスクリプタ • リクエスト ID • データ番号 • 事象通知 • デバイスのサスペンド / リジューム処理 • デバイスへの入出力処理要求のデータ形式 • デバイス処理関数 236 CM81-00210-2a, January 31, 2014 第 4 章 デバイスドライバ インタフェース 4.2 デバイス名 Support 4.2 Soft Ma nual デバイス名 デバイス名を説明します。 ■ デバイス名 デバイス名は最大 8 文字の文字列で , 以下の要素により構成されます。 種別 : デバイスの種別を示す名前です。使用可能な文字は a ~ z , A ~ Z です。 ユニット : 物理的なデバイスを示す番号です。使用可能な文字は a ~ z です。1 文 字で指定します。ユニットごとに a から順に割り当てます。 サブユニット: 論理的なデバイスを示す番号です。使用可能な文字は 0 ~ 254 の数字 で最大 3 文字です。サブユニットごとに 0 から順に割り当てます。 デバイス名は , 種別+ユニット+サブユニットの形式で表しますが , ユニット , サブユ ニットはデバイスによっては存在しない場合もあります。その場合 , それぞれのフィー ルドは存在しません。 特に , 種別+ユニットの形式を物理デバイス名とよびます。また , 種別+ユニット+サ ブユニットを論理デバイス名とよび , 物理デバイス名と区別します。サブユニットがな い場合 , 物理デバイス名と論理デバイス名は同じになります。単にデバイス名といった ときは論理デバイス名を指します。 サブユニットは , 一般的にはハードディスクの区画 ( パーティション ) を表しますが , そ れ以外でも論理的なデバイスを表すために使用できます。 (例) had ハードディスク ( ディスク全体 ) hda0 ハードディスク ( 先頭の区画 ) fda フロッピィディスク rsa シリアルポート kbpd キーボード / ポインティングデバイス January 31, 2014, CM81-00210-2a 237 第 4 章 デバイスドライバ インタフェース 4.3 デバイス ID Su pp or t 4.3 So ft Manu al デバイス ID デバイス ID を説明します。 ■ デバイス ID デバイス ( デバイスドライバ ) を T-Kernel に登録することにより , デバイス ( 物理デ バイス名 ) にデバイス ID (>0) が割り当てられます。デバイス ID は物理デバイスごと に割り当てられて , 論理デバイスのデバイス ID は物理デバイスに割り当てられたデバ イス ID にサブユニット番号 +1(1 ~ 255) を加えたものとなります。 devid: 登録時に割り当てられたデバイス ID devid 物理デバイス devid+n+1 n 番目のサブユニット ( 論理デバイス ) (例) hdadevid ハードディスク全体 hda0 devid + 1 ハードディスクの先頭の区画 hda1 devid + 2 ハードディスクの 2 番目の区画 ■ デバイス属性 各デバイスの特長を表してデバイスの種類分けを行うため , デバイス属性を以下のよ うに定義します。 IIII IIII IIII IIII PRxx xxxx KKKK KKKK 上位 16 ビットは , デバイス依存属性でデバイスごとに定義します。デバイスドライバ を作成するユーザで自由に決めることができます。 下位 16 ビットは標準属性で , 以下の情報を持ちます。 • 共通属性 (bit15 ~ bit8) 表 4.3-1 共通属性の定数マクロ 名前 238 値 意味 TD_PROTECT 0x8000 P: 書込み禁止 TD_REMOVABLE 0x4000 R: メディアの取外し可能 CM81-00210-2a, January 31, 2014 第 4 章 デバイスドライバ インタフェース 4.3 デバイス ID Support Soft Ma nual • デバイスタイプ (bit7 ~ bit4) およびメディア種別 (bit3 ~ bit0) 表 4.3-2 デバイスタイプおよびメディア種別の定数マクロ 名前 値 意味 TD_DEVKIND 0x00FF K: デバイスタイプ / メディア種別 TD_DEVTYPE 0x00f0 デバイスタイプ TDK_UNDEF 0x0000 未定義 / 不明 TDK_DISK 0x0010 ディスクデバイス TDK_DISK_UNDEF 0x0010 その他のディスク TDK_DISK_RAM 0x0011 RAM ディスク ( 主メモリ使用 ) TDK_DISK_ROM 0x0012 ROM ディスク ( 主メモリ使用 ) TDK_DISK_FLA 0x0013 Flash ROM , その他のシリコンディスク TDK_DISK_FD 0x0014 フロッピィディスク TDK_DISK_HD 0x0015 ハードディスク TDK_DISK_CDROM 0x0016 CD-ROM 上記以外のデバイスタイプは , 現在未定義ですが , 将来的には新たなデバイスが追加で 定義される予定です。未定義のデバイスは未定義 TDK_UNDEF とします。 なお , デバイスタイプは , アプリケーションがデバイス / メディアの種類によって処理 内容を変える必要がある場合など , デバイスを使用する側で区別が必要となる場合に 定義します。特に明確な区別をする必要がないデバイスに関しては , デバイスタイプを 割り当てる必要はありません。 January 31, 2014, CM81-00210-2a 239 第 4 章 デバイスドライバ インタフェース 4.4 デバイスディスクリプタ Su pp or t 4.4 So ft Manu al デバイスディスクリプタ デバイスディスクリプタを説明します。 ■ デバイスディスクリプタ デバイスをアクセスするための識別子で , デバイスをオープンしたときにカーネル に よりデバイスディスクリプタ (>0) が割り当てられます。 240 CM81-00210-2a, January 31, 2014 第 4 章 デバイスドライバ インタフェース 4.5 リクエスト ID Support 4.5 Soft Ma nual リクエスト ID リクエスト ID を説明します。 ■ リクエスト ID デバイスに入出力を要求したときに , その要求の識別子としてリクエスト ID(>0) が割 り当てられます。このリクエスト ID により入出力の完了を待てます。 January 31, 2014, CM81-00210-2a 241 第 4 章 デバイスドライバ インタフェース 4.6 データ番号 Su pp or t 4.6 So ft Manu al データ番号 データ番号を説明します。 ■ データ番号 デバイスのデータはデータ番号により指定します。データ番号は以下の 2 種類に分類 されます。 • 固有データ:データ番号≧ 0 デバイス固有のデータで , データ番号はデバイスごとに定義します。 ( 例 ) ディスク シリアル回線 データ番号=物理ブロック番号 データ番号は 0 だけを使用 • 属性データ:データ番号< 0 ドライバやデバイスの状態の獲得や設定 , 特殊機能などを指定します。 データ番号のいくつかは共通で定義されていますが , デバイス独自にも定義できま す。 242 CM81-00210-2a, January 31, 2014 第 4 章 デバイスドライバ インタフェース 4.7 属性データ Support 4.7 Soft Ma nual 属性データ 属性データを説明します。 ■ 属性データ 属性データは , 以下の 3 種類に分類されます。 • 共通属性 すべてのデバイス ( デバイスドライバ ) に共通に定義する属性。 • デバイス種別属性 同じ種類に分類されるデバイス ( デバイスドライバ ) に共通に定義する属性。 • デバイス個別属性 各デバイス ( デバイスドライバ ) ごとに独自に定義した属性。 デバイス種別属性およびデバイス個別属性は , デバイスごとに定義します。デバイスド ライバを作成するユーザで自由に決めることができます。 共通属性の属性データ番号は -1 ~ -99 の範囲となります。共通属性のデータ番号はす べてのデバイスで共通となりますが , すべてのデバイスが必ずしもすべての共通属性 に対応しているとは限りません。入出力要求パケット , devreq(「4.10 入出力要求のデー タ形式」参照 ) の start に未対応の共通属性データ番号が指定された場合 , デバイスド ライバは E_PAR のエラーで復帰してください。 表 4.7-1 共通属性と属性データ番号の意味 共通属性 属性データ番号 意味 TDN_EVENT -1 RW: 事象通知用メッセージバッファ ID TDN_DISKINFO -2 R-: ディスク情報 TDN_DISPSPEC -3 R-: 表示デバイス仕様 RW: 読出し (tk_rea_dev)/ 書込み (tk_wri_dev) 可能 R- : 読出し (tk_rea_dev) だけ可能 以下に , 共通属性で取得可能な属性データの形式を示します。 ● TDN_EVENT : 事象通知用メッセージバッファ ID データ形式 :ID デバイス登録時にシステムデフォルトのメッセージバッファ ID がユーザプログラ ムに通知されます。ユーザプログラムは , このメッセージバッファ ID をデバイスド ライバに通知するために , start=TDN_EVENT, buf の内容 = メッセージバッファ ID で , tk_wri_dev または tk_swri_dev を呼び出してください。 メッセージバッファ ID=0 を設定した場合 , デバイスは事象通知を行いません。 January 31, 2014, CM81-00210-2a 243 第 4 章 デバイスドライバ インタフェース 4.7 属性データ Su pp or t So ft Manu al ● TDN_DISKINFO : ディスク情報 データ形式 DiskInfo typedef enum { DiskFmt_STD = 0, /* 標準 (HD など ) */ DiskFmt_2DD = 1, /* 2DD 720KB */ DiskFmt_2HD = 2, /* 2HD 1.44MB */ DiskFmt_CDROM = 4, /* CD-ROM 640MB */ } DiskFormat; typedef struct { DiskFormat format; /* フォーマット形式 */ UW protect:1; /* プロテクト状態 */ UW removable:1; /* 取外し可否 */ UW rsv:30; /* 予約 ( 常に 0) */ W blocksize; /* ブロックバイト数 */ W blockcount; /* 総ブロック数 */ } DiskInfo; ● TDN_DISPSPEC : 表示デバイス仕様 データ形式 DEV_SPEC typedef struct { H attr; /* デバイス属性 */ H planes; /* プレーン数 */ H pixbits; /* ピクセルビット数 ( 境界 / 有効 ) */ H hpixels; /* 横のピクセル数 */ H vpixels; /* 縦のピクセル数 */ H hres; /* 横の解像度 */ H vres; /* 縦の解像度 */ H color[4]; /* カラー情報 */ H resv[6]; /* 予約 */ } DEV_SPEC; 244 CM81-00210-2a, January 31, 2014 第 4 章 デバイスドライバ インタフェース 4.8 事象通知 Support 4.8 Soft Ma nual 事象通知 事象通知を説明します。 ■ 事象通知 デバイスドライバは , デバイスで発生した事象を事象通知用メッセージバッファ (TDN_EVENT) にデバイス事象通知として送信してください。 事象タイプには以下のものがあります。 typedef enum tdevttyp { TDE_unknown = 0, /* 未定義 */ TDE_MOUNT = 0x01, /* メディア挿入 */ TDE_EJECT = 0x02, /* メディア排出 */ TDE_ILLMOUNT = 0x03, /* メディア不正挿入 */ TDE_ILLEJECT = 0x04, /* メディア不正排出 */ TDE_REMOUNT = 0x05, /* メディア再挿入 */ TDE_CARDBATLOW = 0x06, /* カードバッテリ残量警告 */ TDE_CARDBATFAIL = 0x07, /* カードバッテリ異常 */ TDE_REQEJECT = 0x08, /* メディア排出要求 */ TDE_PDBUT = 0x11, /* PD ボタン状態の変化 */ TDE_PDMOVE = 0x12, /* PD 位置移動 */ TDE_PDSTATE = 0x13, /* PD の状態変化 */ TDE_PDEXT = 0x14, /* PD 拡張事象 */ TDE_KEYDOWN = 0x21, /* キーダウン */ TDE_KEYUP = 0x22, /* キーアップ */ TDE_KEYMETA = 0x23, /* メタキー状態の変化 */ TDE_POWEROFF = 0x31, /* 電源スイッチオフ */ TDE_POWERLOW = 0x32, /* 電源残量警告 */ TDE_POWERFAIL = 0x33, /* 電源異常 */ TDE_POWERSUS = 0x34, /* 自動サスペンド */ TDE_POWERUPTM = 0x35, /* 時計更新 */ TDE_CKPWON = 0x41 /* 自動電源オン通知 */ } TDEvtTyp; デバイス事象通知の形式は以下のようになります。事象通知の内容は事象タイプごと に異なり , サイズも異なります。 typedef struct t_devevt { TDEvtTyp evttyp; January 31, 2014, CM81-00210-2a /* 事象タイプ */ 245 第 4 章 デバイスドライバ インタフェース 4.8 事象通知 Su pp or t So ft Manu al /* 以下に事象タイプ別の情報を付加する */ } T_DEVEVT; デバイス ID 付きのデバイス事象通知の形式は以下のようになります。 typedef struct t_devevt_id { TDEvtTyp evttyp; /* 事象タイプ */ ID devid; /* デバイス ID */ /* 以下に事象タイプ別の情報を付加する */ } T_DEVEVT_ID; 事象通知用メッセージバッファが一杯で事象通知を送信できない場合 , その事象が通 知されないことで , 事象通知の受信側の動作に悪影響が出ないようにしてください。 メッセージバッファが空くまで待ってから事象通知を行ってもかまいませんが , その 場合も原則として事象通知以外のデバイスドライバの処理が滞ってはいけません。 なお , 事象通知の受信側は , できる限りメッセージバッファが溢れないように処理して ください。 246 CM81-00210-2a, January 31, 2014 第 4 章 デバイスドライバ インタフェース 4.9 デバイスのサスペンド / リジューム Support 4.9 Soft Ma nual デバイスのサスペンド / リジューム デバイスのサスペンド / リジュームを説明します。 ■ デバイスのサスペンド / リジューム イベント関数 (eventfn) へのサスペンド / リジューム (TDV_SUSPEND/TDV_RESUME) イベントの呼出しにより , 各デバイスドライバはデバイスのサスペンド / リジューム処 理を行います。サスペンド / リジュームイベントは物理デバイスだけを呼び出します。 ● サスペンド (TDV_SUSPEND) evttyp = TDV_SUSPEND evtinf = NULL ( なし ) 以下の手順でサスペンド処理を行います。 1. 現在処理中の要求がある場合 , 完了するまで待つか , 中断または中止します。どの 方法を選択するかはデバイスドライバの実装に依存します。ただし , できるだけ速 やかにサスペンドする必要があるため , 完了までに時間がかかる場合 , 中断または 中止してください。サスペンドイベントは物理デバイスだけに発行しますが , その デバイスに含まれるすべての論理デバイスも同様に処理します。 中断 : 処理を一時的に中断してリジューム後に続きを行います。 中止 : 中止処理関数 (abortfn) による中止と同様に処理を中止します。リジューム 後も再開しません。 2. リジュームイベント以外の新たな要求を受け付けないようにします。 3. デバイスの電源を切るなどのサスペンド処理を行います。中止はアプリケーション への影響が大きいと考えられるため , 極力避けてください。シリアル回線からの長 期の入力待ちなどで , かつ中断とするのが難しい場合以外は中止にせず終了まで待 つか , 可能な場合は中断します。サスペンド期間中にデバイスドライバへ来た要求 は , リジュームまで待たせてリジューム後に受付け処理します。ただし , デバイス へのアクセスを伴わない処理などはサスペンド中でも受付け可能です。 ● リジューム (TDV_RESUME) evttyp = TDV_RESUME evtinf = NULL ( なし ) 以下の手順でリジューム処理を行います。 1. デバイスの電源を入れてデバイスの状態を復帰させるなどのリジューム処理を行 います。 2. 中断していた処理がある場合は再開します。 3. 要求受付けを再開します。 January 31, 2014, CM81-00210-2a 247 第 4 章 デバイスドライバ インタフェース 4.10 入出力要求のデータ形式 Su pp or t 4.10 So ft Manu al 入出力要求のデータ形式 入出力要求のデータ形式を説明します。 ■ 入出力要求のデータ形式 デバイスドライバへの入出力要求は , リクエスト ID に対応した以下の要求パケットに より行います。 typedef struct t_devreq { struct t_devreq *next; /* I: 要求パケットのリンク (NULL: 終端 ) */ VP exinf; /* X: 拡張情報 */ ID devid; /* I: 対象デバイス ID */ INT cmd:4; /* I: 要求コマンド */ BOOL abort:1; /* I: 中止要求を行ったとき TRUE */ W start; /* I: 開始データ番号 */ W size; /* I: 要求サイズ */ VP buf; /* I: 入出力バッファアドレス */ W asize; /* O: 結果サイズ */ ER error; /* O: 結果エラー */ } T_DEVREQ; コメント内の I は入力パラメータ , O は出力パラメータ , X はデバイス管理機能で未参 照のパラメータで , 入力パラメータはデバイスドライバで変更できません。入力パラ メータ (I) 以外は , デバイス管理機能が最初に 0 にクリアします。その後 , デバイス管 理機能は変更しません。 next は , 要求パケットをリンクするために使用します。デバイス管理機能内の要求パ ケットの管理に使用するほか , 完了待ち関数 (waitfn), 中止処理関数 (abortfn) でも使用 します。 exinf はデバイスドライバ側で任意に使用できます。デバイス管理機能は内容には関知 しません。 devid は要求対象のデバイス ID を指定します。 cmd は要求コマンドを指定します。 cmd := (TDC_READ || TDC_WRITE) 表 4.10-1 要求コマンドの定数マクロ cmd 値 意味 TDC_READ 1 読出し要求 TDC_WRITE 2 書込み要求 aabort に TRUE が設定されている場合 , 中止処理が要求されたことを示します。TRUE 248 CM81-00210-2a, January 31, 2014 第 4 章 デバイスドライバ インタフェース 4.10 入出力要求のデータ形式 Support Soft Ma nual が設定される条件は以下のとおりです。 • デバイスがクローズされた場合。 start, size は , tk_rea_dev, tk_wri_dev で指定された start, size をそのまま設定します。 buf は , tk_rea_dev, tk_wri_dev で指定された buf をそのまま設定します。 asize は , tk_wai_dev の asize に返す値をデバイスドライバが設定します。 error は , tk_wai_dev の復帰値として返すエラーコードをデバイスドライバが設定しま す。正常な場合 , E_OK を設定します。 January 31, 2014, CM81-00210-2a 249 第 4 章 デバイスドライバ インタフェース 4.11 デバイス処理関数 Su pp or t 4.11 So ft Manu al デバイス処理関数 デバイス処理関数を説明します。 ■ デバイス処理関数 これらの処理関数をデバイス管理機能によって呼び出します。これらの処理関数は , 再 入可能 (reentrant) な構造で作成してください。また , 処理関数を排他的に呼び出すこと は保証しません。例えば , 複数のタスクから同じデバイスに同時に要求があった場合 , そ れぞれのタスクが同時に処理関数を呼び出すことがあります。このため , デバイスドラ イバ側は , 必要に応じて排他制御を行ってください。 また , デバイスドライバが返すエラーコードは , 「付録 A エラーコード一覧 」から , 適切なエラーコードを選択し , 返してください。 ● オープン関数 (openfn) <呼出しインタフェース> ER ercd = openfn( ID devid, UINT omode, VP exinf ) <パラメータ> 【入力】 devid オープンするデバイスのデバイス ID omode オープンモード (tk_opn_dev と同じ ) exinf デバイス登録時に指定された拡張情報 【出力】 ercd エラーコード <解説> tk_opn_dev が呼び出されたときに openfn を呼び出します。 openfn は , デバイスの使用開始のための処理を行います。処理内容はデバイスに依存 し , デバイスに合わせて自由に処理できます。必要な処理がない場合 , 何も処理する必 要はありません。また , オープンされているか否かをデバイスドライバで記憶する必要 もなく , オープンされていない (openfn が呼び出されていない ) 理由だけで , ほかの処 理関数が呼び出されたときエラーにする必要もありません。デバイスドライバの動作 に問題ない場合 , オープンされていない状態でほかの処理関数が呼び出されても要求 を処理できます。 openfn でデバイスの初期化などを行う場合でも , 原則として待ちを伴う処理は行わな いでください。できる限り速やかに処理を行って openfn から復帰してください。例え ば , シリアル回線のように通信モードを設定する必要があるデバイスは , tk_wri_dev に より通信モードが設定されたときにデバイスを初期化できます。このため , openfn で デバイスの初期化を行う必要はありません。 同じデバイスが多重オープンされた場合 , 通常は最初のオープン時だけを呼び出しま すが , デバイス登録時にドライバ属性として TDA_OPENREQ が指定された場合 , すべ 250 CM81-00210-2a, January 31, 2014 第 4 章 デバイスドライバ インタフェース 4.11 デバイス処理関数 Support Soft Ma nual てのオープン時に呼び出します。多重オープンやオープンモードに関する処理はデバ イス管理機能で行うため , openfn でそれらに関する処理は特に必要ありません。omode も参考情報として渡すだけで , omode に関する処理を行う必要はありません。 ● クローズ関数 (closefn) <呼出しインタフェース> ER ercd = closefn( ID devid, UINT option, VP exinf ) <パラメータ> 【入力】 devid クローズするデバイスのデバイス ID option クローズオプション (tk_cls_dev と同じ ) exinf デバイス登録時に指定された拡張情報 【出力】 ercd エラーコード <解説> tk_cls_dev が呼び出されたときに closefn を呼び出します。 closefn は , デバイスの使用終了のための処理を行います。処理内容はデバイスに依存 し , デバイスに合わせて自由に処理できます。必要な処理がない場合 , 何も処理する必 要はありません。 メディアの取外しが可能なデバイスの場合 , option に TD_EJECT が指定されている場 合 , メディアの排出を行います。 closefn でデバイスの終了処理やメディアの排出を行う場合でも , 待ちを伴う処理は原 則として行わないでください。できる限り速やかに処理を行って closefn から復帰して ください。メディアの排出に時間がかかる場合 , 排出の完了を待たずに closefn から復 帰しても構いません。 同じデバイスが多重オープンされていた場合 , 通常は最後のクローズ時だけを呼び出 しますが , デバイス登録時にドライバ属性として TDA_OPENREQ が指定された場合 , す べてのクローズ時に呼び出します。ただし , この場合も最後のクローズにしか option に TDA_EJECT を指定することはありません。多重オープンやオープンモードに関する処 理はデバイス管理機能で行うため , closefn でそれらに関する処理は特に必要ありませ ん。 January 31, 2014, CM81-00210-2a 251 第 4 章 デバイスドライバ インタフェース 4.11 デバイス処理関数 Su pp or t So ft Manu al ● 処理開始関数 (execfn) <呼出しインタフェース> ER ercd = execfn( T_DEVREQ *devreq, TMO tmout, VP exinf ) <パラメータ> 【入力】 devreq 要求パケット tmout 要求受付け待ちタイムアウト時間 (ms) exinf デバイス登録時に指定された拡張情報 【出力】 ercd エラーコード <解説> tk_rea_dev, tk_srea_dev, tk_wri_dev, または tk_swri_dev が呼び出されたときに execfn を 呼び出します。 execfn は , devreq の要求の処理を開始します。処理を開始するだけで完了を待たずに呼 出し元へ復帰します。処理開始のためにかかる時間はデバイスドライバに依存し , 必ず しも即座に完了するとは限りません。 新たな要求を受け付けられない状態の場合 , 要求受付け待ちとなります。tmout に指定 された時間以内に新たな要求を受け付けられないとタイムアウトの処理を行います。 tmout には , TMO_POL(= 0) または TMO_FEVR(= -1) を指定することもできます。タイ ムアウトした場合 , execfn の復帰値に E_TMOUT を返します。要求パケットの error は 変更しません。タイムアウトの処理を行うのは要求を受け付けるまでで , 要求を受け付 けた後にタイムアウトは発生しません。 execfn の復帰値にエラーを返した場合 , 要求が受け付けられなかったものとして要求 パケットは消滅します。デバイスドライバ側の理由で本関数の処理を中止する場合 , そ の要求の受付け前 ( 処理開始前 ) であれば execfn の復帰値に E_ABORT を返します。こ の場合 , 要求パケットは消滅します。要求受付け後 ( 処理開始後 ) の場合 , E_OK を返 します。この場合 , 要求パケットは waitfn を実行して処理完了を確認するまで消滅し ません。 252 CM81-00210-2a, January 31, 2014 第 4 章 デバイスドライバ インタフェース 4.11 デバイス処理関数 Support Soft Ma nual ● 完了待ち関数 (waitfn) <呼出しインタフェース> INT pktno = waitfn( T_DEVREQ *devreq, INT nreq, TMO tmout, VP exinf) <パラメータ> 【入力】 devreq 要求パケットのリスト nreq 要求パケットの数 tmout タイムアウト時間 (ms) exinf デバイス登録時に指定された拡張情報 【出力】 pktno 完了した要求パケットの番号またはエラーコード <解説> tk_srea_dev, tk_swri_devまたはtk_wai_devが呼び出されたときにwaitfn を呼び出します。 devreq は devreq->next で接続された要求パケットのリストの中で , devreq から nreq 個 分の要求パケットのうち , いずれかが完了するのを待ちます。リストの最後の next は 必ずしも NULL になっているとは限らないため , 必ず nreq の指定に従います。復帰値 に完了した要求パケットの番号 (devreq から何番目か ) を返します。最初が 0 番目で最 後が nreq-1 番目となります。 なお , 完了とは , 正常終了 / 異常 ( エラー ) 終了 / 中止のいずれかです。 tmout に完了待ちのタイムアウト時間を指定します。TMO_POL (=0) または TMO_FEVR (= -1) を指定することもできます。タイムアウトしても要求された処理は継続中です。 タイムアウトの場合 , waitfn の復帰値に E_TMOUT を返します。要求パケットの error は変更しません。 なお , 要求された処理を継続中で waitfn から復帰するときには , waitfn の復帰値に必ず エラーを返します。復帰値にエラーを返した場合は , 必ず処理が継続していなければな らず , 復帰値にパケット番号を返した場合 , 必ず処理を完了してください。waitfn の復 帰値にエラーが返されている限り , その要求は処理中として要求パケットは消滅しま せん。waitfn の復帰値に処理を完了した要求パケットの番号が返されたときに , その要 求の処理は完了したものとして要求パケットは消滅します。 入出力エラーなどデバイスに関するエラーを要求パケットのerror に格納します。 waitfn の復帰値には完了待ちが正しくできなかった場合のエラーを返します。waitfn の復帰 値が tk_wai_dev の復帰値となり , 要求パケットの error を ioer に戻します。 デバイスドライバ側の理由や中止要求 ( 要求パケットの abort フラグ =TRUE) で完了待 ちの処理を中止する場合 , 単一要求の完了待ち (nreq=1) の場合と , 複数要求の完了待ち (nreq>1) の場合で中止する処理を変えてください。単一要求の完了待ちの場合 , 処理中 の要求を中止します。複数要求の完了待ちの場合 , 要求の処理自体は中止せずに完了待 ちだけを中止 ( 待ち解除 ) します。複数要求待ちの中止 ( 待ち解除 ) の場合 , waitfn の 復帰値に E_ABORT を返します。 また , 複数要求の場合は中止要求を無視することもできます。ただし , 中止要求に対し ては , できる限り中止処理を行うことを推奨します。 January 31, 2014, CM81-00210-2a 253 第 4 章 デバイスドライバ インタフェース 4.11 デバイス処理関数 Su pp or t So ft Manu al なお , 中止処理は waitfn からできる限り速やかに復帰することが重要であり , 処理を中 止しなくてもすぐに処理が終了する場合 , 中止する必要はありません。処理が中止され た場合 , 要求パケットの error に E_ABORT を返すことを原則としますが , そのデバイ スの特性に合わせて E_ABORT 以外のエラーを返しても構いません。また , 中止する直 前までの処理を有効として E_OK を返しても構いません。 なお , 中止要求があっても正常に最後まで処理した場合 , E_OK を返します。 ● 中止処理関数 (abortfn) <呼出しインタフェース> ER ercd = abortfn( ID tskid, T_DEVREQ *devreq, INT nreq, VP exinf ) <パラメータ> 【入力】 tskid execfn, waitfn を実行しているタスクのタスク ID devreq 要求パケットのリスト nreq 要求パケットの数 exinf デバイス登録時に指定された拡張情報 【出力】 ercd エラーコード <解説> tk_cls_dev が呼び出されたときに abortfn を呼び出します。 abortfn は , 指定された要求を実行中の execfn, waitfn を中止させます。通常は , 処理中 の要求を中止させます。ただし , 中止しなくてもすぐに処理が終了する場合 , 必ずしも 中止しなくても構いません。重要なのは , できる限り速やかに execfn, waitfn から復帰 することです。tskid は , devreq で指定された要求を実行中のタスクです。つまり , execfn, waitfn を実行しているタスクです。devreq, nreq は , execfn, waitfn の入力パラメータとし て指定されたものと同じです。ただし , execfn の場合は常に nreq=1 です。 abortfn は , execfn, waitfn を実行しているタスクとは別のタスクから呼び出されます。両 者は並行して実行するため , 必要に応じて排他制御などを行ってください。また , execfn, waitfn の呼出し直前や execfn, waitfn から復帰する途中にabortfn を呼び出すこと もできます。この場合も正しく動作するように配慮してください。 abortfn を呼び出す前に , 中止処理対象の要求パケットの abort フラグに TRUE を設定し ます。execfn, waitfn はこれにより中止要求の有無を確認できます。 複数要求待ち (nreq>1) の waitfn 実行中の場合は , 特別な扱いとなりほかの場合とは以 下の点で異なります。 • 要求の処理を中止せずに完了待ちだけを中止 ( 待ちを解除 ) します。 • 要求パケットの abort フラグはセットしません (abort=FALSE のまま )。 なお, execfn, waitfn の実行中でないときに要求を中止させる場合, abortfn を呼び出すこ となく , 要求パケットの abort フラグをセットします。abort フラグがセットされた状態 で execfn が呼び出されたときには要求を受け付けません。waitfn が呼び出されたとき には abortfn が呼び出された場合と同様の中止処理を行ってください。execfn により処 254 CM81-00210-2a, January 31, 2014 第 4 章 デバイスドライバ インタフェース 4.11 デバイス処理関数 Support Soft Ma nual 理を開始した要求がwaitfn による完了待ちでない状態で中止された場合, 後でwaitfn が 呼び出されたときに中止されて処理が完了したことを知らせます。処理が中止されて も waitfn により完了を確認するまでは要求自体は消滅しません。abortfn は中止処理を 開始するだけで中止が完了するのを待たずに速やかに復帰します。abortfn を以下の場 合に呼び出します。 • tk_cls_dev およびサブシステムのクリーンアップ処理によるデバイスクローズ時に , クローズするデバイスディスクリプタによる処理中の要求があった場合 , そのデバ イスディスクリプタによる処理中の要求を中止します。 ● イベント関数 (eventfn) <呼出しインタフェース> INT rtncd = eventfn( INT evttyp, VP evtinf, VP exinf ) <パラメータ> 【入力】 evttyp ドライバ要求イベントタイプ evtinf イベントタイプ別の情報 exinf デバイス登録時に指定された拡張情報 【出力】 rtncd イベントタイプ別に定義された復帰値またはエラー <解説> ドライバ要求イベントタイプには以下のものがあり , 正の値が tk_evt_dev の呼出しによ るもの , 負の値がデバイス管理機能内部からの呼出しによるものです。 表 4.11-1 イベントタイプの定数マクロ イベント 値 意味 TDV_SUSPEND -1 サスペンド TDV_RESUME -2 リジューム TDV_CARDEVT 1 PC カードイベント TDV_USBEVT 2 USB イベント イベント関数で行う処理をイベントタイプごとに定義します。tk_evt_dev による呼出し の場合 , eventfn の復帰値はそのまま tk_evt_dev の復帰値となります。イベント関数へ の要求は , ほかの要求の処理中であっても受け付けられます。よって , できる限り速や かに処理してください。 January 31, 2014, CM81-00210-2a 255 第 4 章 デバイスドライバ インタフェース 4.11 デバイス処理関数 Su pp or t 256 So ft Manu al CM81-00210-2a, January 31, 2014 Support Soft Ma nual 付録 エラーコード , 定数マクロ , ITRON 仕様 OS から の移行時の注意事項について説明します。また , ア ルファベット順のシステムコール索引を掲載しま す。 付録 A エラーコード一覧 付録 B 定数マクロ一覧 付録 C ITRON 仕様 OS からの移行時の注意点 付録 D システムコール索引 January 31, 2014, CM81-00210-2a 257 付録 付録 A エラーコード一覧 Su pp or t 付録 A So ft Manu al エラーコード一覧 エラーコードの一覧を示します。 ■ エラーコード一覧 表 A-1 エラーコード一覧 エラーコード *1 ラベル 意味 0 H'00 H'00000000 正常終了 E_SYS*2 -5 -H'05 H'fffffffb システムエラー E_NOCOP*2 -6 -H'06 H'fffffffa コプロセッサ使用不可 E_NOSPT*2 -9 -H'09 H'fffffff7 未サポート機能 E_RSFN*2 -10 -H'0a H'fffffff6 予約機能コード番号 E_RSATR -11 -H'0b H'fffffff5 予約属性 E_PAR -17 -H'11 H'ffffffef パラメータエラー E_ID -18 -H'12 H'ffffffee 不正 ID 番号 E_CTX -25 -H'19 H'ffffffe7 コンテキストエラー E_MACV*2 -26 -H'1a H'ffffffe6 メモリアクセス不能 , メモリアクセス権違反 E_OACV -27 -H'1b H'ffffffe5 オブジェクトアクセス権違反 E_ILUSE -28 -H'1c H'ffffffe4 システムコール不正使用 E_NOMEM -33 -H'21 H'ffffffdf メモリ不足 E_LIMIT -34 -H'22 H'ffffffde システムの制限を超過 E_OBJ -41 -H'29 H'ffffffd7 オブジェクトの状態が不正 E_NOEXS -42 -H'2a H'ffffffd6 オブジェクトが存在していない E_QOVR -43 -H'2b H'ffffffd5 キューイングまたはネストのオーバフロー E_RLWAI -49 -H'31 H'ffffffcf 待ち状態強制解除 E_TMOUT -50 -H'32 H'ffffffce ポーリング失敗またはタイムアウト E_DLT -51 -H'33 H'ffffffcd 待ちオブジェクトが削除された E_DISWAI*2 -52 -H'34 H'ffffffcc 待ち禁止による待ち解除 E_IO -57 -H'39 H'ffffffc7 入出力エラー E_NOMDA*2 -58 -H'3a H'ffffffc6 メディアがない E_BUSY -65 -H'41 H'ffffffbe ビジー状態 E_ABORT -66 -H'42 H'ffffffbd 中止した E_RONLY -67 -H'43 H'ffffffbc 書込み禁止 E_OK *1:エラーコードは , 左から符号付き 10 進 , 符号付き 16 進 , 16 進絶対値の 3 種類の表 記で記載しています。 *2:T-Kernel では使用しません。T-Kernel との互換性のために規定されています。 258 CM81-00210-2a, January 31, 2014 付録 付録 B 定数マクロ一覧 Support 付録 B Soft Ma nual 定数マクロ一覧 定数マクロの一覧を示します。 ■ 定数マクロ一覧 表 B-1 定数マクロ一覧 (1 / 4) 種別 タスク オブジェクト生成 タスクの状態 タスクの待ち状態 January 31, 2014, CM81-00210-2a マクロ名 値 意味 TSK_SELF 0 自タスク TPRI_INI 0 起動時優先度 TPRI_RUN 0 実行中タスクの優先度 TA_ASM 0 アセンブラ言語で記述 TA_HLNG 1 C 言語で記述 TA_USERBUF 0x20 ユーザバッファを指定 TA_RNG0 0 メモリ保護レベル 0 TA_RNG1 0x100 メモリ保護レベル 1 TA_RNG2 0x200 メモリ保護レベル 2 TA_RNG3 0x300 メモリ保護レベル 3 TTS_RUN 0x1 実行状態 TTS_RDY 0x2 実行可能状態 TTS_WAI 0x4 待ち状態 TTS_SUS 0x8 強制待ち状態 TTS_WAS 0xc 2 重待ち状態 (WAITING + SUSPENDED) TTS_DMT 0x10 休止状態 TTW_SLP 0x1 起床待ち TTW_DLY 0x2 遅延待ち TTW_SEM 0x4 セマフォ待ち TTW_FLG 0x8 イベントフラグ待ち TTW_MBX 0x40 メールボックス受信待ち TTW_MTX 0x80 ミューテックスロック待ち TTW_SMBF 0x100 メッセージバッファ送信待ち TTW_RMBF 0x200 メッセージバッファ受信待ち TTW_CAL 0x400 ランデブ呼出し待ち 259 付録 付録 B 定数マクロ一覧 Su pp or t So ft Manu al 表 B-1 定数マクロ一覧 (2 / 4) 種別 マクロ名 値 意味 TTW_ACP 0x800 ランデブ受付け待ち TTW_RDV 0x1000 ランデブ終了待ち TTW_MPF 0x2000 固定長メモリプール獲得待ち TTW_MPL 0x4000 可変長メモリプール獲得待ち TA_TFIFO 0 待ち行列が FIFO 順 TA_TPRI 0x1 待ち行列がタスク優先度順 TA_FIRST 0 待ち行列先頭タスクを優先 TA_CNT 0x2 要求数の少ないタスクを優先 TA_INHERIT 0x2 優先度継承プロトコル TA_CEILING 0x3 優先度上限プロトコル TA_WSGL 0 複数タスク待ちを禁止 TA_WMUL 0x8 複数タスク待ちを許可 TWF_ANDW 0 イベントフラグの AND 待ち TWF_ORW 0x1 イベントフラグの OR 待ち TWF_CLR 0x10 すべてのイベントフラグをクリア TWF_BITCLR 0x20 特定のイベントフラグをクリア TA_MFIFO 0 メッセージを FIFO で管理 TA_MPRI 0x2 メッセージを優先度順で管理 TA_STA 0x2 周期ハンドラの起動 TA_PHS 0x4 周期ハンドラの位相を保存 TCYC_STP 0 周期ハンドラを停止 TCYC_STA 0x1 周期ハンドラの動作開始 TALM_STP 0 アラームハンドラを停止 TALM_STA 0x1 アラームハンドラの動作開始 TSS_TSK 0 タスク実行中 TSS_DDSP 0x1 ディスパッチ禁止状態 TSS_DINT 0x2 割込み禁止状態 TSS_INDP 0x4 タスク独立部実行中 TSS_QTSK 0x8 準タスク実行中 TD_PROTECT 0x8000 書込み禁止 TD_REMOVABLE 0x4000 メディアの取外し可能 タスクの待ち状態 待ち行列 ミューテックス属性 イベントフラグ属性 イベントフラグ待ち モード メールボックス属性 周期ハンドラ属性 周期ハンドラの動作 アラームハンドラの 動作 システムの状態 デバイス共通属性 260 CM81-00210-2a, January 31, 2014 付録 付録 B 定数マクロ一覧 Support Soft Ma nual 表 B-1 定数マクロ一覧 (3 / 4) 種別 デバイスタイプ マクロ名 値 TD_DEVKIND 0xff デバイスタイプ / メディアタイプマスク TD_DEVTYPE 0xf0 デバイスタイプマスク TDK_UNDEF 0 未定義デバイス TDK_DISK 0x10 ディスクデバイス TDK_DISK_UNDEF 0x10 未定義のディスクデバイス TDK_DISK_RAM 0x11 RAM ディスク TDK_DISK_ROM 0x12 ROM ディスク TDK_DISK_FLA 0x13 フラッシュメモリディスク TDK_DISK_FD 0x14 フロッピィディスク TDK_DISK_HD 0x15 ハードディスク TDK_DISK_CDROM 0x16 CD-ROM TD_READ 0x1 読出し専用 TD_WRITE 0x2 書込み専用 TD_UPDATE 0x3 読出しおよび書込み TD_EXCL 0x100 オープンの排他 TD_WEXCL 0x200 書込み専用オープンの排他 TD_REXCL 0x400 読出し専用オープンの排他 TD_EJECT 0x1 クローズ時にメディアを排出 TD_SUSPEND 0x1 サスペンド TD_DISSUS 0x2 サスペンド禁止 TD_ENASUS 0x3 サスペンド許可 TD_CHECK 0x4 サスペンド許可 / 禁止状態のチェック TD_FORCE 0x8000 強制サスペンド TDN_EVENT -1 事象通知用メッセージバッファ ID TDN_DISKINFO -2 ディスク情報 TDN_DISPSPEC -3 ディスプレイデバイス情報 TDN_PCMCIAINFO -4 PC カード情報 TDA_OPENREQ 0x1 毎回オープン / クローズ TDC_READ 0x1 読出し要求 TDC_WRITE 0x2 書込み要求 ディスクデバイス デバイスオープン モード デバイスクローズ オプション デバイスサスペンド モード 事象通知用 メッセージバッファ デバイス登録 意味 デバイス要求 January 31, 2014, CM81-00210-2a 261 付録 付録 B 定数マクロ一覧 Su pp or t So ft Manu al 表 B-1 定数マクロ一覧 (4 / 4) 種別 ドライバイベント マクロ名 値 意味 TDV_SUSPEND -1 サスペンド TDV_RESUME -2 リジューム TDV_CARDEVT 0x1 PC カードイベント TDV_USBEVT 0x2 USB イベント NULL 0 NULL TA_NULL 0 特別な属性を指定しない TMO_FEVR -1 永久待ち TMO_POL 0 ポーリング NULL タイムアウト値 262 CM81-00210-2a, January 31, 2014 付録 付録 C ITRON 仕様 OS からの移行時の注意点 Support 付録 C Soft Ma nual ITRON 仕様 OS からの移行時の注意点 ITRON 仕様 OS と T-REALOS の相違点について説明します。 ■ ITRON 仕様 OS との相違点について ITRON4.0 仕様準拠のリアルタイム OS である SOFTUNE REALOS/FR Spec.4( 以降 , REALOS/FR Spec.4 とよびます ) と T-REALOS の機能的な違いについて , 表 C-1 に示 します。REALOS/FR Spec.4 のユーザプログラムを T-REALOS に移植する場合 , これ らの点について注意してください。 表 C-1 T-REALOS と REALOS/FR Spec.4 の機能相違点一覧 T-REALOS REALOS/FR Spec.4 オブジェクトの静的生成 × ○ オブジェクト生成時の ID 番号指定 × ○ サブシステム機能 ○ × デバイス管理機能 ○ × カーネルでの領域確保 ( タスクスタック , メモリプール領域 ) ○ × タスク例外機能 × ○ セマフォ資源の複数獲得 / 解放 ○ × データキュー機能 × ○ ランデブポート機能 ○ × 機能 オブジェクト待ちシステムコール * ( 永久待ち , ポーリング , タイムアウト ) 割込みレベルの変更 同一システムコール 別システムコール × イベントフラグのビットクリア ○ ビット単位および 全ビット 割込みハンドラの動的登録 ○ 全ビット × 〇 : 該当機能をサポート ×:該当機能を未サポート *: セマフォ待ちのシステムコールには以下の違いがあります。tk_wai_sem では , タイ ムアウト時間 (tmout) の引数を持ち , tmout の値により待ちの種類を制御します。 REALOS/FR Spec.4 永久待ち wai_sem() ポーリング pol_sem() タイムアウト twai_sem() January 31, 2014, CM81-00210-2a T-REALOS tk_wai_sem() 263 付録 付録 D システムコール索引 Su pp or t 付録 D So ft Manu al システムコール索引 システムコールのアルファベット順一覧とその説明の掲載ページを以下に示します。 ■ システムコール索引 表 D-1 システムコール索引 (1 / 4) システムコール名 264 ペー ジ数 概要 DI 外部割込み禁止 187 EI 外部割込み許可 188 isDI 外部割込み禁止状態の獲得 189 isig_tim(Signal Time) システム時刻の更新 165 tk_acp_por(Accept Port for Rendezvous) ランデブポートに対するランデブ受付け 125 tk_cal_por(Call Port for Rendezvous) ランデブポートに対するランデブ呼出し 122 tk_can_wup(Cancel Wakeup Task) タスク起床要求を無効化 51 tk_chg_pri(Change Task Priority) タスク優先度変更 35 tk_clr_flg(Clear Event Flag) イベントフラグのクリア 78 tk_cls_dev(Close Device) デバイスのクローズ 213 tk_cre_alm(Create Alarm Handler) アラームハンドラの生成 176 tk_cre_cyc(Create Cyclic Handler) 周期ハンドラの生成 167 tk_cre_flg(Create Event Flag) イベントフラグの生成 74 tk_cre_mbf(Create Message Buffer) メッセージバッファの生成 108 tk_cre_mbx(Create Mailbox) メールボックスの生成 86 tk_cre_mpf(Create Fixed-size Memory Pool) 固定長メモリプールの生成 138 tk_cre_mpl(Create Variable-size Memory Pool) 可変長メモリプールの生成 149 tk_cre_mtx(Create Mutex) ミューテックスの生成 97 tk_cre_por(Create Port for Rendezvous) ランデブポートの生成 119 tk_cre_sem(Create Semaphore) セマフォの生成 64 tk_cre_tsk(Create Task) タスクの生成 26 tk_def_dev(Define Device) デバイスの登録または削除 207 tk_def_int(Define Interrupt Handler) 割込みハンドラの定義または解除 184 tk_def_ssy(Define Subsystem) サブシステムの定義または解除 202 tk_del_alm(Delete Alarm Handler) アラームハンドラの削除 178 tk_del_cyc(Delete Cyclic Handler) 周期ハンドラの削除 170 tk_del_flg(Delete Event Flag) イベントフラグの削除 76 CM81-00210-2a, January 31, 2014 付録 付録 D システムコール索引 Support Soft Ma nual 表 D-1 システムコール索引 (2 / 4) システムコール名 概要 ペー ジ数 tk_del_mbf(Delete Message Buffer) メッセージバッファの削除 111 tk_del_mbx(Delete Mailbox) メールボックスの削除 88 tk_del_mpf(Delete Fixed-size Memory Pool) 固定長メモリプールの削除 141 tk_del_mpl(Delete Variable-size Memory Pool) 可変長メモリプールの削除 152 tk_del_mtx(Delete Mutex) ミューテックスの削除 99 tk_del_por(Delete Port for Rendezvous) ランデブポートの削除 121 tk_del_sem(Delete Semaphore) セマフォの削除 66 tk_del_tsk(Delete Task) タスクの削除 29 tk_dis_dsp(Disable Dispatch) ディスパッチ禁止 194 tk_dly_tsk(Delay Task) 時間経過待ち状態へ移行 61 tk_ena_dsp(Enable Dispatch) ディスパッチ許可 196 tk_evt_dev(Event Device) デバイスにドライバ要求イベントを送信 233 tk_exd_tsk(Exit and Delete Task) 自タスクの終了と削除 32 tk_ext_tsk(Exit Task) 自タスクの終了 31 tk_frsm_tsk(Force Resume Task) 強制待ち状態のタスクを強制再開 59 tk_fwd_por(Forward Rendezvous to Another Port) ランデブポートに対するランデブの回送 128 tk_get_dev(Get Device) デバイス名獲得 226 tk_get_mpf(Get Fixed-size Memory Block) 固定長メモリブロック獲得 142 tk_get_mpl(Get Variable-size Memory Block) 可変長メモリブロック獲得 153 tk_get_otm(Get Operating Time) システム稼働時間参照 164 tk_get_reg(Get Task Registers) タスクレジスタの獲得 38 tk_get_tid(Get Task Identifier) 実行状態タスクのタスク ID 参照 193 tk_get_tim(Get Time) システム時刻参照 163 tk_loc_mtx(Lock Mutex) ミューテックスのロック 100 tk_lst_dev(List Device) 登録済みデバイス一覧の獲得 231 tk_opn_dev(Open Device) デバイスのオープン 211 tk_oref_dev(Refer Device) デバイスディスクリプタからデバイス情 報獲得 229 tk_rcv_mbf(Receive Message from Message Buffer) メッセージバッファから受信 114 tk_rcv_mbx(Receive Message from Mailbox) メールボックスから受信 91 tk_rea_dev(Read Device) デバイスからの読出し開始 214 tk_ref_alm(Refer Alarm Handler Status) アラームハンドラの状態を参照 181 tk_ref_cyc(Refer Cyclic Handler Status) 周期ハンドラの状態を参照 173 January 31, 2014, CM81-00210-2a 265 付録 付録 D システムコール索引 Su pp or t So ft Manu al 表 D-1 システムコール索引 (3 / 4) システムコール名 266 ペー ジ数 概要 tk_ref_dev(Refer Device) デバイス名からデバイス情報獲得 227 tk_ref_flg(Refer Event Flag Status) イベントフラグの状態を参照 83 tk_ref_idv(Refer Initial Device Information) デバイス初期情報の獲得 210 tk_ref_mbf(Refer Message Buffer Status) メッセージバッファの状態を参照 116 tk_ref_mbx(Refer Mailbox Status) メールボックスの状態を参照 93 tk_ref_mpf(Refer Fixed-size Memory Pool Status) 固定長メモリプールの状態を参照 146 tk_ref_mpl(Refer Variable-size Memory Pool Status) 可変長メモリプールの状態を参照 157 tk_ref_mtx(Refer Mutex Status) ミューテックスの状態を参照 105 tk_ref_por(Refer Port Status) ランデブポートの状態を参照 134 tk_ref_sem(Refer Semaphore Status) セマフォの状態を参照 71 tk_ref_ssy(Refer Subsystem Status) サブシステム定義情報を参照 205 tk_ref_sys(Refer System Status) システムの状態を参照 197 tk_ref_tsk(Refer Task Status) タスクの状態を参照 42 tk_ref_ver(Refer Version Information) バージョン情報を参照 199 tk_rel_mpf(Release Fixed-size Memory Block) 固定長メモリブロックを返却 144 tk_rel_mpl(Release Variable-size Memory Block) 可変長メモリブロックを返却 155 tk_rel_wai(Release Wait) 他タスクの待ち状態解除 53 tk_ret_int(Return from Interrupt Handler) 割込みハンドラからの復帰 186 tk_rot_rdq(Rotate Ready Queue) タスク優先順位の回転 191 tk_rpl_rdv(Reply Rendezvous) ランデブ返答 132 tk_rsm_tsk(Resume Task) 強制待ち状態のタスクを再開 57 tk_set_flg(Set Event Flag) イベントフラグのセット 77 tk_set_reg(Set Task Registers) タスクレジスタの設定 40 tk_set_tim(Set Time) システム時刻の設定 161 tk_sig_sem(Signal Semaphore) セマフォ資源の返却 67 tk_slp_tsk(Sleep Task) 自タスクを起床待ち状態へ移行 47 tk_snd_mbf(Send Message to Message Buffer) メッセージバッファへ送信 112 tk_snd_mbx(Send Message to Mailbox) メールボックスへ送信 89 tk_srea_dev(Synchronous Read Device) デバイスの同期読出し 216 tk_sta_alm(Start Alarm Handler) アラームハンドラの動作開始 179 tk_sta_cyc(Start Cyclic Handler) 周期ハンドラの動作開始 171 tk_sta_tsk (Start Task) タスクの起動 30 tk_stp_alm(Stop Alarm Handler) アラームハンドラの動作停止 180 CM81-00210-2a, January 31, 2014 付録 付録 D システムコール索引 Support Soft Ma nual 表 D-1 システムコール索引 (4 / 4) システムコール名 概要 ペー ジ数 tk_stp_cyc(Stop Cyclic Handler) 周期ハンドラの動作停止 172 tk_sus_dev(Suspend Device) デバイスのサスペンド 224 tk_sus_tsk(Suspend Task) 他タスクを強制待ち状態へ移行 55 tk_swri_dev(Synchronous Write Device) デバイスの同期書込み 220 tk_ter_tsk(Terminate Task) 他タスクを強制終了 33 tk_unl_mtx(Unlock Mutex) ミューテックスのアンロック 103 tk_wai_dev(Wait Device) デバイスの要求完了待ち 222 tk_wai_flg(Wait Event Flag) イベントフラグ待ち 79 tk_wai_sem(Wait on Semaphore) セマフォ資源の獲得待ち 69 tk_wri_dev(Write Device) デバイスの書込み開始 218 tk_wup_tsk(Wakeup Task) 他タスクの起床 49 January 31, 2014, CM81-00210-2a 267 付録 付録 D システムコール索引 Su pp or t 268 So ft Manu al CM81-00210-2a, January 31, 2014 索引 Support Soft Ma nual 索引 Symbols A ITRON 仕様 OS ITRON 仕様 OS との相違点について ..............263 T-Kernel T-Kernel 固有の意味を持つデータ型の一覧 ............................................................................12 T-REALOS T-REALOS の基本的な用語 ..................................2 Accept tk_acp_por(Accept Port for Rendezvous) ............... 125 Alarm Handler tk_cre_alm(Create Alarm Handler) ........................ 176 tk_del_alm(Delete Alarm Handler) ........................ 178 tk_ref_alm(Refer Alarm Handler Status) ............... 181 tk_sta_alm(Start Alarm Handler) ............................179 tk_stp_alm(Stop Alarm Handler) ............................180 B Buffer tk_cre_mbf(Create Message Buffer) ...................... 108 tk_del_mbf(Delete Message Buffer) ...................... 111 tk_ref_mbf(Refer Message Buffer Status) ..............116 tk_snd_mbf(Send Message to Message Buffer) ..........................................................................112 C Call tk_cal_por(Call Port for Rendezvous) .................... 122 Cancel tk_can_wup(Cancel Wakeup Task) .......................... 51 Change tk_chg_pri(Change Task Priority) ............................ 35 Clear tk_clr_flg(Clear Event Flag) ..................................... 78 Close tk_cls_dev(Close Device) .......................................213 Create tk_cre_alm(Create Alarm Handler) ........................ 176 tk_cre_cyc(Create Cyclic Handler) ........................ 167 tk_cre_flg(Create Event Flag) ..................................74 tk_cre_mbf(Create Message Buffer) ...................... 108 tk_cre_mbx(Create Mailbox) ....................................86 tk_cre_mpf(Create Fixed-size Memory Pool) ..........................................................................138 tk_cre_mpl(Create Variable-size Memory Pool) ..........................................................................149 tk_cre_mtx(Create Mutex) ........................................ 97 tk_cre_por(Create Port for Rendezvous) ................ 119 tk_cre_sem(Create Semaphore) ................................64 tk_cre_tsk(Create Task) ............................................ 26 Cyclic Handler tk_cre_cyc(Create Cyclic Handler) ........................ 167 tk_del_cyc(Delete Cyclic Handler) ........................ 170 tk_ref_cyc(Refer Cyclic Handler Status) ................ 173 tk_sta_cyc(Start Cyclic Handler) ............................171 tk_stp_cyc(Stop Cyclic Handler) ............................172 January 31, 2014, CM81-00210-2a 269 索引 Su pp or t D Define tk_def_dev(Define Device) .....................................207 tk_def_int(Define Interrupt Handler) ......................184 tk_def_ssy(Define Subsystem) ...............................202 Delay tk_dly_tsk(Delay Task) .............................................61 Delete tk_del_alm(Delete Alarm Handler) ........................178 tk_del_cyc(Delete Cyclic Handler) .........................170 tk_del_flg(Delete Event Flag) ...................................76 tk_del_mbf(Delete Message Buffer) .......................111 tk_del_mbx(Delete Mailbox) ....................................88 tk_del_mpf(Delete Fixed-size Memory Pool) ..........................................................................141 tk_del_mpl(Delete Variable-size Memory Pool) ..........................................................................152 tk_del_mtx(Delete Mutex) ........................................99 tk_del_por(Delete Port for Rendezvous) ................121 tk_del_sem(Delete Semaphore) ................................66 tk_del_tsk(Delete Task) ............................................29 tk_exd_tsk(Exit and Delete Task) .............................32 Device tk_cls_dev(Close Device) .......................................213 tk_def_dev(Define Device) .....................................207 tk_evt_dev(Event Device) .......................................233 tk_get_dev(Get Device) ..........................................226 tk_lst_dev(List Device) ...........................................231 tk_opn_dev(Open Device) ......................................211 tk_oref_dev(Refer Device) .....................................229 tk_rea_dev(Read Device) ........................................214 tk_ref_dev(Refer Device) .......................................227 tk_ref_idv(Refer Initial Device Information) ..........................................................................210 tk_srea_dev(Synchronous Read Device) ................216 tk_sus_dev(Suspend Device) ..................................224 tk_swri_dev(Synchronous Write Device) ...............220 tk_wai_dev(Wait Device) .......................................222 tk_wri_dev(Write Device) ......................................218 DI DI ............................................................................187 Disable tk_dis_dsp(Disable Dispatch) .................................194 Dispatch tk_dis_dsp(Disable Dispatch) .................................194 tk_ena_dsp(Enable Dispatch) .................................196 E EI EI .............................................................................188 Enable tk_ena_dsp(Enable Dispatch) .................................196 Event tk_clr_flg(Clear Event Flag) .....................................78 tk_cre_flg(Create Event Flag) ...................................74 tk_del_flg(Delete Event Flag) ...................................76 tk_evt_dev(Event Device) .......................................233 tk_ref_flg(Refer Event Flag Status) ..........................83 tk_set_flg(Set Event Flag) ........................................77 tk_wai_flg(Wait Event Flag) ....................................79 270 So ft Manu al Exit tk_exd_tsk(Exit and Delete Task) ............................. 32 tk_ext_tsk(Exit Task) ................................................ 31 F Fixed-size tk_cre_mpf(Create Fixed-size Memory Pool) ..........................................................................138 tk_del_mpf(Delete Fixed-size Memory Pool) ..........................................................................141 tk_get_mpf(Get Fixed-size Memory Block) ..........................................................................142 tk_ref_mpf(Refer Fixed-size Memory Pool Status) ..........................................................................146 tk_rel_mpf(Release Fixed-size Memory Block) ..........................................................................144 Flag tk_clr_flg(Clear Event Flag) ..................................... 78 tk_cre_flg(Create Event Flag) ..................................74 tk_del_flg(Delete Event Flag) ..................................76 tk_ref_flg(Refer Event Flag Status) .......................... 83 tk_set_flg(Set Event Flag) ........................................ 77 tk_wai_flg(Wait Event Flag) ....................................79 Force tk_frsm_tsk(Force Resume Task) ............................. 59 Forward tk_fwd_por(Forward Rendezvous to Another Port) ........................................................................... 128 G Get tk_get_dev(Get Device) .......................................... 226 tk_get_mpf(Get Fixed-size Memory Block) ..........................................................................142 tk_get_mpl(Get Variable-size Memory Block) ..........................................................................153 tk_get_otm(Get Operating Time) ........................... 164 tk_get_reg(Get Task Registers) ................................38 tk_get_tid(Get Task Identifier) ............................... 193 tk_get_tim(Get Time) .............................................163 H Handler tk_cre_alm(Create Alarm Handler) ........................ 176 tk_cre_cyc(Create Cyclic Handler) ........................ 167 tk_def_int(Define Interrupt Handler) ...................... 184 tk_del_alm(Delete Alarm Handler) ........................ 178 tk_del_cyc(Delete Cyclic Handler) ........................ 170 tk_ref_alm(Refer Alarm Handler Status) ............... 181 tk_ref_cyc(Refer Cyclic Handler Status) ................ 173 tk_ret_int(Return from Interrupt Handler) ..............186 tk_sta_alm(Start Alarm Handler) ............................179 tk_sta_cyc(Start Cyclic Handler) ............................171 tk_stp_alm(Stop Alarm Handler) ............................180 tk_stp_cyc(Stop Cyclic Handler) ............................172 CM81-00210-2a, January 31, 2014 索引 Support Soft I Ma nual Kernel T-Kernel 固有の意味を持つデータ型の一覧 ............................................................................12 tk_rel_mpl(Release Variable-size Memory Block) ..........................................................................155 Message tk_cre_mbf(Create Message Buffer) ...................... 108 tk_del_mbf(Delete Message Buffer) ...................... 111 tk_rcv_mbf(Receive Message from Message Buffer) ........................................................................... 114 tk_rcv_mbx(Receive Message from Mailbox) ............................................................................91 tk_ref_mbf(Refer Message Buffer Status) ..............116 tk_snd_mbf(Send Message to Message Buffer) ..........................................................................112 tk_snd_mbx(Send Message to Mailbox) .................. 89 Message Buffer tk_cre_mbf(Create Message Buffer) ...................... 108 tk_del_mbf(Delete Message Buffer) ...................... 111 tk_ref_mbf(Refer Message Buffer Status) ..............116 tk_snd_mbf(Send Message to Message Buffer) ..........................................................................112 Mutex tk_cre_mtx(Create Mutex) ........................................ 97 tk_del_mtx(Delete Mutex) ........................................ 99 tk_loc_mtx(Lock Mutex) ........................................ 100 tk_ref_mtx(Refer Mutex Status) ............................. 105 tk_unl_mtx(Unlock Mutex) .................................... 103 L O List Open tk_opn_dev(Open Device) ...................................... 211 Operating tk_get_otm(Get Operating Time) ........................... 164 OS ITRON 仕様 OS との相違点について ..............263 Identifier tk_get_tid(Get Task Identifier) ...............................193 Information tk_ref_idv(Refer Initial Device Information) ..........................................................................210 tk_ref_ver(Refer Version Information) ...................199 Initial tk_ref_idv(Refer Initial Device Information) ..........................................................................210 Interrupt tk_def_int(Define Interrupt Handler) ......................184 tk_ret_int(Return from Interrupt Handler) ..............186 isDI isDI ..........................................................................189 isig_tim isig_tim(Signal Time) .............................................165 K tk_lst_dev(List Device) ...........................................231 Lock tk_loc_mtx(Lock Mutex) ........................................100 M Mailbox tk_cre_mbx(Create Mailbox) ....................................86 tk_del_mbx(Delete Mailbox) ....................................88 tk_rcv_mbx(Receive Message from Mailbox) ............................................................................91 tk_ref_mbx(Refer Mailbox Status) ...........................93 tk_snd_mbx(Send Message to Mailbox) ...................89 Memory tk_cre_mpf(Create Fixed-size Memory Pool) ..........................................................................138 tk_cre_mpl(Create Variable-size Memory Pool) ..........................................................................149 tk_del_mpf(Delete Fixed-size Memory Pool) ..........................................................................141 tk_del_mpl(Delete Variable-size Memory Pool) ..........................................................................152 tk_get_mpf(Get Fixed-size Memory Block) ..........................................................................142 tk_get_mpl(Get Variable-size Memory Block) ..........................................................................153 tk_ref_mpf(Refer Fixed-size Memory Pool Status) ..........................................................................146 tk_ref_mpl(Refer Variable-size Memory Pool Status) ...........................................................................157 tk_rel_mpf(Release Fixed-size Memory Block) ..........................................................................144 January 31, 2014, CM81-00210-2a P Port tk_acp_por(Accept Port for Rendezvous) ............... 125 tk_cal_por(Call Port for Rendezvous) .................... 122 tk_cre_por(Create Port for Rendezvous) ................ 119 tk_del_por(Delete Port for Rendezvous) ................ 121 tk_ref_por(Refer Port Status) ..................................134 Priority tk_chg_pri(Change Task Priority) ............................ 35 Q Queue tk_rot_rdq(Rotate Ready Queue) ............................191 R Read tk_rea_dev(Read Device) .......................................214 tk_srea_dev(Synchronous Read Device) ................ 216 Ready Queue tk_rot_rdq(Rotate Ready Queue) ............................191 REALOS T-REALOS の基本的な用語 ..................................2 271 索引 Su pp or t Receive tk_rcv_mbf(Receive Message from Message Buffer) ...........................................................................114 Receive Message tk_rcv_mbx(Receive Message from Mailbox) ............................................................................91 Refer tk_oref_dev(Refer Device) .....................................229 tk_ref_alm(Refer Alarm Handler Status) ................181 tk_ref_cyc(Refer Cyclic Handler Status) ................173 tk_ref_dev(Refer Device) .......................................227 tk_ref_flg(Refer Event Flag Status) ..........................83 tk_ref_idv(Refer Initial Device Information) ..........................................................................210 tk_ref_mbf(Refer Message Buffer Status) ..............116 tk_ref_mbx(Refer Mailbox Status) ...........................93 tk_ref_mpf(Refer Fixed-size Memory Pool Status) ..........................................................................146 tk_ref_mpl(Refer Variable-size Memory Pool Status) ...........................................................................157 tk_ref_mtx(Refer Mutex Status) .............................105 tk_ref_por(Refer Port Status) ..................................134 tk_ref_sem(Refer Semaphore Status) .......................71 tk_ref_ssy(Refer Subsystem Status) .......................205 tk_ref_sys(Refer System Status) .............................197 tk_ref_tsk(Refer Task Status) ...................................42 tk_ref_ver(Refer Version Information) ...................199 Registers tk_get_reg(Get Task Registers) ................................38 tk_set_reg(Set Task Registers) ..................................40 Release tk_rel_mpf(Release Fixed-size Memory Block) ..........................................................................144 tk_rel_mpl(Release Variable-size Memory Block) ..........................................................................155 tk_rel_wai(Release Wait) ..........................................53 Rendezvous tk_acp_por(Accept Port for Rendezvous) ...............125 tk_cal_por(Call Port for Rendezvous) ....................122 tk_cre_por(Create Port for Rendezvous) ................119 tk_del_por(Delete Port for Rendezvous) ................121 tk_fwd_por(Forward Rendezvous to Another Port) ...........................................................................128 tk_rpl_rdv(Reply Rendezvous) ...............................132 Reply tk_rpl_rdv(Reply Rendezvous) ...............................132 Resume tk_frsm_tsk(Force Resume Task) .............................59 tk_rsm_tsk(Resume Task) .........................................57 Return tk_ret_int(Return from Interrupt Handler) ..............186 Rotate tk_rot_rdq(Rotate Ready Queue) ............................191 S Semaphore tk_cre_sem(Create Semaphore) ................................64 tk_del_sem(Delete Semaphore) ................................66 tk_ref_sem(Refer Semaphore Status) .......................71 tk_sig_sem(Signal Semaphore) .................................67 tk_wai_sem(Wait on Semaphore) .............................69 272 So ft Manu al Send tk_snd_mbf(Send Message to Message Buffer) ..........................................................................112 tk_snd_mbx(Send Message to Mailbox) .................. 89 Set tk_set_flg(Set Event Flag) ........................................ 77 tk_set_reg(Set Task Registers) ................................. 40 tk_set_tim(Set Time) .............................................. 161 Signal isig_tim(Signal Time) .............................................165 tk_sig_sem(Signal Semaphore) ................................67 Sleep tk_slp_tsk(Sleep Task) .............................................. 47 Start tk_sta_alm(Start Alarm Handler) ............................179 tk_sta_cyc(Start Cyclic Handler) ............................171 tk_sta_tsk (Start Task) .............................................. 30 Status tk_ref_alm(Refer Alarm Handler Status) ............... 181 tk_ref_cyc(Refer Cyclic Handler Status) ................ 173 tk_ref_flg(Refer Event Flag Status) .......................... 83 tk_ref_mbf(Refer Message Buffer Status) ..............116 tk_ref_mbx(Refer Mailbox Status) ...........................93 tk_ref_mtx(Refer Mutex Status) ............................. 105 tk_ref_por(Refer Port Status) ..................................134 tk_ref_sem(Refer Semaphore Status) .......................71 tk_ref_ssy(Refer Subsystem Status) .......................205 tk_ref_sys(Refer System Status) ............................. 197 tk_ref_tsk(Refer Task Status) ................................... 42 Stop tk_stp_alm(Stop Alarm Handler) ............................180 tk_stp_cyc(Stop Cyclic Handler) ............................172 Subsystem tk_def_ssy(Define Subsystem) ............................... 202 tk_ref_ssy(Refer Subsystem Status) .......................205 Suspend tk_sus_dev(Suspend Device) ..................................224 tk_sus_tsk(Suspend Task) .........................................55 Synchronous tk_srea_dev(Synchronous Read Device) ................ 216 tk_swri_dev(Synchronous Write Device) ............... 220 System tk_ref_sys(Refer System Status) ............................. 197 T Task tk_can_wup(Cancel Wakeup Task) .......................... 51 tk_chg_pri(Change Task Priority) ............................ 35 tk_cre_tsk(Create Task) ............................................ 26 tk_del_tsk(Delete Task) ............................................ 29 tk_dly_tsk(Delay Task) .............................................61 tk_exd_tsk(Exit and Delete Task) ............................. 32 tk_ext_tsk(Exit Task) ................................................ 31 tk_frsm_tsk(Force Resume Task) ............................. 59 tk_get_reg(Get Task Registers) ................................38 tk_get_tid(Get Task Identifier) ............................... 193 tk_ref_tsk(Refer Task Status) ................................... 42 tk_rsm_tsk(Resume Task) ........................................ 57 tk_set_reg(Set Task Registers) ................................. 40 tk_slp_tsk(Sleep Task) .............................................. 47 tk_sta_tsk (Start Task) .............................................. 30 CM81-00210-2a, January 31, 2014 索引 Support Soft tk_sus_tsk(Suspend Task) .........................................55 tk_ter_tsk(Terminate Task) .......................................33 tk_wup_tsk(Wakeup Task) .......................................49 Terminate tk_ter_tsk(Terminate Task) .......................................33 Time isig_tim(Signal Time) .............................................165 tk_get_otm(Get Operating Time) ............................164 tk_get_tim(Get Time) .............................................163 tk_set_tim(Set Time) ...............................................161 tk_acp_por tk_acp_por(Accept Port for Rendezvous) ..........................................................................125 tk_cal_por tk_cal_por(Call Port for Rendezvous) ....................122 tk_can_wup tk_can_wup(Cancel Wakeup Task) ..........................51 tk_chg_pri tk_chg_pri(Change Task Priority) ............................35 tk_clr_flg tk_clr_flg(Clear Event Flag) .....................................78 tk_cls_dev tk_cls_dev(Close Device) .......................................213 tk_cre_alm tk_cre_alm(Create Alarm Handler) ........................176 tk_cre_cyc tk_cre_cyc(Create Cyclic Handler) .........................167 tk_cre_flg tk_cre_flg(Create Event Flag) ...................................74 tk_cre_mbf tk_cre_mbf(Create Message Buffer) .......................108 tk_cre_mbx tk_cre_mbx(Create Mailbox) ....................................86 tk_cre_mpf tk_cre_mpf(Create Fixed-size Memory Pool) ..........................................................................138 tk_cre_mpl tk_cre_mpl(Create Variable-size Memory Pool) ..........................................................................149 tk_cre_mtx tk_cre_mtx(Create Mutex) ........................................97 tk_cre_por tk_cre_por(Create Port for Rendezvous) ................119 tk_cre_sem tk_cre_sem(Create Semaphore) ................................64 tk_cre_tsk tk_cre_tsk(Create Task) ............................................26 tk_def_dev tk_def_dev(Define Device) .....................................207 tk_def_int tk_def_int(Define Interrupt Handler) ......................184 tk_def_ssy tk_def_ssy(Define Subsystem) ...............................202 tk_del_alm tk_del_alm(Delete Alarm Handler) ........................178 tk_del_cyc tk_del_cyc(Delete Cyclic Handler) .........................170 tk_del_flg tk_del_flg(Delete Event Flag) ...................................76 tk_del_mbf tk_del_mbf(Delete Message Buffer) .......................111 tk_del_mbx tk_del_mbx(Delete Mailbox) ....................................88 January 31, 2014, CM81-00210-2a Ma nual tk_del_mpf tk_del_mpf(Delete Fixed-size Memory Pool) ..........................................................................141 tk_del_mpl tk_del_mpl(Delete Variable-size Memory Pool) ..........................................................................152 tk_del_mtx tk_del_mtx(Delete Mutex) ........................................ 99 tk_del_por tk_del_por(Delete Port for Rendezvous) ................ 121 tk_del_sem tk_del_sem(Delete Semaphore) ................................66 tk_del_tsk tk_del_tsk(Delete Task) ............................................ 29 tk_dis_dsp tk_dis_dsp(Disable Dispatch) ................................. 194 tk_dly_tsk tk_dly_tsk(Delay Task) .............................................61 tk_ena_dsp tk_ena_dsp(Enable Dispatch) ................................. 196 tk_evt_dev tk_evt_dev(Event Device) ...................................... 233 tk_exd_tsk tk_exd_tsk(Exit and Delete Task) ............................. 32 tk_ext_tsk tk_ext_tsk(Exit Task) ................................................ 31 tk_frsm_tsk tk_frsm_tsk(Force Resume Task) ............................. 59 tk_fwd_por tk_fwd_por(Forward Rendezvous to Another Port) ........................................................................... 128 tk_get_dev tk_get_dev(Get Device) .......................................... 226 tk_get_mpf tk_get_mpf(Get Fixed-size Memory Block) ........... 142 tk_get_mpl tk_get_mpl(Get Variable-size Memory Block) ..........................................................................153 tk_get_otm tk_get_otm(Get Operating Time) ........................... 164 tk_get_reg tk_get_reg(Get Task Registers) ................................38 tk_get_tid tk_get_tid(Get Task Identifier) ............................... 193 tk_get_tim tk_get_tim(Get Time) .............................................163 tk_loc_mtx tk_loc_mtx(Lock Mutex) ........................................ 100 tk_lst_dev tk_lst_dev(List Device) ...........................................231 tk_opn_dev tk_opn_dev(Open Device) ...................................... 211 tk_oref_dev tk_oref_dev(Refer Device) .....................................229 tk_rcv_mbf tk_rcv_mbf(Receive Message from Message Buffer) ........................................................................... 114 tk_rcv_mbx tk_rcv_mbx(Receive Message from Mailbox) ............................................................................91 tk_rea_dev tk_rea_dev(Read Device) .......................................214 273 索引 Su pp or t tk_ref_alm tk_ref_alm(Refer Alarm Handler Status) ................181 tk_ref_cyc tk_ref_cyc(Refer Cyclic Handler Status) ................173 tk_ref_dev tk_ref_dev(Refer Device) .......................................227 tk_ref_flg tk_ref_flg(Refer Event Flag Status) ..........................83 tk_ref_idv tk_ref_idv(Refer Initial Device Information) ..........................................................................210 tk_ref_mbf tk_ref_mbf(Refer Message Buffer Status) ..............116 tk_ref_mbx tk_ref_mbx(Refer Mailbox Status) ...........................93 tk_ref_mpf tk_ref_mpf(Refer Fixed-size Memory Pool Status) ..........................................................................146 tk_ref_mpl tk_ref_mpl(Refer Variable-size Memory Pool Status) ...........................................................................157 tk_ref_mtx tk_ref_mtx(Refer Mutex Status) .............................105 tk_ref_por tk_ref_por(Refer Port Status) ..................................134 tk_ref_sem tk_ref_sem(Refer Semaphore Status) .......................71 tk_ref_ssy tk_ref_ssy(Refer Subsystem Status) .......................205 tk_ref_sys tk_ref_sys(Refer System Status) .............................197 tk_ref_tsk tk_ref_tsk(Refer Task Status) ...................................42 tk_ref_ver tk_ref_ver(Refer Version Information) ...................199 tk_rel_mpf tk_rel_mpf(Release Fixed-size Memory Block) ..........................................................................144 tk_rel_mpl tk_rel_mpl(Release Variable-size Memory Block) ..........................................................................155 tk_rel_wai tk_rel_wai(Release Wait) ..........................................53 tk_ret_int tk_ret_int(Return from Interrupt Handler) ..............186 tk_rot_rdq tk_rot_rdq(Rotate Ready Queue) ............................191 tk_rpl_rdv tk_rpl_rdv(Reply Rendezvous) ...............................132 tk_rsm_tsk tk_rsm_tsk(Resume Task) .........................................57 tk_set_flg tk_set_flg(Set Event Flag) ........................................77 tk_set_reg tk_set_reg(Set Task Registers) ..................................40 tk_set_tim tk_set_tim(Set Time) ...............................................161 tk_sig_sem tk_sig_sem(Signal Semaphore) .................................67 tk_slp_tsk tk_slp_tsk(Sleep Task) ..............................................47 274 So ft Manu al tk_snd_mbf tk_snd_mbf(Send Message to Message Buffer) ..........................................................................112 tk_snd_mbx tk_snd_mbx(Send Message to Mailbox) .................. 89 tk_srea_dev tk_srea_dev(Synchronous Read Device) ................ 216 tk_sta_alm tk_sta_alm(Start Alarm Handler) ............................179 tk_sta_cyc tk_sta_cyc(Start Cyclic Handler) ............................171 tk_sta_tsk tk_sta_tsk (Start Task) .............................................. 30 tk_stp_alm tk_stp_alm(Stop Alarm Handler) ............................180 tk_stp_cyc tk_stp_cyc(Stop Cyclic Handler) ............................172 tk_sus_dev tk_sus_dev(Suspend Device) ..................................224 tk_sus_tsk tk_sus_tsk(Suspend Task) .........................................55 tk_swri_dev tk_swri_dev(Synchronous Write Device) ............... 220 tk_ter_tsk tk_ter_tsk(Terminate Task) .......................................33 tk_unl_mtx tk_unl_mtx(Unlock Mutex) .................................... 103 tk_wai_dev tk_wai_dev(Wait Device) .......................................222 tk_wai_flg tk_wai_flg(Wait Event Flag) ....................................79 tk_wai_sem tk_wai_sem(Wait on Semaphore) ............................. 69 tk_wri_dev tk_wri_dev(Write Device) ...................................... 218 tk_wup_tsk tk_wup_tsk(Wakeup Task) .......................................49 U Unlock tk_unl_mtx(Unlock Mutex) .................................... 103 V Variable tk_cre_mpl(Create Variable-size Memory Pool) ..........................................................................149 tk_del_mpl(Delete Variable-size Memory Pool) ..........................................................................152 tk_get_mpl(Get Variable-size Memory Block) ..........................................................................153 tk_ref_mpl(Refer Variable-size Memory Pool Status) ........................................................................... 157 tk_rel_mpl(Release Variable-size Memory Block) ..........................................................................155 Variable-size tk_cre_mpl(Create Variable-size Memory Pool) ..........................................................................149 tk_del_mpl(Delete Variable-size Memory Pool) ..........................................................................152 CM81-00210-2a, January 31, 2014 索引 Support Soft Ma nual tk_get_mpl(Get Variable-size Memory Block) ..........................................................................153 tk_ref_mpl(Refer Variable-size Memory Pool Status) ...........................................................................157 tk_rel_mpl(Release Variable-size Memory Block) ..........................................................................155 Version tk_ref_ver(Refer Version Information) ...................199 あ W イベントフラグ機能 イベントフラグ機能のシステムコール ..............73 Wait tk_rel_wai(Release Wait) ..........................................53 tk_wai_dev(Wait Device) .......................................222 tk_wai_flg(Wait Event Flag) ....................................79 tk_wai_sem(Wait on Semaphore) .............................69 Wakeup tk_can_wup(Cancel Wakeup Task) ..........................51 tk_wup_tsk(Wakeup Task) .......................................49 Write tk_swri_dev(Synchronous Write Device) ...............220 tk_wri_dev(Write Device) ......................................218 アラームハンドラ機能 アラームハンドラ機能のシステムコール ..........................................................................175 い え エラーコード エラーコード ............................................................ 4 エラーコード一覧 ................................................258 か 拡張仕様 拡張仕様 .................................................................... 8 拡張同期 拡張同期・通信機能のシステムコール ..............95 可変長メモリプール機能 可変長メモリプール機能のシステムコール ..........................................................................148 き 基本的な用語 T-REALOS の基本的な用語 ..................................2 こ 固定長メモリプール機能 固定長メモリプール機能のシステムコール ..........................................................................137 さ 索引 システムコール索引 ............................................ 264 サブシステム機能 サブシステム機能のシステムコール ................ 201 し 時間管理機能 時間管理機能のシステムコール ........................ 159 システムコール アラームハンドラ機能のシステムコール ..........................................................................175 イベントフラグ機能のシステムコール ..............73 拡張同期・通信機能のシステムコール ..............95 可変長メモリプール機能のシステムコール ..........................................................................148 固定長メモリプール機能のシステムコール ..........................................................................137 サブシステム機能のシステムコール ................ 201 January 31, 2014, CM81-00210-2a 275 索引 Su pp or t 時間管理機能のシステムコール .........................159 システムコール .........................................................4 システムコール一覧 ...............................................16 システムコール索引 .............................................264 システムコール説明内容 .......................................23 システム時刻管理機能のシステムコール ..........................................................................160 システム状態管理機能のシステムコール ..........................................................................190 周期ハンドラ機能のシステムコール .................166 セマフォ機能のシステムコール ...........................63 タスク管理機能のシステムコール .......................25 タスク付属同期機能のシステムコール ...............46 デバイス管理機能のシステムコール .................206 同期・通信機能のシステムコール .......................62 ミューテックス機能のシステムコール ...............96 メールボックス機能のシステムコール ...............85 メッセージバッファ機能のシステムコール ..........................................................................107 メモリプール管理機能のシステムコール ..........................................................................136 ランデブポート機能のシステムコール .............118 割込み管理機能のシステムコール .....................183 システム時刻管理機能 システム時刻管理機能のシステムコール ..........................................................................160 システム状態管理機能 システム状態管理機能のシステムコール ..........................................................................190 実装依存 実装依存 .....................................................................7 実装定義 実装定義 .....................................................................5 周期ハンドラ機能 周期ハンドラ機能のシステムコール .................166 せ セマフォ機能 セマフォ機能のシステムコール ...........................63 た タスク管理機能 タスク管理機能のシステムコール .......................25 タスク付属同期機能 タスク付属同期機能のシステムコール ...............46 つ 通信 同期・通信機能のシステムコール .......................62 通信機能 拡張同期・通信機能のシステムコール ............................................................................95 So ft Manu al データ型 T-Kernel 固有の意味を持つデータ型の一覧 ............................................................................12 データ型 .................................................................... 4 汎用的なデータ型 ..................................................10 デバイス管理機能 デバイス管理機能のシステムコール ................ 206 と 同期 同期・通信機能のシステムコール ...................... 62 は 汎用的なデータ型 汎用的なデータ型 ..................................................10 ま マクロ 定数マクロ一覧 ....................................................259 み ミューテックス機能 ミューテックス機能のシステムコール ............................................................................96 め メールボックス機能 メールボックス機能のシステムコール ............................................................................85 メッセージバッファ機能 メッセージバッファ機能のシステムコール ..........................................................................107 メモリプール管理機能 メモリプール管理機能のシステムコール ..........................................................................136 ら ランデブポート機能 ランデブポート機能のシステムコール ..........................................................................118 わ 割込み管理機能 割込み管理機能のシステムコール .................... 183 て 定数マクロ 定数マクロ一覧 .....................................................259 276 CM81-00210-2a, January 31, 2014 Support Soft Ma nual CM81-00210-2a Spansion • CONTROLLER MANUAL FM3 ファミリ T-Kernel 仕様準拠 T-REALOS/M3 API リファレンス 2014 年 1 月 第2.1 版発行 発行 Spansion Inc. 編集 マーケティングコミュニケーション部 January 31, 2014, CM81-00210-2a 277 Su pp or t So ft Manu al 免責事項 本資料に記載された製品は、通常の産業用 , 一般事務用 , パーソナル用 , 家庭用などの一般的用途 ( ただし、用途の限定はあ りません ) に使用されることを意図して設計・製造されています。(1) 極めて高度な安全性が要求され、仮に当該安全性が 確保されない場合、社会的に重大な影響を与えかつ直接生命・身体に対する重大な危険性を伴う用途 ( 原子力施設における 核反応制御 , 航空機自動飛行制御 , 航空交通管制 , 大量輸送システムにおける運行制御 , 生命維持のための医療機器 , 兵器シ ステムにおけるミサイル発射制御等をいう ) 、ならびに (2) 極めて高い信頼性が要求される用途 ( 海底中継器 , 宇宙衛星等を いう ) に使用されるよう設計・製造されたものではありません。上記の製品の使用法によって惹起されたいかなる請求また は損害についても、Spansion は、お客様または第三者、あるいはその両方に対して責任を一切負いません。半導体デバイス はある確率で故障が発生します。当社半導体デバイスが故障しても、結果的に人身事故 , 火災事故 , 社会的な損害を生じさ せないよう、お客様において、装置の冗長設計 , 延焼対策設計 , 過電流防止対策設計 , 誤動作防止設計などの安全設計をお 願いします。本資料に記載された製品が、外国為替及び外国貿易法、米国輸出管理関連法規などの規制に基づき規制され ている製品または技術に該当する場合には、本製品の輸出に際して、同法に基づく許可が必要となります。 商標および注記 このドキュメントは、断りなく変更される場合があります。本資料には Spansion が開発中の Spansion 製品に関する情報が 記載されている場合があります。Spansion は、それらの製品に対し、予告なしに仕様を変更したり、開発を中止したりする 権利を有します。このドキュメントに含まれる情報は、現状のまま、保証なしに提供されるものであり、その正確性 , 完全 性 , 実施可能性および特定の目的に対する適合性やその市場性および他者の権利を侵害しない事を保証するものでなく、ま た、明示 , 黙示または法定されているあらゆる保証をするものでもありません。Spansion は、このドキュメントに含まれる 情報を使用することにより発生したいかなる損害に対しても責任を一切負いません。 Copyright 2010-2014 Spansion Inc. All rights reserved. 商標:Spansion, Spansion ロゴ ( 図形マーク), MirrorBit, MirrorBit Eclipse, ORNAND 及びこれらの組合せは、米国・日 本ほか諸外国におけるSpansion LLC の商標です。第三者の社名・製品名等の記載はここでは情報提供を目的として表記した ものであり、各権利者の商標もしくは登録商標となっている場合があります。 Copyright © 2007 T-Engine Forum All rights reserved. 278 CM81-00210-2a, January 31, 2014