00001 /* 00002 * TOPPERS/ASP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Advanced Standard Profile Kernel 00005 * 00006 * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory 00007 * Graduate School of Information Science, Nagoya Univ., JAPAN 00008 * 00009 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 00010 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 00011 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 00012 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00013 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00014 * スコード中に含まれていること. 00015 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00016 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00017 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00018 * の無保証規定を掲載すること. 00019 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00020 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00021 * と. 00022 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00023 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00024 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00025 * 報告すること. 00026 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00027 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00028 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 00029 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 00030 * 免責すること. 00031 * 00032 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00033 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 00034 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 00035 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 00036 * の責任を負わない. 00037 * 00038 * @(#) $Id: task_refer.c 1016 2008-05-10 08:42:16Z ertl-hiro $ 00039 */ 00040 00041 /* 00042 * タスクの状態参照機能 00043 */ 00044 00045 #include "kernel_impl.h" 00046 #include "check.h" 00047 #include "task.h" 00048 #include "wait.h" 00049 #include "semaphore.h" 00050 #include "eventflag.h" 00051 #include "dataqueue.h" 00052 #include "pridataq.h" 00053 #include "mailbox.h" 00054 #include "mempfix.h" 00055 #include "time_event.h" 00056 00057 /* 00058 * トレースログマクロのデフォルト定義 00059 */ 00060 #ifndef LOG_REF_TSK_ENTER 00061 #define LOG_REF_TSK_ENTER(tskid, pk_rtsk) 00062 #endif /* LOG_REF_TSK_ENTER */ 00063 00064 #ifndef LOG_REF_TSK_LEAVE 00065 #define LOG_REF_TSK_LEAVE(ercd, pk_rtsk) 00066 #endif /* LOG_REF_TSK_LEAVE */ 00067 00068 /* 00069 * タスクの状態参照 00070 */ 00071 #ifdef TOPPERS_ref_tsk 00072 00073 ER 00074 ref_tsk(ID tskid, T_RTSK *pk_rtsk) 00075 { 00076 TCB *p_tcb; 00077 uint_t tstat; 00078 ER ercd; 00079 00080 LOG_REF_TSK_ENTER(tskid, pk_rtsk); 00081 CHECK_TSKCTX_UNL(); 00082 CHECK_TSKID_SELF(tskid); 00083 p_tcb = get_tcb_self(tskid); 00084 00085 t_lock_cpu(); 00086 tstat = p_tcb->tstat; 00087 if (TSTAT_DORMANT(tstat)) { 00088 /* 00089 * 対象タスクが休止状態の場合 00090 */ 00091 pk_rtsk->tskstat = TTS_DMT; 00092 } 00093 else { 00094 /* 00095 * タスク状態の取出し 00096 */ 00097 if (TSTAT_SUSPENDED(tstat)) { 00098 if (TSTAT_WAITING(tstat)) { 00099 pk_rtsk->tskstat = TTS_WAS; 00100 } 00101 else { 00102 pk_rtsk->tskstat = TTS_SUS; 00103 } 00104 } 00105 else if (TSTAT_WAITING(tstat)) { 00106 pk_rtsk->tskstat = TTS_WAI; 00107 } 00108 else if (p_tcb == p_runtsk) { 00109 pk_rtsk->tskstat = TTS_RUN; 00110 } 00111 else { 00112 pk_rtsk->tskstat = TTS_RDY; 00113 } 00114 00115 /* 00116 * 現在優先度とベース優先度の取出し 00117 */ 00118 pk_rtsk->tskpri = EXT_TSKPRI(p_tcb->priority); 00119 pk_rtsk->tskbpri = EXT_TSKPRI(p_tcb->priority); 00120 00121 if (TSTAT_WAITING(tstat)) { 00122 /* 00123 * 待ち要因と待ち対象のオブジェクトのIDの取出し 00124 */ 00125 switch (tstat & TS_WAIT_MASK) { 00126 case TS_WAIT_SLP: 00127 pk_rtsk->tskwait = TTW_SLP; 00128 break; 00129 case TS_WAIT_DLY: 00130 pk_rtsk->tskwait = TTW_DLY; 00131 break; 00132 case TS_WAIT_SEM: 00133 pk_rtsk->tskwait = TTW_SEM; 00134 pk_rtsk->wobjid = SEMID(((WINFO_SEM *)(p_tcb->p_winfo)) 00135 ->p_semcb); 00136 break; 00137 case TS_WAIT_FLG: 00138 pk_rtsk->tskwait = TTW_FLG; 00139 pk_rtsk->wobjid = FLGID(((WINFO_FLG *)(p_tcb->p_winfo)) 00140 ->p_flgcb); 00141 break; 00142 case TS_WAIT_SDTQ: 00143 pk_rtsk->tskwait = TTW_SDTQ; 00144 pk_rtsk->wobjid = DTQID(((WINFO_DTQ *)(p_tcb->p_winfo)) 00145 ->p_dtqcb); 00146 break; 00147 case TS_WAIT_RDTQ: 00148 pk_rtsk->tskwait = TTW_RDTQ; 00149 pk_rtsk->wobjid = DTQID(((WINFO_DTQ *)(p_tcb->p_winfo)) 00150 ->p_dtqcb); 00151 break; 00152 case TS_WAIT_SPDQ: 00153 pk_rtsk->tskwait = TTW_SPDQ; 00154 pk_rtsk->wobjid = PDQID(((WINFO_PDQ *)(p_tcb->p_winfo)) 00155 ->p_pdqcb); 00156 break; 00157 case TS_WAIT_RPDQ: 00158 pk_rtsk->tskwait = TTW_RPDQ; 00159 pk_rtsk->wobjid = PDQID(((WINFO_PDQ *)(p_tcb->p_winfo)) 00160 ->p_pdqcb); 00161 break; 00162 case TS_WAIT_MBX: 00163 pk_rtsk->tskwait = TTW_MBX; 00164 pk_rtsk->wobjid = MBXID(((WINFO_MBX *)(p_tcb->p_winfo)) 00165 ->p_mbxcb); 00166 break; 00167 case TS_WAIT_MPF: 00168 pk_rtsk->tskwait = TTW_MPF; 00169 pk_rtsk->wobjid = MPFID(((WINFO_MPF *)(p_tcb->p_winfo)) 00170 ->p_mpfcb); 00171 break; 00172 } 00173 00174 /* 00175 * タイムアウトするまでの時間の取出し 00176 */ 00177 if (p_tcb->p_winfo->p_tmevtb != NULL) { 00178 pk_rtsk->lefttmo 00179 = (TMO) tmevt_lefttim(p_tcb->p_winfo->p_tmevtb); 00180 } 00181 else { 00182 pk_rtsk->lefttmo = TMO_FEVR; 00183 } 00184 } 00185 00186 /* 00187 * 起床要求キューイング数の取出し 00188 */ 00189 pk_rtsk->wupcnt = p_tcb->wupque ? 1U : 0U; 00190 } 00191 00192 /* 00193 * 起動要求キューイング数の取出し 00194 */ 00195 pk_rtsk->actcnt = p_tcb->actque ? 1U : 0U; 00196 ercd = E_OK; 00197 t_unlock_cpu(); 00198 00199 error_exit: 00200 LOG_REF_TSK_LEAVE(ercd, pk_rtsk); 00201 return(ercd); 00202 } 00203 00204 #endif /* TOPPERS_ref_tsk */
Copyright © 2008 by Kijineko Inc.