OSDN Git Service

9464a5c1d2fbf2c0bad819378d9ba4bff20898a4
[hos/hos-v4a.git] / kernel / source / object / tsk / ref_tsk.c
1 /** 
2  *  Hyper Operating System V4 Advance
3  *
4  * @file  wup_tsk.c
5  * @brief %jp{タスクの起床}%en{Wakeup Task}
6  *
7  * Copyright (C) 1998-2006 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12
13 #include "core/core.h"
14
15
16
17 /* タスクの状態参照 */
18 ER ref_tsk(ID tskid, T_RTSK *p_rtsk)
19 {
20         _KERNEL_T_TSKHDL                tskhdl;
21         _KERNEL_T_TCB_PTR               tcb;
22         _KERNEL_T_TCB_RO_PTR    tcb_ro;
23
24         if ( tskid == TSK_SELF )                /* %jp{自タスク指定時の変換} */
25         {
26 #if _KERNEL_SPT_REF_TSK_E_ID
27                 if ( _KERNEL_SYS_SNS_CTX() )
28                 {
29                         return E_ID;            /* %jp{不正ID番号} */
30                 }
31 #endif  
32                 /* %jp{実行中タスクを取得} */
33                 tskhdl = _KERNEL_SYS_GET_RUNTSK();
34
35                 _KERNEL_ENTER_SVC();            /* %jp{enter service-call}%jp{サービスコールに入る} */
36         }
37         else
38         {
39 #if _KERNEL_SPT_REF_TSK_E_ID
40                 if ( !_KERNEL_TSK_CHECK_TSKID(tskid) )
41                 {
42                         return E_ID;    /* %jp{不正ID番号} */
43                 }
44 #endif
45                 
46                 _KERNEL_ENTER_SVC();                    /* %jp{enter service-call}%jp{サービスコールに入る} */
47                 
48                 /* %jp{オブジェクト存在チェック} */
49 #if _KERNEL_SPT_REF_TSK_E_NOEXS
50                 if ( !_KERNEL_TSK_CHECK_EXS(tskid) )
51                 {
52                         _KERNEL_LEAVE_SVC();            /* %jp{leave service-call}%jp{サービスコールを出る} */
53                         return E_NOEXS;                         /* %jp{オブジェクト未生成} */
54                 }
55 #endif
56                 /* ID番号指定時の変換 */
57                 tskhdl = _KERNEL_TSK_ID2TSKHDL(tskid);
58         }
59
60         /* %jp{TCB取得} */
61         tcb    = _KERNEL_TSK_TSKHDL2TCB(tskhdl);
62         tcb_ro = _KERNEL_TSK_GET_TCB_RO(tskid, tcb);
63         
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{強制待ち要求ネスト回数} */
73         
74         
75         /* %jp{以下、独自実装}%en{HOS extention} */
76 #if _KERNEL_SPT_RTSK_TSKATR
77         p_rtsk->tskatr  = _KERNEL_TSK_GET_TSKATR(tcb_ro);                                       /* %jp{タスク属性(HOS独自拡張)} */
78 #endif
79
80 #if _KERNEL_SPT_RTSK_EXINF
81         p_rtsk->exinf   = _KERNEL_TSK_GET_EXINF(tcb_ro);                                        /* %jp{タスクの拡張情報(HOS独自拡張)} */
82 #endif
83
84 #if _KERNEL_SPT_RTSK_TASK
85         p_rtsk->task    = _KERNEL_TSK_GET_TASK(tcb_ro);                                         /* %jp{タスクの起動番地(HOS独自拡張)} */
86 #endif
87 #if _KERNEL_SPT_RTSK_ITSKPRI
88         p_rtsk->itskpri = _KERNEL_TSK_GET_ITSKPRI(tcb_ro);                                      /* %jp{タスクの起動時優先度(HOS独自拡張)} */
89 #endif
90 #if _KERNEL_SPT_RTSK_STKSZ
91         p_rtsk->stksz   = _KERNEL_TSK_GET_STKSZ(tcb_ro);                                        /* %jp{スタック領域のサイズ(バイト数)(HOS独自拡張)} */
92 #endif
93 #if _KERNEL_SPT_RTSK_STK
94         p_rtsk->stk     = _KERNEL_TSK_GET_STK(tcb_ro);                                          /* %jp{スタック領域の先頭番地(HOS独自拡張)} */
95 #endif
96
97
98         _KERNEL_LEAVE_SVC();    /* %jp{サービスコール終了} */
99
100         return E_OK;
101 }
102
103
104 /* end of file */