tcb.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: tcb.h,v 1.2 2006/03/13 07:21:58 honda Exp $
00039  */
00040 
00053 #ifndef _TCB_H_
00054 #define _TCB_H_
00055 
00056 typedef struct task_control_block TCB;
00057 typedef struct task_initialization_block TINIB;
00058 
00059 #include "queue.h"
00060 #include "time_event.h"
00061 
00062 /*
00063  *  タスク優先度の内部表現・外部表現変換マクロ
00064  */
00065 #define INT_PRIORITY(x)     ((UINT)((x) - TMIN_TPRI))
00066 #define EXT_TSKPRI(x)       ((PRI)(x) + TMIN_TPRI)
00067 
00068 /*
00069  *  タスク状態の内部表現
00070  *
00071  *  TCB 中のタスク状態では,実行状態(RUNNING)と実行可能状態(READY)
00072  *  は区別しない.二重待ち状態は,(TS_WAITING | TS_SUSPENDED) で表す.
00073  *  TS_WAIT_???? は,待ち状態に伴う付属状態を表し,待ち状態(二重待ち
00074  *  状態を含む)の場合にのみ設定される.
00075  */
00076 #define TS_DORMANT      0x00u   /* 休止状態 */
00077 #define TS_RUNNABLE     0x01u   /* 実行できる状態 */
00078 #define TS_WAITING      0x02u   /* 待ち状態 */
00079 #define TS_SUSPENDED    0x04u   /* 強制待ち状態 */
00080 
00081 #define TS_WAIT_SLEEP   0x08u   /* 起床待ち状態 */
00082 #define TS_WAIT_WOBJ    0x10u   /* 同期・通信オブジェクトに対する待ち状態 */
00083 #define TS_WAIT_WOBJCB  0x20u   /* 共通部分の待ちキューにつながっている */
00084 
00085 /*
00086  *  タスク状態判別マクロ
00087  *
00088  *  TSTAT_DORMANT はタスクが休止状態であるかどうかを,TSTAT_RUNNABLE 
00089  *  はタスクが実行できる状態であるかどうかを判別する.TSTAT_WAITING は
00090  *  待ち状態と二重待ち状態のいずれかであるかどうかを,TSTAT_SUSPENDED 
00091  *  は強制待ち状態と二重待ち状態のいずれかであるかどうかを判別する.
00092  */
00093 #define TSTAT_DORMANT(tstat)    ((tstat) == TS_DORMANT)
00094 #define TSTAT_RUNNABLE(tstat)   (((tstat) & TS_RUNNABLE) != 0)
00095 #define TSTAT_WAITING(tstat)    (((tstat) & TS_WAITING) != 0)
00096 #define TSTAT_SUSPENDED(tstat)  (((tstat) & TS_SUSPENDED) != 0)
00097 
00140 typedef union waiting_information {
00141     ER  wercd;      /* 待ち解除時のエラーコード */
00142     TMEVTB  *tmevtb;    /* 待ち状態用のタイムイベントブロック */
00143 } WINFO;
00144 
00158 struct task_initialization_block {
00159     ATR     tskatr;     /* タスク属性 */
00160     VP_INT  exinf;      /* タスクの拡張情報 */
00161     FP      task;       /* タスクの起動番地 */
00162     UINT    ipriority;  /* タスクの起動時優先度(内部表現) */
00163     SIZE    stksz;      /* スタック領域のサイズ(丸めた値) */
00164     VP      stk;        /* スタック領域の先頭番地 */
00165 
00166     ATR texatr;     /* タスク例外処理ルーチン属性 */
00167     FP  texrtn;     /* タスク例外処理ルーチンの起動番地 */
00168 };
00169 
00170 /*
00171  *  TCB 中のフィールドのビット幅の定義
00172  *
00173  *  TCB 中のフィールドの配置は,性能に大きく影響すると思われるため,ター
00174  *  ゲット依存にフィールドのビット幅を変更することを許している.
00175  */
00176 #ifndef TBIT_TCB_TSTAT
00177 #define TBIT_TCB_TSTAT      6   /* tstat フィールドのビット幅 */
00178 #endif /* TBIT_TCB_TSTAT */
00179 
00180 #ifndef TBIT_TCB_PRIORITY
00181 #define TBIT_TCB_PRIORITY   4   /* priority フィールドのビット幅 */
00182 #endif /* TBIT_TCB_PRIORITY */
00183 
00193 struct task_control_block {
00194     QUEUE   task_queue; /* タスクキュー */
00195     const TINIB *tinib; /* タスク初期化ブロックへのポインタ */
00196 
00197     UINT    tstat : TBIT_TCB_TSTAT;     /* タスク状態(内部表現)*/
00198     UINT    priority : TBIT_TCB_PRIORITY;   /* 現在の優先度(内部表現)*/
00199     unsigned int    actcnt : 1;     /* 起動要求キューイング */
00200     unsigned int    wupcnt : 1;     /* 起床要求キューイング */
00201     unsigned int    enatex : 1;     /* タスク例外処理許可状態 */
00202     
00203     TEXPTN  texptn;         /* 保留例外要因 */
00204     WINFO   *winfo;         /* 待ち情報ブロックへのポインタ */
00205     CTXB    tskctxb;        /* タスクコンテキストブロック */
00206     
00207     ID      clsid;          /* クラスID */
00208     BOOL    pend_tertsk;    /* タスクの強制終了保留 */
00209     BOOL    pend_chgpri;    /* 優先度変更保留 */
00210     BOOL    pend_relwai;    /* タスク強制待ち解除保留 */
00211     BOOL    terflg;         /* exit_and_dispatch要求 */
00212     UINT    pend_newpri;    /* 優先度変更保留の新優先度(内部表現)*/
00213 };
00214 
00215 #endif /*_TCB_H_*/

Copyright © 2006 by TAKAGI Nobuhisa.
このページは Mon Apr 3 23:49:13 2006 に Doxygen によって生成されました。