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 によって生成されました。