wait.h

説明を見る。
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.

ホームページ制作