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_sync.c,v 1.1 2009/01/31 05:27:37 suikan Exp $
43 #include "jsp_kernel.h"
64 runtsk->wupcnt = FALSE;
68 runtsk->tstat = (TS_WAITING | TS_WAIT_SLEEP);
77 LOG_SLP_TSK_LEAVE(ercd);
81 #endif /* __slp_tsk */
95 LOG_TSLP_TSK_ENTER(tmout);
100 if (runtsk->wupcnt) {
101 runtsk->wupcnt = FALSE;
104 else if (tmout == TMO_POL) {
108 runtsk->tstat = (TS_WAITING | TS_WAIT_SLEEP);
109 make_wait_tmout(&winfo, &tmevtb, tmout);
117 LOG_TSLP_TSK_LEAVE(ercd);
121 #endif /* __tslp_tsk */
135 LOG_WUP_TSK_ENTER(tskid);
137 CHECK_TSKID_SELF(tskid);
138 tcb = get_tcb_self(tskid);
141 if (TSTAT_DORMANT(tstat = tcb->tstat)) {
144 else if ((tstat & TS_WAIT_SLEEP) != 0) {
145 if (wait_complete(tcb)) {
150 else if (!(tcb->wupcnt)) {
160 LOG_WUP_TSK_LEAVE(ercd);
164 #endif /* __wup_tsk */
167 * タスクの起床(非タスクコンテキスト用)
178 LOG_IWUP_TSK_ENTER(tskid);
181 tcb = get_tcb(tskid);
184 if (TSTAT_DORMANT(tstat = tcb->tstat)) {
187 else if ((tstat & TS_WAIT_SLEEP) != 0) {
188 if (wait_complete(tcb)) {
193 else if (!(tcb->wupcnt)) {
203 LOG_IWUP_TSK_LEAVE(ercd);
207 #endif /* __iwup_tsk */
220 LOG_CAN_WUP_ENTER(tskid);
222 CHECK_TSKID_SELF(tskid);
223 tcb = get_tcb_self(tskid);
226 if (TSTAT_DORMANT(tcb->tstat)) {
230 ercd = tcb->wupcnt ? 1 : 0;
236 LOG_CAN_WUP_LEAVE(ercd);
240 #endif /* __can_wup */
253 LOG_REL_WAI_ENTER(tskid);
256 tcb = get_tcb(tskid);
259 if (!(TSTAT_WAITING(tcb->tstat))) {
263 if (wait_release(tcb)) {
271 LOG_REL_WAI_LEAVE(ercd);
275 #endif /* __rel_wai */
278 * 待ち状態の強制解除(非タスクコンテキスト用)
288 LOG_IREL_WAI_ENTER(tskid);
291 tcb = get_tcb(tskid);
294 if (!(TSTAT_WAITING(tcb->tstat))) {
298 if (wait_release(tcb)) {
306 LOG_IREL_WAI_LEAVE(ercd);
310 #endif /* __irel_wai */
324 LOG_SUS_TSK_ENTER(tskid);
326 CHECK_TSKID_SELF(tskid);
327 tcb = get_tcb_self(tskid);
330 if (tcb == runtsk && !(enadsp)) {
333 else if (TSTAT_DORMANT(tstat = tcb->tstat)) {
336 else if (TSTAT_RUNNABLE(tstat)) {
338 * 実行できる状態から強制待ち状態への遷移
340 tcb->tstat = TS_SUSPENDED;
342 if (make_non_runnable(tcb)) {
347 else if (TSTAT_SUSPENDED(tstat)) {
354 tcb->tstat |= TS_SUSPENDED;
361 LOG_SUS_TSK_LEAVE(ercd);
365 #endif /* __sus_tsk */
379 LOG_RSM_TSK_ENTER(tskid);
382 tcb = get_tcb(tskid);
385 if (!(TSTAT_SUSPENDED(tstat = tcb->tstat))) {
388 else if (!(TSTAT_WAITING(tstat))) {
390 * 強制待ち状態から実行できる状態への遷移
392 if (make_runnable(tcb)) {
401 tcb->tstat &= ~TS_SUSPENDED;
408 LOG_RSM_TSK_LEAVE(ercd);
412 #endif /* __rsm_tsk */
417 * JSPカーネルでは,frsm_tsk と rsm_tsk は同一の処理となる.frsm_tsk
418 * が呼ばれると,frsm_tsk と rsm_tsk の両方のサービスコールのトレース
419 * ログが出力される.ログ取得後に rsm_tsk のトレースログを削除するこ
420 * とが必要である.rsm_tsk のトレースログを正しく削除するためには,タ
421 * スクディスパッチのログと,タスク例外処理のログも取得することが必要
431 LOG_FRSM_TSK_ENTER(tskid);
432 ercd = rsm_tsk(tskid);
433 LOG_FRSM_TSK_LEAVE(ercd);
437 #endif /* __frsm_tsk */
445 dly_tsk(RELTIM dlytim)
451 LOG_DLY_TSK_ENTER(dlytim);
453 CHECK_PAR(dlytim <= TMAX_RELTIM);
456 runtsk->tstat = TS_WAITING;
457 make_non_runnable(runtsk);
458 runtsk->winfo = &winfo;
459 winfo.tmevtb = &tmevtb;
460 tmevtb_enqueue(&tmevtb, dlytim, (CBACK) wait_tmout_ok, (VP) runtsk);
467 LOG_DLY_TSK_LEAVE(ercd);
471 #endif /* __dly_tsk */