#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 | ) |
#define LOG_ACT_TSK_LEAVE | ( | ercd | ) |
#define LOG_CAN_ACT_ENTER | ( | tskid | ) |
#define LOG_CAN_ACT_LEAVE | ( | ercd | ) |
#define LOG_CHG_PRI_ENTER | ( | tskid, | |||
tskpri | ) |
#define LOG_CHG_PRI_LEAVE | ( | ercd | ) |
#define LOG_EXT_TSK_ENTER | ( | ) |
#define LOG_EXT_TSK_LEAVE | ( | ercd | ) |
#define LOG_GET_INF_ENTER | ( | p_exinf | ) |
#define LOG_GET_INF_LEAVE | ( | ercd, | |||
exinf | ) |
#define LOG_GET_PRI_ENTER | ( | tskid, | |||
p_tskpri | ) |
#define LOG_GET_PRI_LEAVE | ( | ercd, | |||
tskpri | ) |
#define LOG_IACT_TSK_ENTER | ( | tskid | ) |
#define LOG_IACT_TSK_LEAVE | ( | ercd | ) |
#define LOG_TER_TSK_ENTER | ( | tskid | ) |
#define LOG_TER_TSK_LEAVE | ( | ercd | ) |
task_manage.c の 125 行で定義されています。
参照先 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 }
task_manage.c の 203 行で定義されています。
参照先 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 }
task_manage.c の 339 行で定義されています。
参照先 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.c の 231 行で定義されています。
参照先 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.c の 411 行で定義されています。
参照先 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 }
task_manage.c の 378 行で定義されています。
参照先 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 }
task_manage.c の 164 行で定義されています。
参照先 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 }
task_manage.c の 287 行で定義されています。
参照先 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.