#include "kernel_impl.h"
#include "check.h"
#include "task.h"
#include "wait.h"
#include "semaphore.h"
#include "eventflag.h"
#include "dataqueue.h"
#include "pridataq.h"
#include "mailbox.h"
#include "mempfix.h"
#include "time_event.h"
マクロ定義 | |
#define | LOG_REF_TSK_ENTER(tskid, pk_rtsk) |
#define | LOG_REF_TSK_LEAVE(ercd, pk_rtsk) |
関数 | |
ER | ref_tsk (ID tskid, T_RTSK *pk_rtsk) |
#define LOG_REF_TSK_ENTER | ( | tskid, | |||
pk_rtsk | ) |
#define LOG_REF_TSK_LEAVE | ( | ercd, | |||
pk_rtsk | ) |
task_refer.c の 74 行で定義されています。
参照先 t_rtsk::actcnt, task_control_block::actque, CHECK_TSKCTX_UNL, CHECK_TSKID_SELF, DTQID, E_OK, EXT_TSKPRI, FLGID, get_tcb_self, t_rtsk::lefttmo, LOG_REF_TSK_ENTER, LOG_REF_TSK_LEAVE, MBXID, MPFID, NULL, p_runtsk, waiting_information::p_tmevtb, task_control_block::p_winfo, PDQID, task_control_block::priority, SEMID, t_lock_cpu, t_unlock_cpu, tmevt_lefttim, TMO_FEVR, TS_WAIT_DLY, TS_WAIT_FLG, TS_WAIT_MASK, TS_WAIT_MBX, TS_WAIT_MPF, TS_WAIT_RDTQ, TS_WAIT_RPDQ, TS_WAIT_SDTQ, TS_WAIT_SEM, TS_WAIT_SLP, TS_WAIT_SPDQ, t_rtsk::tskbpri, t_rtsk::tskpri, t_rtsk::tskstat, t_rtsk::tskwait, task_control_block::tstat, TSTAT_DORMANT, TSTAT_SUSPENDED, TSTAT_WAITING, TTS_DMT, TTS_RDY, TTS_RUN, TTS_SUS, TTS_WAI, TTS_WAS, TTW_DLY, TTW_FLG, TTW_MBX, TTW_MPF, TTW_RDTQ, TTW_RPDQ, TTW_SDTQ, TTW_SEM, TTW_SLP, TTW_SPDQ, t_rtsk::wobjid, t_rtsk::wupcnt, と task_control_block::wupque.
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 }
Copyright © 2008 by Kijineko Inc.