2 * Hyper Operating System V4 Advance
5 * @brief %jp{タスクの起床}%en{Wakeup Task}
7 * Copyright (C) 1998-2006 by Project HOS
8 * http://sourceforge.jp/projects/hos/
13 #include "core/core.h"
18 ER ref_tsk(ID tskid, T_RTSK *p_rtsk)
20 _KERNEL_T_TSKHDL tskhdl;
21 _KERNEL_T_TCB_PTR tcb;
22 _KERNEL_T_TCB_RO_PTR tcb_ro;
24 if ( tskid == TSK_SELF ) /* %jp{自タスク指定時の変換} */
26 #if _KERNEL_SPT_REF_TSK_E_ID
27 if ( _KERNEL_SYS_SNS_CTX() )
29 return E_ID; /* %jp{不正ID番号} */
33 tskhdl = _KERNEL_SYS_GET_RUNTSK();
35 _KERNEL_ENTER_SVC(); /* %jp{enter service-call}%jp{サービスコールに入る} */
39 #if _KERNEL_SPT_REF_TSK_E_ID
40 if ( !_KERNEL_TSK_CHECK_TSKID(tskid) )
42 return E_ID; /* %jp{不正ID番号} */
46 _KERNEL_ENTER_SVC(); /* %jp{enter service-call}%jp{サービスコールに入る} */
48 /* %jp{オブジェクト存在チェック} */
49 #if _KERNEL_SPT_REF_TSK_E_NOEXS
50 if ( !_KERNEL_TSK_CHECK_EXS(tskid) )
52 _KERNEL_LEAVE_SVC(); /* %jp{leave service-call}%jp{サービスコールを出る} */
53 return E_NOEXS; /* %jp{オブジェクト未生成} */
57 tskhdl = _KERNEL_TSK_ID2TSKHDL(tskid);
61 tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl);
62 tcb_ro = _KERNEL_TSK_GET_TCB_RO(tskid, tcb);
64 p_rtsk->tskstat = _KERNEL_DEC_TTS(_KERNEL_TSK_GET_TSKSTAT(tcb)); /* %jp{タスク状態} */
65 p_rtsk->tskpri = _KERNEL_TSK_GET_TSKPRI(tcb); /* %jp{タスクの現在優先度} */
66 p_rtsk->tskbpri = _KERNEL_TSK_GET_TSKBPRI(tcb); /* %jp{タスクのベース優先度} */
67 p_rtsk->tskwait = _KERNEL_DEC_TTW(_KERNEL_TSK_GET_TSKWAIT(tcb)); /* %jp{待ち要因} */
68 p_rtsk->wobjid = _KERNEL_TSK_GET_WOBJID(tcb); /* %jp{待ち対象のオブジェクトのID番号} */
69 /* p_rtsk->lefttmo = _KERNEL_TSK_GET_LEFTTMO(tskhdl); */ /* %jp{タイムアウトするまでの時間} */
70 p_rtsk->actcnt = _KERNEL_TSK_GET_ACTCNT(tcb); /* %jp{起動要求キューイング回数} */
71 p_rtsk->wupcnt = _KERNEL_TSK_GET_WUPCNT(tcb); /* %jp{起床要求キューイング回数} */
72 p_rtsk->suscnt = _KERNEL_TSK_GET_SUSCNT(tcb); /* %jp{強制待ち要求ネスト回数} */
75 /* %jp{以下、独自実装}%en{HOS extention} */
76 #if _KERNEL_SPT_RTSK_TSKATR
77 p_rtsk->tskatr = _KERNEL_TSK_GET_TSKATR(tcb_ro); /* %jp{タスク属性(HOS独自拡張)} */
80 #if _KERNEL_SPT_RTSK_EXINF
81 p_rtsk->exinf = _KERNEL_TSK_GET_EXINF(tcb_ro); /* %jp{タスクの拡張情報(HOS独自拡張)} */
84 #if _KERNEL_SPT_RTSK_TASK
85 p_rtsk->task = (FP)_KERNEL_TSK_GET_TASK(tcb_ro); /* %jp{タスクの起動番地(HOS独自拡張)} */
87 #if _KERNEL_SPT_RTSK_ITSKPRI
88 p_rtsk->itskpri = _KERNEL_TSK_GET_ITSKPRI(tcb_ro); /* %jp{タスクの起動時優先度(HOS独自拡張)} */
90 #if _KERNEL_SPT_RTSK_STKSZ
91 p_rtsk->stksz = _KERNEL_TSK_GET_STKSZ(tcb_ro); /* %jp{スタック領域のサイズ(バイト数)(HOS独自拡張)} */
93 #if _KERNEL_SPT_RTSK_STK
94 p_rtsk->stk = _KERNEL_TSK_GET_STK(tcb_ro); /* %jp{スタック領域の先頭番地(HOS独自拡張)} */
98 _KERNEL_LEAVE_SVC(); /* %jp{サービスコール終了} */