3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
11 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
40 * @(#) $Id: task_manage.c 1595 2009-06-26 01:59:29Z ertl-hiro $
47 #include "kernel_impl.h"
55 #ifndef LOG_ACT_TSK_ENTER
56 #define LOG_ACT_TSK_ENTER(tskid)
57 #endif /* LOG_ACT_TSK_ENTER */
59 #ifndef LOG_ACT_TSK_LEAVE
60 #define LOG_ACT_TSK_LEAVE(ercd)
61 #endif /* LOG_ACT_TSK_LEAVE */
63 #ifndef LOG_IACT_TSK_ENTER
64 #define LOG_IACT_TSK_ENTER(tskid)
65 #endif /* LOG_IACT_TSK_ENTER */
67 #ifndef LOG_IACT_TSK_LEAVE
68 #define LOG_IACT_TSK_LEAVE(ercd)
69 #endif /* LOG_IACT_TSK_LEAVE */
71 #ifndef LOG_CAN_ACT_ENTER
72 #define LOG_CAN_ACT_ENTER(tskid)
73 #endif /* LOG_CAN_ACT_ENTER */
75 #ifndef LOG_CAN_ACT_LEAVE
76 #define LOG_CAN_ACT_LEAVE(ercd)
77 #endif /* LOG_CAN_ACT_LEAVE */
79 #ifndef LOG_EXT_TSK_ENTER
80 #define LOG_EXT_TSK_ENTER()
81 #endif /* LOG_EXT_TSK_ENTER */
83 #ifndef LOG_EXT_TSK_LEAVE
84 #define LOG_EXT_TSK_LEAVE(ercd)
85 #endif /* LOG_EXT_TSK_LEAVE */
87 #ifndef LOG_TER_TSK_ENTER
88 #define LOG_TER_TSK_ENTER(tskid)
89 #endif /* LOG_TER_TSK_ENTER */
91 #ifndef LOG_TER_TSK_LEAVE
92 #define LOG_TER_TSK_LEAVE(ercd)
93 #endif /* LOG_TER_TSK_LEAVE */
95 #ifndef LOG_CHG_PRI_ENTER
96 #define LOG_CHG_PRI_ENTER(tskid, tskpri)
97 #endif /* LOG_CHG_PRI_ENTER */
99 #ifndef LOG_CHG_PRI_LEAVE
100 #define LOG_CHG_PRI_LEAVE(ercd)
101 #endif /* LOG_CHG_PRI_LEAVE */
103 #ifndef LOG_GET_PRI_ENTER
104 #define LOG_GET_PRI_ENTER(tskid, p_tskpri)
105 #endif /* LOG_GET_PRI_ENTER */
107 #ifndef LOG_GET_PRI_LEAVE
108 #define LOG_GET_PRI_LEAVE(ercd, tskpri)
109 #endif /* LOG_GET_PRI_LEAVE */
111 #ifndef LOG_GET_INF_ENTER
112 #define LOG_GET_INF_ENTER(p_exinf)
113 #endif /* LOG_GET_INF_ENTER */
115 #ifndef LOG_GET_INF_LEAVE
116 #define LOG_GET_INF_LEAVE(ercd, exinf)
117 #endif /* LOG_GET_INF_LEAVE */
122 #ifdef TOPPERS_act_tsk
130 LOG_ACT_TSK_ENTER(tskid);
132 CHECK_TSKID_SELF(tskid);
133 p_tcb = get_tcb_self(tskid);
136 if (TSTAT_DORMANT(p_tcb->tstat)) {
137 if (make_active(p_tcb)) {
142 else if (!(p_tcb->actque)) {
143 p_tcb->actque = true;
152 LOG_ACT_TSK_LEAVE(ercd);
156 #endif /* TOPPERS_act_tsk */
159 * タスクの起動(非タスクコンテキスト用)
161 #ifdef TOPPERS_iact_tsk
169 LOG_IACT_TSK_ENTER(tskid);
172 p_tcb = get_tcb(tskid);
175 if (TSTAT_DORMANT(p_tcb->tstat)) {
176 if (make_active(p_tcb)) {
181 else if (!(p_tcb->actque)) {
182 p_tcb->actque = true;
191 LOG_IACT_TSK_LEAVE(ercd);
195 #endif /* TOPPERS_iact_tsk */
200 #ifdef TOPPERS_can_act
208 LOG_CAN_ACT_ENTER(tskid);
210 CHECK_TSKID_SELF(tskid);
211 p_tcb = get_tcb_self(tskid);
214 ercd = p_tcb->actque ? 1 : 0;
215 p_tcb->actque = false;
219 LOG_CAN_ACT_LEAVE(ercd);
223 #endif /* TOPPERS_can_act */
228 #ifdef TOPPERS_ext_tsk
238 if (t_sense_lock()) {
240 * CPUロック状態でext_tskが呼ばれた場合は,CPUロックを解除し
241 * てからタスクを終了する.実装上は,サービスコール内でのCPU
250 * ディスパッチ禁止状態でext_tskが呼ばれた場合は,ディスパッ
251 * チ許可状態にしてからタスクを終了する.
255 if (t_get_ipm() != TIPM_ENAALL) {
257 * 割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
258 * が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
261 t_set_ipm(TIPM_ENAALL);
265 (void) make_non_runnable(p_runtsk);
266 make_dormant(p_runtsk);
267 if (p_runtsk->actque) {
268 p_runtsk->actque = false;
269 (void) make_active(p_runtsk);
275 LOG_EXT_TSK_LEAVE(ercd);
279 #endif /* TOPPERS_ext_tsk */
284 #ifdef TOPPERS_ter_tsk
292 LOG_TER_TSK_ENTER(tskid);
295 p_tcb = get_tcb(tskid);
296 CHECK_NONSELF(p_tcb);
299 if (TSTAT_DORMANT(p_tcb->tstat)) {
303 if (TSTAT_RUNNABLE(p_tcb->tstat)) {
305 * p_tcbは自タスクでないため,(シングルプロセッサでは)実
306 * 行状態でなく,make_non_runnable(p_tcb)でタスクディスパッ
309 (void) make_non_runnable(p_tcb);
311 else if (TSTAT_WAITING(p_tcb->tstat)) {
312 wait_dequeue_wobj(p_tcb);
313 wait_dequeue_tmevtb(p_tcb);
317 p_tcb->actque = false;
318 if (make_active(p_tcb)) {
327 LOG_TER_TSK_LEAVE(ercd);
331 #endif /* TOPPERS_ter_tsk */
336 #ifdef TOPPERS_chg_pri
339 chg_pri(ID tskid, PRI tskpri)
345 LOG_CHG_PRI_ENTER(tskid, tskpri);
347 CHECK_TSKID_SELF(tskid);
348 CHECK_TPRI_INI(tskpri);
349 p_tcb = get_tcb_self(tskid);
350 newpri = (tskpri == TPRI_INI) ? p_tcb->p_tinib->ipriority
351 : INT_PRIORITY(tskpri);
354 if (TSTAT_DORMANT(p_tcb->tstat)) {
358 if (change_priority(p_tcb, newpri)) {
366 LOG_CHG_PRI_LEAVE(ercd);
370 #endif /* TOPPERS_chg_pri */
375 #ifdef TOPPERS_get_pri
378 get_pri(ID tskid, PRI *p_tskpri)
383 LOG_GET_PRI_ENTER(tskid, p_tskpri);
385 CHECK_TSKID_SELF(tskid);
386 p_tcb = get_tcb_self(tskid);
389 if (TSTAT_DORMANT(p_tcb->tstat)) {
393 *p_tskpri = EXT_TSKPRI(p_tcb->priority);
399 LOG_GET_PRI_LEAVE(ercd, *p_tskpri);
403 #endif /* TOPPERS_get_pri */
408 #ifdef TOPPERS_get_inf
411 get_inf(intptr_t *p_exinf)
415 LOG_GET_INF_ENTER(p_exinf);
419 *p_exinf = p_runtsk->p_tinib->exinf;
424 LOG_GET_INF_LEAVE(ercd, *p_exinf);
428 #endif /* TOPPERS_get_inf */