OSDN Git Service

(none)
[hos/hos-v4a.git] / kernel / source / object / tsk / ext_tsk.c
1 /** 
2  *  Hyper Operating System V4 Advance
3  *
4  * @file  ext_tsk.c
5  * @brief %jp{タスクの終了}%en{Exit 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 /** %jp{タスクの終了}%en{Exit Task}
18  * @return void
19  */
20 void ext_tsk(void)
21 {
22         _KERNEL_T_TSKHDL     tskhdl;
23         _KERNEL_T_TCB        *tcb;
24         _KERNEL_T_TCB_RO     *tcb_ro;
25         _KERNEL_TSK_T_ACTCNT actcnt;
26
27         /* %jp{実行中タスクを取得} */
28         tskhdl = _KERNEL_SYS_GET_RUNTSK();
29
30         _KERNEL_ENTER_SVC();            /* %jp{enter service-call}%jp{サービスコールに入る} */
31         
32         /* %jp{レディーキューから削除} */
33         _KERNEL_DSP_EXT_TSK(tskhdl);
34
35         /* %jp{TCB取得} */
36         tcb    = _KERNEL_TSK_TSKHDL2TCB(tskhdl);
37         tcb_ro = _KERNEL_TSK_GET_TCB_RO(tskid, tcb);
38         
39         actcnt = _KERNEL_TSK_GET_ACTCNT(tcb);
40         
41         /* %jp{起動要求ネストのチェック} */
42         if ( actcnt > 0 )       /* %jp{起動要求ネストがあるなら再生成} */
43         {
44                 _KERNEL_TSK_T_TPRI   itskpri;
45                 
46                 _KERNEL_TSK_SET_ACTCNT(tcb, actcnt - 1);
47                 itskpri = _KERNEL_TSK_GET_ITSKPRI(tcb_ro);
48                 _KERNEL_TSK_SET_TSKPRI(tcb, itskpri);
49                 _KERNEL_TSK_SET_TSKBPRI(tcb, itskpri);
50                 
51                 /* %jp{レディーキュー再接続} */
52                 _KERNEL_DSP_STA_TSK(tskhdl);                                            
53         }
54         else                            /* %jp{起動要求ネストがなければ終了} */
55         {
56                 _KERNEL_TSK_SET_TSKSTAT(tcb, _KERNEL_TTS_DMT);
57         }
58         
59         /* %jp{タスクディスパッチの実行}%en{task dispatch} */
60         _KERNEL_DSP_TSK();
61         
62         /* %jp{リスタート} */
63         _KERNEL_RST_CTX(
64                                 _KERNEL_TSK_GET_CTXCB(tcb),                             /* %jp{コンテキスト制御ブロック} */
65                                 _KERNEL_TSK_GET_STKSZ(tcb_ro),                          /* %jp{タスクのスタック領域サイズ} */
66                                 _KERNEL_TSK_GET_STK(tcb_ro),                            /* %jp{タスクのスタック領域の先頭番地} */
67                                 _KERNEL_TSK_GET_ISP(tcb_ro),                            /* %jp{スタックポインタの初期値} */
68                                 (FP)_kernel_ent_tsk,                                            /* %jp{コンテキストの開始アドレス} */
69                                 (VP_INT)_KERNEL_TSK_GET_EXINF(tcb_ro),          /* %jp{タスクの拡張情報} */
70                                 (VP_INT)_KERNEL_TSK_GET_TASK(tcb_ro)            /* %jp{タスクの起動番地} */
71                         );
72 }
73
74
75 /* end of file */