#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 | ) |
#define LOG_CAN_WUP_LEAVE | ( | ercd | ) |
#define LOG_DLY_TSK_ENTER | ( | dlytim | ) |
#define LOG_DLY_TSK_LEAVE | ( | ercd | ) |
#define LOG_IREL_WAI_ENTER | ( | tskid | ) |
#define LOG_IREL_WAI_LEAVE | ( | ercd | ) |
#define LOG_IWUP_TSK_ENTER | ( | tskid | ) |
#define LOG_IWUP_TSK_LEAVE | ( | ercd | ) |
#define LOG_REL_WAI_ENTER | ( | tskid | ) |
#define LOG_REL_WAI_LEAVE | ( | ercd | ) |
#define LOG_RSM_TSK_ENTER | ( | tskid | ) |
#define LOG_RSM_TSK_LEAVE | ( | ercd | ) |
#define LOG_SLP_TSK_ENTER | ( | ) |
#define LOG_SLP_TSK_LEAVE | ( | ercd | ) |
#define LOG_SUS_TSK_ENTER | ( | tskid | ) |
#define LOG_SUS_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 | ) |
task_sync.c の 300 行で定義されています。
参照先 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 }
task_sync.c の 503 行で定義されています。
参照先 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 }
task_sync.c の 368 行で定義されています。
参照先 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 }
task_sync.c の 258 行で定義されています。
参照先 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 }
task_sync.c の 333 行で定義されています。
参照先 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 }
task_sync.c の 457 行で定義されています。
参照先 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.c の 141 行で定義されています。
参照先 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 }
task_sync.c の 403 行で定義されています。
参照先 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 }
task_sync.c の 176 行で定義されています。
参照先 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 }
task_sync.c の 216 行で定義されています。
参照先 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.