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-2009 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 1694 2010-01-01 15:59:09Z ertl-hiro $
47 #include "kernel_impl.h"
56 #ifndef LOG_ACT_TSK_ENTER
57 #define LOG_ACT_TSK_ENTER(tskid)
58 #endif /* LOG_ACT_TSK_ENTER */
60 #ifndef LOG_ACT_TSK_LEAVE
61 #define LOG_ACT_TSK_LEAVE(ercd)
62 #endif /* LOG_ACT_TSK_LEAVE */
64 #ifndef LOG_IACT_TSK_ENTER
65 #define LOG_IACT_TSK_ENTER(tskid)
66 #endif /* LOG_IACT_TSK_ENTER */
68 #ifndef LOG_IACT_TSK_LEAVE
69 #define LOG_IACT_TSK_LEAVE(ercd)
70 #endif /* LOG_IACT_TSK_LEAVE */
72 #ifndef LOG_CAN_ACT_ENTER
73 #define LOG_CAN_ACT_ENTER(tskid)
74 #endif /* LOG_CAN_ACT_ENTER */
76 #ifndef LOG_CAN_ACT_LEAVE
77 #define LOG_CAN_ACT_LEAVE(ercd)
78 #endif /* LOG_CAN_ACT_LEAVE */
80 #ifndef LOG_EXT_TSK_ENTER
81 #define LOG_EXT_TSK_ENTER()
82 #endif /* LOG_EXT_TSK_ENTER */
84 #ifndef LOG_EXT_TSK_LEAVE
85 #define LOG_EXT_TSK_LEAVE(ercd)
86 #endif /* LOG_EXT_TSK_LEAVE */
88 #ifndef LOG_TER_TSK_ENTER
89 #define LOG_TER_TSK_ENTER(tskid)
90 #endif /* LOG_TER_TSK_ENTER */
92 #ifndef LOG_TER_TSK_LEAVE
93 #define LOG_TER_TSK_LEAVE(ercd)
94 #endif /* LOG_TER_TSK_LEAVE */
96 #ifndef LOG_CHG_PRI_ENTER
97 #define LOG_CHG_PRI_ENTER(tskid, tskpri)
98 #endif /* LOG_CHG_PRI_ENTER */
100 #ifndef LOG_CHG_PRI_LEAVE
101 #define LOG_CHG_PRI_LEAVE(ercd)
102 #endif /* LOG_CHG_PRI_LEAVE */
104 #ifndef LOG_GET_PRI_ENTER
105 #define LOG_GET_PRI_ENTER(tskid, p_tskpri)
106 #endif /* LOG_GET_PRI_ENTER */
108 #ifndef LOG_GET_PRI_LEAVE
109 #define LOG_GET_PRI_LEAVE(ercd, tskpri)
110 #endif /* LOG_GET_PRI_LEAVE */
112 #ifndef LOG_GET_INF_ENTER
113 #define LOG_GET_INF_ENTER(p_exinf)
114 #endif /* LOG_GET_INF_ENTER */
116 #ifndef LOG_GET_INF_LEAVE
117 #define LOG_GET_INF_LEAVE(ercd, exinf)
118 #endif /* LOG_GET_INF_LEAVE */
123 #ifdef TOPPERS_act_tsk
131 LOG_ACT_TSK_ENTER(tskid);
133 CHECK_TSKID_SELF(tskid);
134 p_tcb = get_tcb_self(tskid);
137 if (TSTAT_DORMANT(p_tcb->tstat)) {
138 if (make_active(p_tcb)) {
143 else if (!(p_tcb->actque)) {
144 p_tcb->actque = true;
153 LOG_ACT_TSK_LEAVE(ercd);
157 #endif /* TOPPERS_act_tsk */
160 * タスクの起動(非タスクコンテキスト用)
162 #ifdef TOPPERS_iact_tsk
170 LOG_IACT_TSK_ENTER(tskid);
173 p_tcb = get_tcb(tskid);
176 if (TSTAT_DORMANT(p_tcb->tstat)) {
177 if (make_active(p_tcb)) {
182 else if (!(p_tcb->actque)) {
183 p_tcb->actque = true;
192 LOG_IACT_TSK_LEAVE(ercd);
196 #endif /* TOPPERS_iact_tsk */
201 #ifdef TOPPERS_can_act
209 LOG_CAN_ACT_ENTER(tskid);
211 CHECK_TSKID_SELF(tskid);
212 p_tcb = get_tcb_self(tskid);
215 ercd = p_tcb->actque ? 1 : 0;
216 p_tcb->actque = false;
220 LOG_CAN_ACT_LEAVE(ercd);
224 #endif /* TOPPERS_can_act */
229 #ifdef TOPPERS_ext_tsk
239 if (t_sense_lock()) {
241 * CPUロック状態でext_tskが呼ばれた場合は,CPUロックを解除し
242 * てからタスクを終了する.実装上は,サービスコール内でのCPU
251 * ディスパッチ禁止状態でext_tskが呼ばれた場合は,ディスパッ
252 * チ許可状態にしてからタスクを終了する.
256 if (t_get_ipm() != TIPM_ENAALL) {
258 * 割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
259 * が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
262 t_set_ipm(TIPM_ENAALL);
266 (void) make_non_runnable(p_runtsk);
267 if (!queue_empty(&(p_runtsk->mutex_queue))) {
268 (void) (*mtxhook_release_all)(p_runtsk);
270 make_dormant(p_runtsk);
271 if (p_runtsk->actque) {
272 p_runtsk->actque = false;
273 (void) make_active(p_runtsk);
279 LOG_EXT_TSK_LEAVE(ercd);
283 #endif /* TOPPERS_ext_tsk */
288 #ifdef TOPPERS_ter_tsk
294 bool_t dspreq = false;
297 LOG_TER_TSK_ENTER(tskid);
300 p_tcb = get_tcb(tskid);
301 CHECK_NONSELF(p_tcb);
304 if (TSTAT_DORMANT(p_tcb->tstat)) {
308 if (TSTAT_RUNNABLE(p_tcb->tstat)) {
310 * p_tcbは自タスクでないため,(シングルプロセッサでは)実
311 * 行状態でなく,make_non_runnable(p_tcb)でタスクディスパッ
314 (void) make_non_runnable(p_tcb);
316 else if (TSTAT_WAITING(p_tcb->tstat)) {
317 wait_dequeue_wobj(p_tcb);
318 wait_dequeue_tmevtb(p_tcb);
320 if (!queue_empty(&(p_tcb->mutex_queue))) {
321 if ((*mtxhook_release_all)(p_tcb)) {
327 p_tcb->actque = false;
328 if (make_active(p_tcb)) {
340 LOG_TER_TSK_LEAVE(ercd);
344 #endif /* TOPPERS_ter_tsk */
349 #ifdef TOPPERS_chg_pri
352 chg_pri(ID tskid, PRI tskpri)
358 LOG_CHG_PRI_ENTER(tskid, tskpri);
360 CHECK_TSKID_SELF(tskid);
361 CHECK_TPRI_INI(tskpri);
362 p_tcb = get_tcb_self(tskid);
363 newbpri = (tskpri == TPRI_INI) ? p_tcb->p_tinib->ipriority
364 : INT_PRIORITY(tskpri);
367 if (TSTAT_DORMANT(p_tcb->tstat)) {
370 else if ((!queue_empty(&(p_tcb->mutex_queue))
371 || TSTAT_WAIT_MTX(p_tcb->tstat))
372 && !((*mtxhook_check_ceilpri)(p_tcb, newbpri))) {
376 p_tcb->bpriority = newbpri;
377 if (queue_empty(&(p_tcb->mutex_queue))
378 || !((*mtxhook_scan_ceilmtx)(p_tcb))) {
379 if (change_priority(p_tcb, newbpri, false)) {
388 LOG_CHG_PRI_LEAVE(ercd);
392 #endif /* TOPPERS_chg_pri */
397 #ifdef TOPPERS_get_pri
400 get_pri(ID tskid, PRI *p_tskpri)
405 LOG_GET_PRI_ENTER(tskid, p_tskpri);
407 CHECK_TSKID_SELF(tskid);
408 p_tcb = get_tcb_self(tskid);
411 if (TSTAT_DORMANT(p_tcb->tstat)) {
415 *p_tskpri = EXT_TSKPRI(p_tcb->priority);
421 LOG_GET_PRI_LEAVE(ercd, *p_tskpri);
425 #endif /* TOPPERS_get_pri */
430 #ifdef TOPPERS_get_inf
433 get_inf(intptr_t *p_exinf)
437 LOG_GET_INF_ENTER(p_exinf);
441 *p_exinf = p_runtsk->p_tinib->exinf;
446 LOG_GET_INF_LEAVE(ercd, *p_exinf);
450 #endif /* TOPPERS_get_inf */