task_sync.c

#include "kernel_impl.h"
#include "check.h"
#include "task.h"
#include "wait.h"

ソースコードを見る。

マクロ定義

#define LOG_SLP_TSK_ENTER()
#define LOG_SLP_TSK_LEAVE(ercd)
#define LOG_TSLP_TSK_ENTER(tmout)
#define LOG_TSLP_TSK_LEAVE(ercd)
#define LOG_WUP_TSK_ENTER(tskid)
#define LOG_WUP_TSK_LEAVE(ercd)
#define LOG_IWUP_TSK_ENTER(tskid)
#define LOG_IWUP_TSK_LEAVE(ercd)
#define LOG_CAN_WUP_ENTER(tskid)
#define LOG_CAN_WUP_LEAVE(ercd)
#define LOG_REL_WAI_ENTER(tskid)
#define LOG_REL_WAI_LEAVE(ercd)
#define LOG_IREL_WAI_ENTER(tskid)
#define LOG_IREL_WAI_LEAVE(ercd)
#define LOG_SUS_TSK_ENTER(tskid)
#define LOG_SUS_TSK_LEAVE(ercd)
#define LOG_RSM_TSK_ENTER(tskid)
#define LOG_RSM_TSK_LEAVE(ercd)
#define LOG_DLY_TSK_ENTER(dlytim)
#define LOG_DLY_TSK_LEAVE(ercd)

関数

ER slp_tsk (void)
ER tslp_tsk (TMO tmout)
ER wup_tsk (ID tskid)
ER iwup_tsk (ID tskid)
ER_UINT can_wup (ID tskid)
ER rel_wai (ID tskid)
ER irel_wai (ID tskid)
ER sus_tsk (ID tskid)
ER rsm_tsk (ID tskid)
ER dly_tsk (RELTIM dlytim)


マクロ定義

#define LOG_CAN_WUP_ENTER ( tskid   ) 

task_sync.c88 行で定義されています。

参照元 can_wup().

#define LOG_CAN_WUP_LEAVE ( ercd   ) 

task_sync.c92 行で定義されています。

参照元 can_wup().

#define LOG_DLY_TSK_ENTER ( dlytim   ) 

task_sync.c128 行で定義されています。

参照元 dly_tsk().

#define LOG_DLY_TSK_LEAVE ( ercd   ) 

task_sync.c132 行で定義されています。

参照元 dly_tsk().

#define LOG_IREL_WAI_ENTER ( tskid   ) 

task_sync.c104 行で定義されています。

参照元 irel_wai().

#define LOG_IREL_WAI_LEAVE ( ercd   ) 

task_sync.c108 行で定義されています。

参照元 irel_wai().

#define LOG_IWUP_TSK_ENTER ( tskid   ) 

task_sync.c80 行で定義されています。

参照元 iwup_tsk().

#define LOG_IWUP_TSK_LEAVE ( ercd   ) 

task_sync.c84 行で定義されています。

参照元 iwup_tsk().

#define LOG_REL_WAI_ENTER ( tskid   ) 

task_sync.c96 行で定義されています。

参照元 rel_wai().

#define LOG_REL_WAI_LEAVE ( ercd   ) 

task_sync.c100 行で定義されています。

参照元 rel_wai().

#define LOG_RSM_TSK_ENTER ( tskid   ) 

task_sync.c120 行で定義されています。

参照元 rsm_tsk().

#define LOG_RSM_TSK_LEAVE ( ercd   ) 

task_sync.c124 行で定義されています。

参照元 rsm_tsk().

 
#define LOG_SLP_TSK_ENTER (  ) 

task_sync.c56 行で定義されています。

参照元 slp_tsk().

#define LOG_SLP_TSK_LEAVE ( ercd   ) 

task_sync.c60 行で定義されています。

参照元 slp_tsk().

#define LOG_SUS_TSK_ENTER ( tskid   ) 

task_sync.c112 行で定義されています。

参照元 sus_tsk().

#define LOG_SUS_TSK_LEAVE ( ercd   ) 

task_sync.c116 行で定義されています。

参照元 sus_tsk().

#define LOG_TSLP_TSK_ENTER ( tmout   ) 

task_sync.c64 行で定義されています。

参照元 tslp_tsk().

#define LOG_TSLP_TSK_LEAVE ( ercd   ) 

task_sync.c68 行で定義されています。

参照元 tslp_tsk().

#define LOG_WUP_TSK_ENTER ( tskid   ) 

task_sync.c72 行で定義されています。

参照元 wup_tsk().

#define LOG_WUP_TSK_LEAVE ( ercd   ) 

task_sync.c76 行で定義されています。

参照元 wup_tsk().


関数

ER_UINT can_wup ( ID  tskid  ) 

task_sync.c300 行で定義されています。

参照先 CHECK_TSKCTX_UNL, CHECK_TSKID_SELF, E_OBJ, get_tcb_self, LOG_CAN_WUP_ENTER, LOG_CAN_WUP_LEAVE, t_lock_cpu, t_unlock_cpu, task_control_block::tstat, TSTAT_DORMANT, と task_control_block::wupque.

参照元 main_task().

00301 {
00302     TCB     *p_tcb;
00303     ER_UINT ercd;
00304 
00305     LOG_CAN_WUP_ENTER(tskid);
00306     CHECK_TSKCTX_UNL();
00307     CHECK_TSKID_SELF(tskid);
00308     p_tcb = get_tcb_self(tskid);
00309 
00310     t_lock_cpu();
00311     if (TSTAT_DORMANT(p_tcb->tstat)) {
00312         ercd = E_OBJ;
00313     }
00314     else {
00315         ercd = p_tcb->wupque ? 1 : 0;
00316         p_tcb->wupque = false;
00317     }
00318     t_unlock_cpu();
00319 
00320   error_exit:
00321     LOG_CAN_WUP_LEAVE(ercd);
00322     return(ercd);
00323 }

ER dly_tsk ( RELTIM  dlytim  ) 

task_sync.c503 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_PAR, dispatch, LOG_DLY_TSK_ENTER, LOG_DLY_TSK_LEAVE, LOG_TSKSTAT, make_non_runnable, p_runtsk, waiting_information::p_tmevtb, t_lock_cpu, t_unlock_cpu, TMAX_RELTIM, tmevtb_enqueue(), TS_WAIT_DLY, TS_WAITING, wait_tmout_ok, と waiting_information::wercd.

参照元 logtask_flush(), logtask_main(), と task().

00504 {
00505     WINFO   winfo;
00506     TMEVTB  tmevtb;
00507     ER      ercd;
00508 
00509     LOG_DLY_TSK_ENTER(dlytim);
00510     CHECK_DISPATCH();
00511     CHECK_PAR(dlytim <= TMAX_RELTIM);
00512 
00513     t_lock_cpu();
00514     p_runtsk->tstat = (TS_WAITING | TS_WAIT_DLY);
00515     (void) make_non_runnable(p_runtsk);
00516     p_runtsk->p_winfo = &winfo;
00517     winfo.p_tmevtb = &tmevtb;
00518     tmevtb_enqueue(&tmevtb, dlytim, (CBACK) wait_tmout_ok, (void *) p_runtsk);
00519     LOG_TSKSTAT(p_runtsk);
00520     dispatch();
00521     ercd = winfo.wercd;
00522     t_unlock_cpu();
00523 
00524   error_exit:
00525     LOG_DLY_TSK_LEAVE(ercd);
00526     return(ercd);
00527 }

ER irel_wai ( ID  tskid  ) 

task_sync.c368 行で定義されています。

参照先 CHECK_INTCTX_UNL, CHECK_TSKID, E_OBJ, E_OK, get_tcb, i_lock_cpu, i_unlock_cpu, LOG_IREL_WAI_ENTER, LOG_IREL_WAI_LEAVE, reqflg, task_control_block::tstat, TSTAT_WAITING, と wait_release.

00369 {
00370     TCB     *p_tcb;
00371     ER      ercd;
00372 
00373     LOG_IREL_WAI_ENTER(tskid);
00374     CHECK_INTCTX_UNL();
00375     CHECK_TSKID(tskid);
00376     p_tcb = get_tcb(tskid);
00377 
00378     i_lock_cpu();
00379     if (!TSTAT_WAITING(p_tcb->tstat)) {
00380         ercd = E_OBJ;
00381     }
00382     else {
00383         if (wait_release(p_tcb)) {
00384             reqflg = true;
00385         }
00386         ercd = E_OK;
00387     }
00388     i_unlock_cpu();
00389 
00390   error_exit:
00391     LOG_IREL_WAI_LEAVE(ercd);
00392     return(ercd);
00393 }

ER iwup_tsk ( ID  tskid  ) 

task_sync.c258 行で定義されています。

参照先 CHECK_INTCTX_UNL, CHECK_TSKID, E_OBJ, E_OK, E_QOVR, get_tcb, i_lock_cpu, i_unlock_cpu, LOG_IWUP_TSK_ENTER, LOG_IWUP_TSK_LEAVE, reqflg, task_control_block::tstat, TSTAT_DORMANT, TSTAT_WAIT_SLP, wait_complete, と task_control_block::wupque.

00259 {
00260     TCB     *p_tcb;
00261     ER      ercd;
00262 
00263     LOG_IWUP_TSK_ENTER(tskid);
00264     CHECK_INTCTX_UNL();
00265     CHECK_TSKID(tskid);
00266     p_tcb = get_tcb(tskid);
00267 
00268     i_lock_cpu();
00269     if (TSTAT_DORMANT(p_tcb->tstat)) {
00270         ercd = E_OBJ;
00271     }
00272     else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
00273         if (wait_complete(p_tcb)) {
00274             reqflg = true;
00275         }
00276         ercd = E_OK;
00277     }
00278     else if (!(p_tcb->wupque)) {
00279         p_tcb->wupque = true;
00280         ercd = E_OK;
00281     }
00282     else {
00283         ercd = E_QOVR;
00284     }
00285     i_unlock_cpu();
00286 
00287   error_exit:
00288     LOG_IWUP_TSK_LEAVE(ercd);
00289     return(ercd);
00290 }

ER rel_wai ( ID  tskid  ) 

task_sync.c333 行で定義されています。

参照先 CHECK_TSKCTX_UNL, CHECK_TSKID, dispatch, E_OBJ, E_OK, get_tcb, LOG_REL_WAI_ENTER, LOG_REL_WAI_LEAVE, t_lock_cpu, t_unlock_cpu, task_control_block::tstat, TSTAT_WAITING, と wait_release.

参照元 main_task().

00334 {
00335     TCB     *p_tcb;
00336     ER      ercd;
00337 
00338     LOG_REL_WAI_ENTER(tskid);
00339     CHECK_TSKCTX_UNL();
00340     CHECK_TSKID(tskid);
00341     p_tcb = get_tcb(tskid);
00342 
00343     t_lock_cpu();
00344     if (!TSTAT_WAITING(p_tcb->tstat)) {
00345         ercd = E_OBJ;
00346     }
00347     else {
00348         if (wait_release(p_tcb)) {
00349             dispatch();
00350         }
00351         ercd = E_OK;
00352     }
00353     t_unlock_cpu();
00354 
00355   error_exit:
00356     LOG_REL_WAI_LEAVE(ercd);
00357     return(ercd);
00358 }

ER rsm_tsk ( ID  tskid  ) 

task_sync.c457 行で定義されています。

参照先 CHECK_TSKCTX_UNL, CHECK_TSKID, dispatch, E_OBJ, E_OK, get_tcb, LOG_RSM_TSK_ENTER, LOG_RSM_TSK_LEAVE, LOG_TSKSTAT, make_runnable, t_lock_cpu, t_unlock_cpu, TS_SUSPENDED, task_control_block::tstat, TSTAT_SUSPENDED, と TSTAT_WAITING.

参照元 main_task().

00458 {
00459     TCB     *p_tcb;
00460     ER      ercd;
00461 
00462     LOG_RSM_TSK_ENTER(tskid);
00463     CHECK_TSKCTX_UNL();
00464     CHECK_TSKID(tskid);
00465     p_tcb = get_tcb(tskid);
00466 
00467     t_lock_cpu();
00468     if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
00469         ercd = E_OBJ;
00470     }
00471     else if (!TSTAT_WAITING(p_tcb->tstat)) {
00472         /*
00473          *  強制待ち状態から実行できる状態への遷移
00474          */
00475         if (make_runnable(p_tcb)) {
00476             dispatch();
00477         }
00478         ercd = E_OK;
00479     }
00480     else {
00481         /*
00482          *  二重待ち状態から待ち状態への遷移
00483          */
00484         p_tcb->tstat &= ~TS_SUSPENDED;
00485         LOG_TSKSTAT(p_tcb);
00486         ercd = E_OK;
00487     }
00488     t_unlock_cpu();
00489 
00490   error_exit:
00491     LOG_RSM_TSK_LEAVE(ercd);
00492     return(ercd);
00493 }

ER slp_tsk ( void   ) 

task_sync.c141 行で定義されています。

参照先 CHECK_DISPATCH, dispatch, E_OK, LOG_SLP_TSK_ENTER, LOG_SLP_TSK_LEAVE, LOG_TSKSTAT, make_wait(), p_runtsk, t_lock_cpu, t_unlock_cpu, TS_WAIT_SLP, TS_WAITING, と waiting_information::wercd.

参照元 task().

00142 {
00143     WINFO   winfo;
00144     ER      ercd;
00145 
00146     LOG_SLP_TSK_ENTER();
00147     CHECK_DISPATCH();
00148 
00149     t_lock_cpu();
00150     if (p_runtsk->wupque) {
00151         p_runtsk->wupque = false;
00152         ercd = E_OK;
00153     }
00154     else {
00155         p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
00156         make_wait(&winfo);
00157         LOG_TSKSTAT(p_runtsk);
00158         dispatch();
00159         ercd = winfo.wercd;
00160     }
00161     t_unlock_cpu();
00162 
00163   error_exit:
00164     LOG_SLP_TSK_LEAVE(ercd);
00165     return(ercd);
00166 }

ER sus_tsk ( ID  tskid  ) 

task_sync.c403 行で定義されています。

参照先 CHECK_TSKCTX_UNL, CHECK_TSKID_SELF, dispatch, dspflg, E_CTX, E_OBJ, E_OK, E_QOVR, get_tcb_self, LOG_SUS_TSK_ENTER, LOG_SUS_TSK_LEAVE, LOG_TSKSTAT, make_non_runnable, p_runtsk, t_lock_cpu, t_unlock_cpu, TS_SUSPENDED, task_control_block::tstat, TSTAT_DORMANT, TSTAT_RUNNABLE, と TSTAT_SUSPENDED.

参照元 main_task().

00404 {
00405     TCB     *p_tcb;
00406     ER      ercd;
00407 
00408     LOG_SUS_TSK_ENTER(tskid);
00409     CHECK_TSKCTX_UNL();
00410     CHECK_TSKID_SELF(tskid);
00411     p_tcb = get_tcb_self(tskid);
00412 
00413     t_lock_cpu();
00414     if (p_tcb == p_runtsk && !dspflg) {
00415         ercd = E_CTX;
00416     }
00417     else if (TSTAT_DORMANT(p_tcb->tstat)) {
00418         ercd = E_OBJ;
00419     }
00420     else if (TSTAT_RUNNABLE(p_tcb->tstat)) {
00421         /*
00422          *  実行できる状態から強制待ち状態への遷移
00423          */
00424         p_tcb->tstat = TS_SUSPENDED;
00425         LOG_TSKSTAT(p_tcb);
00426         if (make_non_runnable(p_tcb)) {
00427             dispatch();
00428         }
00429         ercd = E_OK;
00430     }
00431     else if (TSTAT_SUSPENDED(p_tcb->tstat)) {
00432         ercd = E_QOVR;
00433     }
00434     else {
00435         /*
00436          *  待ち状態から二重待ち状態への遷移
00437          */
00438         p_tcb->tstat |= TS_SUSPENDED;
00439         LOG_TSKSTAT(p_tcb);
00440         ercd = E_OK;
00441     }
00442     t_unlock_cpu();
00443 
00444   error_exit:
00445     LOG_SUS_TSK_LEAVE(ercd);
00446     return(ercd);
00447 }

ER tslp_tsk ( TMO  tmout  ) 

task_sync.c176 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_TMOUT, dispatch, E_OK, E_TMOUT, LOG_TSKSTAT, LOG_TSLP_TSK_ENTER, LOG_TSLP_TSK_LEAVE, make_wait_tmout, p_runtsk, t_lock_cpu, t_unlock_cpu, TMO_POL, TS_WAIT_SLP, TS_WAITING, と waiting_information::wercd.

参照元 task().

00177 {
00178     WINFO   winfo;
00179     TMEVTB  tmevtb;
00180     ER      ercd;
00181 
00182     LOG_TSLP_TSK_ENTER(tmout);
00183     CHECK_DISPATCH();
00184     CHECK_TMOUT(tmout);
00185 
00186     t_lock_cpu();
00187     if (p_runtsk->wupque) {
00188         p_runtsk->wupque = false;
00189         ercd = E_OK;
00190     }
00191     else if (tmout == TMO_POL) {
00192         ercd = E_TMOUT;
00193     }
00194     else {
00195         p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
00196         make_wait_tmout(&winfo, &tmevtb, tmout);
00197         LOG_TSKSTAT(p_runtsk);
00198         dispatch();
00199         ercd = winfo.wercd;
00200     }
00201     t_unlock_cpu();
00202 
00203   error_exit:
00204     LOG_TSLP_TSK_LEAVE(ercd);
00205     return(ercd);
00206 }

ER wup_tsk ( ID  tskid  ) 

task_sync.c216 行で定義されています。

参照先 CHECK_TSKCTX_UNL, CHECK_TSKID_SELF, dispatch, E_OBJ, E_OK, E_QOVR, get_tcb_self, LOG_WUP_TSK_ENTER, LOG_WUP_TSK_LEAVE, t_lock_cpu, t_unlock_cpu, task_control_block::tstat, TSTAT_DORMANT, TSTAT_WAIT_SLP, wait_complete, と task_control_block::wupque.

参照元 main_task().

00217 {
00218     TCB     *p_tcb;
00219     ER      ercd;
00220 
00221     LOG_WUP_TSK_ENTER(tskid);
00222     CHECK_TSKCTX_UNL();
00223     CHECK_TSKID_SELF(tskid);
00224     p_tcb = get_tcb_self(tskid);
00225 
00226     t_lock_cpu();
00227     if (TSTAT_DORMANT(p_tcb->tstat)) {
00228         ercd = E_OBJ;
00229     }
00230     else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
00231         if (wait_complete(p_tcb)) {
00232             dispatch();
00233         }
00234         ercd = E_OK;
00235     }
00236     else if (!(p_tcb->wupque)) {
00237         p_tcb->wupque = true;
00238         ercd = E_OK;
00239     }
00240     else {
00241         ercd = E_QOVR;
00242     }
00243     t_unlock_cpu();
00244 
00245   error_exit:
00246     LOG_WUP_TSK_LEAVE(ercd);
00247     return(ercd);
00248 }


Copyright © 2008 by Kijineko Inc.

ホームページ制作