task_manage.c

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

ソースコードを見る。

マクロ定義

#define LOG_ACT_TSK_ENTER(tskid)
#define LOG_ACT_TSK_LEAVE(ercd)
#define LOG_IACT_TSK_ENTER(tskid)
#define LOG_IACT_TSK_LEAVE(ercd)
#define LOG_CAN_ACT_ENTER(tskid)
#define LOG_CAN_ACT_LEAVE(ercd)
#define LOG_EXT_TSK_ENTER()
#define LOG_EXT_TSK_LEAVE(ercd)
#define LOG_TER_TSK_ENTER(tskid)
#define LOG_TER_TSK_LEAVE(ercd)
#define LOG_CHG_PRI_ENTER(tskid, tskpri)
#define LOG_CHG_PRI_LEAVE(ercd)
#define LOG_GET_PRI_ENTER(tskid, p_tskpri)
#define LOG_GET_PRI_LEAVE(ercd, tskpri)
#define LOG_GET_INF_ENTER(p_exinf)
#define LOG_GET_INF_LEAVE(ercd, exinf)

関数

ER act_tsk (ID tskid)
ER iact_tsk (ID tskid)
ER_UINT can_act (ID tskid)
ER ext_tsk (void)
ER ter_tsk (ID tskid)
ER chg_pri (ID tskid, PRI tskpri)
ER get_pri (ID tskid, PRI *p_tskpri)
ER get_inf (intptr_t *p_exinf)


マクロ定義

#define LOG_ACT_TSK_ENTER ( tskid   ) 

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

参照元 act_tsk().

#define LOG_ACT_TSK_LEAVE ( ercd   ) 

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

参照元 act_tsk().

#define LOG_CAN_ACT_ENTER ( tskid   ) 

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

参照元 can_act().

#define LOG_CAN_ACT_LEAVE ( ercd   ) 

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

参照元 can_act().

#define LOG_CHG_PRI_ENTER ( tskid,
tskpri   ) 

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

参照元 chg_pri().

#define LOG_CHG_PRI_LEAVE ( ercd   ) 

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

参照元 chg_pri().

 
#define LOG_EXT_TSK_ENTER (  ) 

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

参照元 ext_tsk().

#define LOG_EXT_TSK_LEAVE ( ercd   ) 

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

参照元 ext_tsk().

#define LOG_GET_INF_ENTER ( p_exinf   ) 

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

参照元 get_inf().

#define LOG_GET_INF_LEAVE ( ercd,
exinf   ) 

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

参照元 get_inf().

#define LOG_GET_PRI_ENTER ( tskid,
p_tskpri   ) 

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

参照元 get_pri().

#define LOG_GET_PRI_LEAVE ( ercd,
tskpri   ) 

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

参照元 get_pri().

#define LOG_IACT_TSK_ENTER ( tskid   ) 

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

参照元 iact_tsk().

#define LOG_IACT_TSK_LEAVE ( ercd   ) 

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

参照元 iact_tsk().

#define LOG_TER_TSK_ENTER ( tskid   ) 

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

参照元 ter_tsk().

#define LOG_TER_TSK_LEAVE ( ercd   ) 

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

参照元 ter_tsk().


関数

ER act_tsk ( ID  tskid  ) 

task_manage.c125 行で定義されています。

参照先 task_control_block::actque, CHECK_TSKCTX_UNL, CHECK_TSKID_SELF, dispatch, E_OK, E_QOVR, get_tcb_self, LOG_ACT_TSK_ENTER, LOG_ACT_TSK_LEAVE, make_active, t_lock_cpu, t_unlock_cpu, task_control_block::tstat, と TSTAT_DORMANT.

参照元 main_task().

00126 {
00127     TCB     *p_tcb;
00128     ER      ercd;
00129 
00130     LOG_ACT_TSK_ENTER(tskid);
00131     CHECK_TSKCTX_UNL();
00132     CHECK_TSKID_SELF(tskid);
00133     p_tcb = get_tcb_self(tskid);
00134 
00135     t_lock_cpu();
00136     if (TSTAT_DORMANT(p_tcb->tstat)) {
00137         if (make_active(p_tcb)) {
00138             dispatch();
00139         }
00140         ercd = E_OK;
00141     }
00142     else if (!(p_tcb->actque)) {
00143         p_tcb->actque = true;
00144         ercd = E_OK;
00145     }
00146     else {
00147         ercd = E_QOVR;
00148     }
00149     t_unlock_cpu();
00150 
00151   error_exit:
00152     LOG_ACT_TSK_LEAVE(ercd);
00153     return(ercd);
00154 }

ER_UINT can_act ( ID  tskid  ) 

task_manage.c203 行で定義されています。

参照先 task_control_block::actque, CHECK_TSKCTX_UNL, CHECK_TSKID_SELF, get_tcb_self, LOG_CAN_ACT_ENTER, LOG_CAN_ACT_LEAVE, t_lock_cpu, と t_unlock_cpu.

参照元 main_task().

00204 {
00205     TCB     *p_tcb;
00206     ER_UINT ercd;
00207 
00208     LOG_CAN_ACT_ENTER(tskid);
00209     CHECK_TSKCTX_UNL();
00210     CHECK_TSKID_SELF(tskid);
00211     p_tcb = get_tcb_self(tskid);
00212 
00213     t_lock_cpu();
00214     ercd = p_tcb->actque ? 1 : 0;
00215     p_tcb->actque = false;
00216     t_unlock_cpu();
00217 
00218   error_exit:
00219     LOG_CAN_ACT_LEAVE(ercd);
00220     return(ercd);
00221 }

ER chg_pri ( ID  tskid,
PRI  tskpri 
)

task_manage.c339 行で定義されています。

参照先 change_priority, CHECK_TPRI_INI, CHECK_TSKCTX_UNL, CHECK_TSKID_SELF, dispatch, E_OBJ, E_OK, get_tcb_self, INT_PRIORITY, task_initialization_block::ipriority, LOG_CHG_PRI_ENTER, LOG_CHG_PRI_LEAVE, task_control_block::p_tinib, t_lock_cpu, t_unlock_cpu, TPRI_INI, task_control_block::tstat, と TSTAT_DORMANT.

参照元 main_task().

00340 {
00341     TCB     *p_tcb;
00342     uint_t  newpri;
00343     ER      ercd;
00344 
00345     LOG_CHG_PRI_ENTER(tskid, tskpri);
00346     CHECK_TSKCTX_UNL();
00347     CHECK_TSKID_SELF(tskid);
00348     CHECK_TPRI_INI(tskpri);
00349     p_tcb = get_tcb_self(tskid);
00350     newpri = (tskpri == TPRI_INI) ? p_tcb->p_tinib->ipriority
00351                                         : INT_PRIORITY(tskpri);
00352 
00353     t_lock_cpu();
00354     if (TSTAT_DORMANT(p_tcb->tstat)) {
00355         ercd = E_OBJ;
00356     }
00357     else {
00358         if (change_priority(p_tcb, newpri)) {
00359             dispatch();
00360         }
00361         ercd = E_OK;
00362     }
00363     t_unlock_cpu();
00364 
00365   error_exit:
00366     LOG_CHG_PRI_LEAVE(ercd);
00367     return(ercd);
00368 }

ER ext_tsk ( void   ) 

task_manage.c231 行で定義されています。

参照先 assert, CHECK_TSKCTX, disdsp, dspflg, exit_and_dispatch, LOG_EXT_TSK_ENTER, LOG_EXT_TSK_LEAVE, make_active, make_dormant, make_non_runnable, p_runtsk, t_get_ipm, t_lock_cpu, t_sense_lock, t_set_ipm, と TIPM_ENAALL.

参照元 task(), と tex_routine().

00232 {
00233     ER      ercd;
00234 
00235     LOG_EXT_TSK_ENTER();
00236     CHECK_TSKCTX();
00237 
00238     if (t_sense_lock()) {
00239         /*
00240          *  CPUロック状態でext_tskが呼ばれた場合は,CPUロックを解除し
00241          *  てからタスクを終了する.実装上は,サービスコール内でのCPU
00242          *  ロックを省略すればよいだけ.
00243          */
00244     }
00245     else {
00246         t_lock_cpu();
00247     }
00248     if (disdsp) {
00249         /*
00250          *  ディスパッチ禁止状態でext_tskが呼ばれた場合は,ディスパッ
00251          *  チ許可状態にしてからタスクを終了する.
00252          */
00253         disdsp = false;
00254     }
00255     if (t_get_ipm() != TIPM_ENAALL) {
00256         /*
00257          *  割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
00258          *  が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
00259          *  る.
00260          */
00261         t_set_ipm(TIPM_ENAALL);
00262     }
00263     dspflg = true;
00264 
00265     (void) make_non_runnable(p_runtsk);
00266     make_dormant(p_runtsk);
00267     if (p_runtsk->actque) {
00268         p_runtsk->actque = false;
00269         (void) make_active(p_runtsk);
00270     }
00271     exit_and_dispatch();
00272     assert(0);
00273 
00274   error_exit:
00275     LOG_EXT_TSK_LEAVE(ercd);
00276     return(ercd);
00277 }

ER get_inf ( intptr_t *  p_exinf  ) 

task_manage.c411 行で定義されています。

参照先 CHECK_TSKCTX_UNL, E_OK, LOG_GET_INF_ENTER, LOG_GET_INF_LEAVE, p_runtsk, t_lock_cpu, と t_unlock_cpu.

00412 {
00413     ER      ercd;
00414 
00415     LOG_GET_INF_ENTER(p_exinf);
00416     CHECK_TSKCTX_UNL();
00417 
00418     t_lock_cpu();
00419     *p_exinf = p_runtsk->p_tinib->exinf;
00420     ercd = E_OK;
00421     t_unlock_cpu();
00422 
00423   error_exit:
00424     LOG_GET_INF_LEAVE(ercd, *p_exinf);
00425     return(ercd);
00426 }

ER get_pri ( ID  tskid,
PRI p_tskpri 
)

task_manage.c378 行で定義されています。

参照先 CHECK_TSKCTX_UNL, CHECK_TSKID_SELF, E_OBJ, E_OK, EXT_TSKPRI, get_tcb_self, LOG_GET_PRI_ENTER, LOG_GET_PRI_LEAVE, task_control_block::priority, t_lock_cpu, t_unlock_cpu, task_control_block::tstat, と TSTAT_DORMANT.

参照元 main_task().

00379 {
00380     TCB     *p_tcb;
00381     ER      ercd;
00382 
00383     LOG_GET_PRI_ENTER(tskid, p_tskpri);
00384     CHECK_TSKCTX_UNL();
00385     CHECK_TSKID_SELF(tskid);
00386     p_tcb = get_tcb_self(tskid);
00387 
00388     t_lock_cpu();
00389     if (TSTAT_DORMANT(p_tcb->tstat)) {
00390         ercd = E_OBJ;
00391     }
00392     else {
00393         *p_tskpri = EXT_TSKPRI(p_tcb->priority);
00394         ercd = E_OK;
00395     }
00396     t_unlock_cpu();
00397 
00398   error_exit:
00399     LOG_GET_PRI_LEAVE(ercd, *p_tskpri);
00400     return(ercd);
00401 }

ER iact_tsk ( ID  tskid  ) 

task_manage.c164 行で定義されています。

参照先 task_control_block::actque, CHECK_INTCTX_UNL, CHECK_TSKID, E_OK, E_QOVR, get_tcb, i_lock_cpu, i_unlock_cpu, LOG_IACT_TSK_ENTER, LOG_IACT_TSK_LEAVE, make_active, reqflg, task_control_block::tstat, と TSTAT_DORMANT.

00165 {
00166     TCB     *p_tcb;
00167     ER      ercd;
00168 
00169     LOG_IACT_TSK_ENTER(tskid);
00170     CHECK_INTCTX_UNL();
00171     CHECK_TSKID(tskid);
00172     p_tcb = get_tcb(tskid);
00173 
00174     i_lock_cpu();
00175     if (TSTAT_DORMANT(p_tcb->tstat)) {
00176         if (make_active(p_tcb)) {
00177             reqflg = true;
00178         }
00179         ercd = E_OK;
00180     }
00181     else if (!(p_tcb->actque)) {
00182         p_tcb->actque = true;
00183         ercd = E_OK;
00184     }
00185     else {
00186         ercd = E_QOVR;
00187     }
00188     i_unlock_cpu();
00189 
00190   error_exit:
00191     LOG_IACT_TSK_LEAVE(ercd);
00192     return(ercd);
00193 }

ER ter_tsk ( ID  tskid  ) 

task_manage.c287 行で定義されています。

参照先 task_control_block::actque, CHECK_NONSELF, CHECK_TSKCTX_UNL, CHECK_TSKID, dispatch, E_OBJ, E_OK, get_tcb, LOG_TER_TSK_ENTER, LOG_TER_TSK_LEAVE, make_active, make_dormant, make_non_runnable, t_lock_cpu, t_unlock_cpu, task_control_block::tstat, TSTAT_DORMANT, TSTAT_RUNNABLE, TSTAT_WAITING, wait_dequeue_tmevtb(), と wait_dequeue_wobj().

参照元 main_task().

00288 {
00289     TCB     *p_tcb;
00290     ER      ercd;
00291 
00292     LOG_TER_TSK_ENTER(tskid);
00293     CHECK_TSKCTX_UNL();
00294     CHECK_TSKID(tskid);
00295     p_tcb = get_tcb(tskid);
00296     CHECK_NONSELF(p_tcb);
00297 
00298     t_lock_cpu();
00299     if (TSTAT_DORMANT(p_tcb->tstat)) {
00300         ercd = E_OBJ;
00301     }
00302     else {
00303         if (TSTAT_RUNNABLE(p_tcb->tstat)) {
00304             /*
00305              *  p_tcbは自タスクでないため,(シングルプロセッサでは)実
00306              *  行状態でなく,make_non_runnable(p_tcb)でタスクディスパッ
00307              *  チが必要になることはない.
00308              */
00309             (void) make_non_runnable(p_tcb);
00310         }
00311         else if (TSTAT_WAITING(p_tcb->tstat)) {
00312             wait_dequeue_wobj(p_tcb);
00313             wait_dequeue_tmevtb(p_tcb);
00314         }
00315         make_dormant(p_tcb);
00316         if (p_tcb->actque) {
00317             p_tcb->actque = false;
00318             if (make_active(p_tcb)) {
00319                 dispatch();
00320             }
00321         }
00322         ercd = E_OK;
00323     }
00324     t_unlock_cpu();
00325 
00326   error_exit:
00327     LOG_TER_TSK_LEAVE(ercd);
00328     return(ercd);
00329 }


Copyright © 2008 by Kijineko Inc.

ホームページ制作