2 * Hyper Operating System V4 Advance
5 * @brief %jp{タスクの終了}%en{Exit Task}
7 * Copyright (C) 1998-2006 by Project HOS
8 * http://sourceforge.jp/projects/hos/
13 #include "core/core.h"
17 /** %jp{タスクの終了}%en{Exit Task}
22 _KERNEL_T_TSKHDL tskhdl;
24 _KERNEL_T_TCB_RO *tcb_ro;
25 _KERNEL_TSK_T_ACTCNT actcnt;
28 tskhdl = _KERNEL_SYS_GET_RUNTSK();
30 _KERNEL_ENTER_SVC(); /* %jp{enter service-call}%jp{サービスコールに入る} */
32 /* %jp{レディーキューから削除} */
33 _KERNEL_DSP_EXT_TSK(tskhdl);
36 tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl);
37 tcb_ro = _KERNEL_TSK_GET_TCB_RO(tskid, tcb);
39 actcnt = _KERNEL_TSK_GET_ACTCNT(tcb);
41 /* %jp{起動要求ネストのチェック} */
42 if ( actcnt > 0 ) /* %jp{起動要求ネストがあるなら再生成} */
44 _KERNEL_TSK_T_TPRI itskpri;
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);
52 _KERNEL_DSP_STA_TSK(tskhdl);
54 else /* %jp{起動要求ネストがなければ終了} */
56 _KERNEL_TSK_SET_TSKSTAT(tcb, _KERNEL_TTS_DMT);
59 /* %jp{タスクディスパッチの実行}%en{task dispatch} */
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{タスクの起動番地} */