00001 /* 00002 * TOPPERS/ASP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Advanced Standard Profile Kernel 00005 * 00006 * Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory 00007 * Toyohashi Univ. of Technology, JAPAN 00008 * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory 00009 * Graduate School of Information Science, Nagoya Univ., JAPAN 00010 * 00011 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 00012 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 00013 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 00014 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00015 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00016 * スコード中に含まれていること. 00017 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00018 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00019 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00020 * の無保証規定を掲載すること. 00021 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00022 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00023 * と. 00024 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00025 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00026 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00027 * 報告すること. 00028 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00029 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00030 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 00031 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 00032 * 免責すること. 00033 * 00034 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00035 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 00036 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 00037 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 00038 * の責任を負わない. 00039 * 00040 * @(#) $Id: wait.h 748 2008-03-07 17:18:06Z hiro $ 00041 */ 00042 00043 /* 00044 * 待ち状態管理モジュール 00045 */ 00046 00047 #ifndef TOPPERS_WAIT_H 00048 #define TOPPERS_WAIT_H 00049 00050 #include "task.h" 00051 #include "time_event.h" 00052 00053 /* 00054 * タスクの優先度順の待ちキューへの挿入 00055 * 00056 * p_tcbで指定されるタスクを,タスク優先度順のキューp_queueに挿入する. 00057 * キューの中に同じ優先度のタスクがある場合には,その最後に挿入する. 00058 */ 00059 Inline void 00060 queue_insert_tpri(QUEUE *p_queue, TCB *p_tcb) 00061 { 00062 QUEUE *p_entry; 00063 uint_t priority = p_tcb->priority; 00064 00065 for (p_entry = p_queue->p_next; p_entry != p_queue; 00066 p_entry = p_entry->p_next) { 00067 if (priority < ((TCB *) p_entry)->priority) { 00068 break; 00069 } 00070 } 00071 queue_insert_prev(p_entry, &(p_tcb->task_queue)); 00072 } 00073 00074 /* 00075 * 待ち状態への移行 00076 * 00077 * 実行中のタスクを待ち状態に移行させる.具体的には,実行中のタスクを 00078 * レディキューから削除し,TCBのp_winfoフィールド,WINFOのp_tmevtbフィー 00079 * ルドを設定する. 00080 */ 00081 Inline void 00082 make_wait(WINFO *p_winfo) 00083 { 00084 (void) make_non_runnable(p_runtsk); 00085 p_runtsk->p_winfo = p_winfo; 00086 p_winfo->p_tmevtb = NULL; 00087 } 00088 00089 /* 00090 * 待ち状態への移行(タイムアウト指定) 00091 * 00092 * 実行中のタスクを,タイムアウト指定付きで待ち状態に移行させる.具体 00093 * 的には,実行中のタスクをレディキューから削除し,TCBのp_winfoフィー 00094 * ルド,WINFOのp_tmevtbフィールドを設定する.また,タイムイベントブ 00095 * ロックを登録する. 00096 */ 00097 extern void make_wait_tmout(WINFO *p_winfo, TMEVTB *p_tmevtb, TMO tmout); 00098 00099 /* 00100 * オブジェクト待ちキューからの削除 00101 * 00102 * p_tcbで指定されるタスクが,同期・通信オブジェクトの待ちキューにつ 00103 * ながれていれば,待ちキューから削除する. 00104 */ 00105 Inline void 00106 wait_dequeue_wobj(TCB *p_tcb) 00107 { 00108 if (TSTAT_WAIT_WOBJ(p_tcb->tstat)) { 00109 queue_delete(&(p_tcb->task_queue)); 00110 } 00111 } 00112 00113 /* 00114 * 時間待ちのためのタイムイベントブロックの登録解除 00115 * 00116 * p_tcbで指定されるタスクに対して,時間待ちのためのタイムイベントブ 00117 * ロックが登録されていれば,それを登録解除する. 00118 */ 00119 Inline void 00120 wait_dequeue_tmevtb(TCB *p_tcb) 00121 { 00122 if (p_tcb->p_winfo->p_tmevtb != NULL) { 00123 tmevtb_dequeue(p_tcb->p_winfo->p_tmevtb); 00124 } 00125 } 00126 00127 /* 00128 * 待ち解除 00129 * 00130 * p_tcbで指定されるタスクの待ち状態を解除する.具体的には,タイムイ 00131 * ベントブロックが登録されていれば,それを登録解除する.また,タスク 00132 * 状態を更新し,待ち解除したタスクからの返値をE_OKとする.待ちキュー 00133 * からの削除は行わない.待ち解除したタスクへのディスパッチが必要な場 00134 * 合にはtrueを返す. 00135 */ 00136 extern bool_t wait_complete(TCB *p_tcb); 00137 00138 /* 00139 * タイムアウトに伴う待ち解除 00140 * 00141 * p_tcbで指定されるタスクが,待ちキューにつながれていれば待ちキュー 00142 * から削除し,タスク状態を更新する.また,待ち解除したタスクからの返 00143 * 値を,wait_tmoutではE_TMOUT,wait_tmout_okではE_OKとする.待ち解除 00144 * したタスクへのディスパッチが必要な時は,reqflgをtrueにする. 00145 * 00146 * wait_tmout_okは,dly_tskで使うためのもので,待ちキューから削除する 00147 * 処理を行わない. 00148 * 00149 * いずれの関数も,タイムイベントのコールバック関数として用いるための 00150 * もので,割込みハンドラから呼び出されることを想定している. 00151 */ 00152 extern void wait_tmout(TCB *p_tcb); 00153 extern void wait_tmout_ok(TCB *p_tcb); 00154 00155 /* 00156 * 待ち状態の強制解除 00157 * 00158 * p_tcbで指定されるタスクの待ち状態を強制的に解除する.具体的には, 00159 * タスクが待ちキューにつながれていれば待ちキューから削除し,タイムイ 00160 * ベントブロックが登録されていればそれを登録解除する.また,タスクの 00161 * 状態を更新し,待ち解除したタスクからの返値をE_RLWAIとする.また, 00162 * 待ち解除したタスクへのディスパッチが必要な場合にはtrueを返す. 00163 */ 00164 extern bool_t wait_release(TCB *p_tcb); 00165 00166 /* 00167 * 待ちキューの先頭のタスクID 00168 * 00169 * p_wait_queueで指定した待ちキューの先頭のタスクIDを返す.待ちキュー 00170 * が空の場合には,TSK_NONEを返す. 00171 */ 00172 Inline ID 00173 wait_tskid(QUEUE *p_wait_queue) 00174 { 00175 if (!queue_empty(p_wait_queue)) { 00176 return(TSKID((TCB *) p_wait_queue->p_next)); 00177 } 00178 else { 00179 return(TSK_NONE); 00180 } 00181 } 00182 00183 /* 00184 * 同期・通信オブジェクトの管理ブロックの共通部分操作ルーチン 00185 * 00186 * 同期・通信オブジェクトの初期化ブロックと管理ブロックの先頭部分は共 00187 * 通になっている.以下は,その共通部分を扱うための型およびルーチン群 00188 * である. 00189 * 00190 * 複数の待ちキューを持つ同期・通信オブジェクトの場合,先頭以外の待ち 00191 * キューを操作する場合には,これらのルーチンは使えない.また,オブジェ 00192 * クト属性のTA_TPRIビットを参照するので,このビットを他の目的に使って 00193 * いる場合も,これらのルーチンは使えない. 00194 */ 00195 00196 /* 00197 * 同期・通信オブジェクトの初期化ブロックの共通部分 00198 */ 00199 typedef struct wait_object_initialization_block { 00200 ATR wobjatr; /* オブジェクト属性 */ 00201 } WOBJINIB; 00202 00203 /* 00204 * 同期・通信オブジェクトの管理ブロックの共通部分 00205 */ 00206 typedef struct wait_object_control_block { 00207 QUEUE wait_queue; /* 待ちキュー */ 00208 const WOBJINIB *p_wobjinib; /* 初期化ブロックへのポインタ */ 00209 } WOBJCB; 00210 00211 /* 00212 * 同期・通信オブジェクトの待ち情報ブロックの共通部分 00213 * 00214 * この構造体は,待ち情報ブロック(WINFO)を拡張(オブジェクト指向言 00215 * 語の継承に相当)したものであるが,WINFOが共用体で定義されているた 00216 * めに,1つのフィールドとして含めている. 00217 */ 00218 typedef struct wait_object_waiting_information { 00219 WINFO winfo; /* 標準の待ち情報ブロック */ 00220 WOBJCB *p_wobjcb; /* 待ちオブジェクトの管理ブロック */ 00221 } WINFO_WOBJ; 00222 00223 /* 00224 * 同期・通信オブジェクトに対する待ち状態への移行 00225 * 00226 * 実行中のタスクを待ち状態に移行させ,同期・通信オブジェクトの待ちキュー 00227 * につなぐ.また,待ち情報ブロック(WINFO)のp_wobjcbを設定する. 00228 * wobj_make_wait_tmoutは,タイムイベントブロックの登録も行う. 00229 */ 00230 extern void wobj_make_wait(WOBJCB *p_wobjcb, WINFO_WOBJ *p_winfo); 00231 extern void wobj_make_wait_tmout(WOBJCB *p_wobjcb, WINFO_WOBJ *p_winfo, 00232 TMEVTB *p_tmevtb, TMO tmout); 00233 00234 /* 00235 * タスク優先度変更時の処理 00236 * 00237 * 同期・通信オブジェクトに対する待ち状態にあるタスクの優先度が変更さ 00238 * れた場合に,待ちキューの中でのタスクの位置を修正する. 00239 */ 00240 Inline void 00241 wobj_change_priority(WOBJCB *p_wobjcb, TCB *p_tcb) 00242 { 00243 if ((p_wobjcb->p_wobjinib->wobjatr & TA_TPRI) != 0U) { 00244 queue_delete(&(p_tcb->task_queue)); 00245 queue_insert_tpri(&(p_wobjcb->wait_queue), p_tcb); 00246 } 00247 } 00248 00249 /* 00250 * 待ちキューの初期化 00251 * 00252 * 待ちキューにつながれているタスクをすべて待ち解除する.待ち解除した 00253 * タスクからの返値は,E_DLTとする.待ち解除したタスクへのディスパッチ 00254 * が必要な場合はtrue,そうでない場合はfalseを返す. 00255 */ 00256 extern bool_t init_wait_queue(QUEUE *p_wait_queue); 00257 00258 #endif /* TOPPERS_WAIT_H */
Copyright © 2008 by Kijineko Inc.