3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
9 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
10 * によって公表されている GNU General Public License の Version 2 に記
11 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
36 * @(#) $Id: task_manage.c,v 1.1 2009/01/31 05:27:37 suikan Exp $
43 #include "jsp_kernel.h"
59 LOG_ACT_TSK_ENTER(tskid);
61 CHECK_TSKID_SELF(tskid);
62 tcb = get_tcb_self(tskid);
65 if (TSTAT_DORMANT(tcb->tstat)) {
66 if (make_active(tcb)) {
71 else if (!(tcb->actcnt)) {
81 LOG_ACT_TSK_LEAVE(ercd);
85 #endif /* __act_tsk */
98 LOG_IACT_TSK_ENTER(tskid);
101 tcb = get_tcb(tskid);
104 if (TSTAT_DORMANT(tcb->tstat)) {
105 if (make_active(tcb)) {
110 else if (!(tcb->actcnt)) {
120 LOG_IACT_TSK_LEAVE(ercd);
124 #endif /* __iact_tsk */
137 LOG_CAN_ACT_ENTER(tskid);
139 CHECK_TSKID_SELF(tskid);
140 tcb = get_tcb_self(tskid);
143 ercd = tcb->actcnt ? 1 : 0;
148 LOG_CAN_ACT_LEAVE(ercd);
152 #endif /* __can_act */
164 #ifdef ACTIVATED_STACK_SIZE
166 * create_context と activate_context で,使用中のスタック領
167 * 域を破壊しないように,スタック上にダミー領域を確保する.
169 (void) alloca(ACTIVATED_STACK_SIZE);
170 #endif /* ACTIVATED_STACK_SIZE */
172 if (sense_context()) {
174 * 非タスクコンテキストから ext_tsk が呼ばれた場合,
175 * システムログにエラーを記録し,そのまま実行を続ける
179 "ext_tsk is called from non-task contexts.");
183 * CPUロック状態で ext_tsk が呼ばれた場合は,CPUロック
184 * を解除してからタスクを終了する.実装上は,サービス
185 * コール内でのCPUロックを省略すればよいだけ.
187 syslog_0(LOG_WARNING,
188 "ext_tsk is called from CPU locked state.");
191 if (sense_context()) {
200 * ディスパッチ禁止状態で ext_tsk が呼ばれた場合は,
201 * ディスパッチ許可状態にしてからタスクを終了する.
203 syslog_0(LOG_WARNING,
204 "ext_tsk is called from dispatch disabled state.");
210 #endif /* __ext_tsk */
224 LOG_TER_TSK_ENTER(tskid);
227 tcb = get_tcb(tskid);
231 if (TSTAT_DORMANT(tstat = tcb->tstat)) {
235 if (TSTAT_RUNNABLE(tstat)) {
236 make_non_runnable(tcb);
238 else if (TSTAT_WAITING(tstat)) {
244 if (make_active(tcb)) {
253 LOG_TER_TSK_LEAVE(ercd);
257 #endif /* __ter_tsk */
265 chg_pri(ID tskid, PRI tskpri)
272 LOG_CHG_PRI_ENTER(tskid, tskpri);
274 CHECK_TSKID_SELF(tskid);
275 CHECK_TPRI_INI(tskpri);
276 tcb = get_tcb_self(tskid);
277 newpri = (tskpri == TPRI_INI) ? tcb->tinib->ipriority
278 : INT_PRIORITY(tskpri);
281 if (TSTAT_DORMANT(tstat = tcb->tstat)) {
284 else if (TSTAT_RUNNABLE(tstat)) {
285 if (change_priority(tcb, newpri)) {
291 tcb->priority = newpri;
292 if ((tstat & TS_WAIT_WOBJCB) != 0) {
293 wobj_change_priority(((WINFO_WOBJ *)(tcb->winfo))
301 LOG_CHG_PRI_LEAVE(ercd);
305 #endif /* __chg_pri */
313 get_pri(ID tskid, PRI *p_tskpri)
318 LOG_GET_PRI_ENTER(tskid, p_tskpri);
320 CHECK_TSKID_SELF(tskid);
321 tcb = get_tcb_self(tskid);
324 if (TSTAT_DORMANT(tcb->tstat)) {
328 *p_tskpri = EXT_TSKPRI(tcb->priority);
334 LOG_GET_PRI_LEAVE(ercd, *p_tskpri);
338 #endif /* __get_pri */