|
|
task.h説明を見る。00001 /* 00002 * TOPPERS/FDMP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Function Distributed Multiprocessor Kernel 00005 * 00006 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 00007 * Toyohashi Univ. of Technology, JAPAN 00008 * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory 00009 * Graduate School of Information Science, Nagoya Univ., JAPAN 00010 * 00011 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 00012 * によって公表されている GNU General Public License の Version 2 に記 00013 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 00014 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 00015 * 利用と呼ぶ)することを無償で許諾する. 00016 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00017 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00018 * スコード中に含まれていること. 00019 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00020 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00021 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00022 * の無保証規定を掲載すること. 00023 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00024 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00025 * と. 00026 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00027 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00028 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00029 * 報告すること. 00030 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00031 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00032 * 00033 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00034 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 00035 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 00036 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 00037 * 00038 * @(#) $Id: task.h,v 1.3 2006/03/21 09:01:57 honda Exp $ 00039 */ 00040 00045 #ifndef _TASK_H_ 00046 #define _TASK_H_ 00047 00051 typedef struct task_control_block TCB; 00052 typedef struct task_initialization_block TINIB; 00053 00054 #include "queue.h" 00055 #include "class.h" 00056 #include "time_event.h" 00057 00058 /* 00059 * タスク優先度の内部表現・外部表現変換マクロ 00060 */ 00061 #define INT_PRIORITY(x) ((UINT)((x) - TMIN_TPRI)) 00062 #define EXT_TSKPRI(x) ((PRI)(x) + TMIN_TPRI) 00063 00064 /* 00065 * タスク状態の内部表現 00066 * 00067 * TCB 中のタスク状態では,実行状態(RUNNING)と実行可能状態(READY) 00068 * は区別しない.二重待ち状態は,(TS_WAITING | TS_SUSPENDED) で表す. 00069 * TS_WAIT_???? は,待ち状態に伴う付属状態を表し,待ち状態(二重待ち 00070 * 状態を含む)の場合にのみ設定される. 00071 */ 00072 #define TS_DORMANT 0x00u /* 休止状態 */ 00073 #define TS_RUNNABLE 0x01u /* 実行できる状態 */ 00074 #define TS_WAITING 0x02u /* 待ち状態 */ 00075 #define TS_SUSPENDED 0x04u /* 強制待ち状態 */ 00076 00077 #define TS_WAIT_SLEEP 0x08u /* 起床待ち状態 */ 00078 #define TS_WAIT_WOBJ 0x10u /* 同期・通信オブジェクトに対する待ち状態 */ 00079 #define TS_WAIT_WOBJCB 0x20u /* 共通部分の待ちキューにつながっている */ 00080 00081 /* 00082 * タスク状態判別マクロ 00083 * 00084 * TSTAT_DORMANT はタスクが休止状態であるかどうかを,TSTAT_RUNNABLE 00085 * はタスクが実行できる状態であるかどうかを判別する.TSTAT_WAITING は 00086 * 待ち状態と二重待ち状態のいずれかであるかどうかを,TSTAT_SUSPENDED 00087 * は強制待ち状態と二重待ち状態のいずれかであるかどうかを判別する. 00088 */ 00089 #define TSTAT_DORMANT(tstat) ((tstat) == TS_DORMANT) 00090 #define TSTAT_RUNNABLE(tstat) (((tstat) & TS_RUNNABLE) != 0) 00091 #define TSTAT_WAITING(tstat) (((tstat) & TS_WAITING) != 0) 00092 #define TSTAT_SUSPENDED(tstat) (((tstat) & TS_SUSPENDED) != 0) 00093 00136 typedef union waiting_information { 00137 ER wercd; /* 待ち解除時のエラーコード */ 00138 TMEVTB *tmevtb; /* 待ち状態用のタイムイベントブロック */ 00139 } WINFO; 00140 00154 struct task_initialization_block { 00155 ATR tskatr; /* タスク属性 */ 00156 VP_INT exinf; /* タスクの拡張情報 */ 00157 FP task; /* タスクの起動番地 */ 00158 UINT ipriority; /* タスクの起動時優先度(内部表現) */ 00159 SIZE stksz; /* スタック領域のサイズ(丸めた値) */ 00160 VP stk; /* スタック領域の先頭番地 */ 00161 00162 ATR texatr; /* タスク例外処理ルーチン属性 */ 00163 FP texrtn; /* タスク例外処理ルーチンの起動番地 */ 00164 }; 00165 00166 /* 00167 * TCB 中のフィールドのビット幅の定義 00168 * 00169 * TCB 中のフィールドの配置は,性能に大きく影響すると思われるため,ター 00170 * ゲット依存にフィールドのビット幅を変更することを許している. 00171 */ 00172 #ifndef TBIT_TCB_TSTAT 00173 #define TBIT_TCB_TSTAT 6 /* tstat フィールドのビット幅 */ 00174 #endif /* TBIT_TCB_TSTAT */ 00175 00176 #ifndef TBIT_TCB_PRIORITY 00177 #define TBIT_TCB_PRIORITY 4 /* priority フィールドのビット幅 */ 00178 #endif /* TBIT_TCB_PRIORITY */ 00179 00189 struct task_control_block { 00190 QUEUE task_queue; /* タスクキュー */ 00191 const TINIB *tinib; /* タスク初期化ブロックへのポインタ */ 00192 00193 UINT tstat : TBIT_TCB_TSTAT; /* タスク状態(内部表現)*/ 00194 UINT priority : TBIT_TCB_PRIORITY; /* 現在の優先度(内部表現)*/ 00195 unsigned int actcnt : 1; /* 起動要求キューイング */ 00196 unsigned int wupcnt : 1; /* 起床要求キューイング */ 00197 unsigned int enatex : 1; /* タスク例外処理許可状態 */ 00198 00199 TEXPTN texptn; /* 保留例外要因 */ 00200 WINFO *winfo; /* 待ち情報ブロックへのポインタ */ 00201 CTXB tskctxb; /* タスクコンテキストブロック */ 00202 00203 ID clsid; /* クラスID */ 00204 BOOL pend_tertsk; /* タスクの強制終了保留 */ 00205 BOOL pend_chgpri; /* 優先度変更保留 */ 00206 BOOL pend_relwai; /* タスク強制待ち解除保留 */ 00207 BOOL terflg; /* exit_and_dispatch要求 */ 00208 UINT pend_newpri; /* 優先度変更保留の新優先度(内部表現)*/ 00209 }; 00210 00220 extern TCB *runtsk; 00221 00230 extern TCB *schedtsk; 00231 00238 extern BOOL reqflg; 00239 00246 extern BOOL enadsp; 00247 00255 extern QUEUE ready_queue[TNUM_TPRI]; 00256 00267 extern UINT ready_primap; 00268 00272 extern const ID tmax_tskid; 00273 00277 extern const TINIB tinib_table[]; 00278 00282 extern const ID torder_table[]; 00283 00287 extern TCB tcb_table[]; 00288 00292 #define MY_TNUM_TSK ((UINT)(tmax_tskid - TMIN_ID + 1)) 00293 00294 /* 00295 * CCBとタスクIDからTCBを取り出すためのマクロ 00296 */ 00297 #define INDEX_TSK(tskid) ((UINT)((tskid) - TMIN_ID)) 00298 #define get_tcb(ccb,tskid) \ 00299 (&(((TCB *)(ccb->tsk.cb_table))[INDEX_TSK(tskid)])) 00300 #define get_tcb_self(ccb, tskid) \ 00301 ((tskid) == TSK_SELF ? runtsk : get_tcb(ccb, tskid)) 00302 00306 #define TSKID(tcb) ((ID)(((tcb) - tcb_table) + TMIN_ID)) 00307 00311 #define MTSKID(cb_table, tcb) ((ID)(((tcb) - (TCB*)cb_table) + TMIN_ID)) 00312 00316 extern void task_initialize(); 00317 00321 extern void task_init_activate(); 00322 00329 extern TCB *search_schedtsk(CCB *ccb); 00330 00339 extern BOOL make_runnable(CCB *ccb, TCB *tcb); 00340 00349 extern BOOL make_non_runnable(CCB *ccb, TCB *tcb); 00350 00358 extern void make_dormant(TCB *tcb); 00359 00367 extern BOOL make_active(CCB *ccb, TCB *tcb); 00368 00376 extern BOOL dispatch_request(INT proc_id); 00377 00386 extern BOOL change_priority(CCB *ccb, TCB *tcb, UINT newpri); 00387 00395 extern BOOL rotate_ready_queue(CCB *ccb, UINT pri); 00396 00412 extern void call_texrtn(void); 00413 00421 extern void dispatch_call_texrtn(void); 00422 00434 extern void calltex(void); 00435 00436 #endif /* _TASK_H_ */ Copyright © 2006 by TAKAGI Nobuhisa. このページは Mon Apr 3 23:49:13 2006 に Doxygen によって生成されました。 |