ER sus_tsk(ID tskid) { TCB *p_tcb; ER ercd; LOG_SUS_TSK_ENTER(tskid); CHECK_TSKCTX_UNL(); /*[NGKI1299][NGKI1300]*/ if (tskid == TSK_SELF) { p_tcb = p_runtsk; /*[NGKI1310]*/ } else { CHECK_ID(VALID_TSKID(tskid)); /*[NGKI1302]*/ p_tcb = get_tcb(tskid); } lock_cpu(); if (p_tcb == p_runtsk && !dspflg) { /*[NGKI1311][NGKI3604]*/ ercd = E_CTX; } else if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; /*[NGKI1303]*/ } else if (TSTAT_DORMANT(p_tcb->tstat)) { ercd = E_OBJ; /*[NGKI1305]*/ } else if (p_tcb->raster) { ercd = E_RASTER; /*[NGKI3605]*/ } else if (TSTAT_RUNNABLE(p_tcb->tstat)) { /* * 実行できる状態から強制待ち状態への遷移[NGKI1307] */ p_tcb->tstat = TS_SUSPENDED; LOG_TSKSTAT(p_tcb); make_non_runnable(p_tcb); if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; } else if (TSTAT_SUSPENDED(p_tcb->tstat)) { ercd = E_QOVR; /*[NGKI1306]*/ } else { /* * 待ち状態から二重待ち状態への遷移[NGKI1308] */ p_tcb->tstat |= TS_SUSPENDED; LOG_TSKSTAT(p_tcb); ercd = E_OK; } unlock_cpu(); error_exit: LOG_SUS_TSK_LEAVE(ercd); return(ercd); }
ER sus_tsk(ID tskid) { TCB *p_tcb; ER ercd; LOG_SUS_TSK_ENTER(tskid); CHECK_TSKCTX_UNL(); CHECK_TSKID_SELF(tskid); p_tcb = get_tcb_self(tskid); t_lock_cpu(); if (p_tcb == p_runtsk && !dspflg) { ercd = E_CTX; } else if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_tcb->p_tinib->acvct.acptn2)) { ercd = E_OACV; } else if (TSTAT_DORMANT(p_tcb->tstat)) { ercd = E_OBJ; } else if (TSTAT_RUNNABLE(p_tcb->tstat)) { /* * 実行できる状態から強制待ち状態への遷移 */ p_tcb->tstat = TS_SUSPENDED; LOG_TSKSTAT(p_tcb); if (make_non_runnable(p_tcb)) { dispatch(); } ercd = E_OK; } else if (TSTAT_SUSPENDED(p_tcb->tstat)) { ercd = E_QOVR; } else { /* * 待ち状態から二重待ち状態への遷移 */ p_tcb->tstat |= TS_SUSPENDED; LOG_TSKSTAT(p_tcb); ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_SUS_TSK_LEAVE(ercd); return(ercd); }
ER get_tst(ID tskid, STAT *p_tskstat) { TCB *p_tcb; uint_t tstat; ER ercd; LOG_GET_TST_ENTER(tskid, p_tskstat); CHECK_TSKCTX_UNL(); /*[NGKI3614][NGKI3615]*/ if (tskid == TSK_SELF) { p_tcb = p_runtsk; /*[NGKI3621]*/ } else { CHECK_ID(VALID_TSKID(tskid)); /*[NGKI3616]*/ p_tcb = get_tcb(tskid); } lock_cpu(); tstat = p_tcb->tstat; if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; /*[NGKI3617]*/ } else if (TSTAT_DORMANT(tstat)) { /*[NGKI3620]*/ *p_tskstat = TTS_DMT; } else if (TSTAT_SUSPENDED(tstat)) { if (TSTAT_WAITING(tstat)) { *p_tskstat = TTS_WAS; } else { *p_tskstat = TTS_SUS; } } else if (TSTAT_WAITING(tstat)) { *p_tskstat = TTS_WAI; } else if (p_tcb == p_runtsk) { *p_tskstat = TTS_RUN; } else { *p_tskstat = TTS_RDY; } ercd = E_OK; unlock_cpu(); error_exit: LOG_GET_TST_LEAVE(ercd, p_tskstat); return(ercd); }
SYSCALL ER sus_tsk(ID tskid) { TCB *tcb; UINT tstat; ER ercd; LOG_SUS_TSK_ENTER(tskid); CHECK_TSKCTX_UNL(); CHECK_TSKID_SELF(tskid); tcb = get_tcb_self(tskid); t_lock_cpu(); if (tcb == runtsk && !(enadsp)) { ercd = E_CTX; } else if (TSTAT_DORMANT(tstat = tcb->tstat)) { ercd = E_OBJ; } else if (TSTAT_RUNNABLE(tstat)) { /* * 実行できる状態から強制待ち状態への遷移 */ tcb->tstat = TS_SUSPENDED; LOG_TSKSTAT(tcb); if (make_non_runnable(tcb)) { dispatch(); } ercd = E_OK; } else if (TSTAT_SUSPENDED(tstat)) { ercd = E_QOVR; } else { /* * 待ち状態から二重待ち状態への遷移 */ tcb->tstat |= TS_SUSPENDED; LOG_TSKSTAT(tcb); ercd = E_OK; } t_unlock_cpu(); exit: LOG_SUS_TSK_LEAVE(ercd); return(ercd); }
ER rsm_tsk(ID tskid) { TCB *p_tcb; ER ercd; LOG_RSM_TSK_ENTER(tskid); CHECK_TSKCTX_UNL(); CHECK_TSKID(tskid); p_tcb = get_tcb(tskid); t_lock_cpu(); if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_tcb->p_tinib->acvct.acptn2)) { ercd = E_OACV; } else if (!TSTAT_SUSPENDED(p_tcb->tstat)) { ercd = E_OBJ; } else if (!TSTAT_WAITING(p_tcb->tstat)) { /* * 強制待ち状態から実行できる状態への遷移 */ p_tcb->tstat = TS_RUNNABLE; LOG_TSKSTAT(p_tcb); if (make_runnable(p_tcb)) { dispatch(); } ercd = E_OK; } else { /* * 二重待ち状態から待ち状態への遷移 */ p_tcb->tstat &= ~TS_SUSPENDED; LOG_TSKSTAT(p_tcb); ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_RSM_TSK_LEAVE(ercd); return(ercd); }
ER rsm_tsk(ID tskid) { TCB *p_tcb; ER ercd; LOG_RSM_TSK_ENTER(tskid); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_TSKID(tskid)); p_tcb = get_tcb(tskid); lock_cpu(); if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; } else if (!TSTAT_SUSPENDED(p_tcb->tstat)) { ercd = E_OBJ; } else if (!TSTAT_WAITING(p_tcb->tstat)) { /* * 強制待ち状態から実行できる状態への遷移 */ p_tcb->tstat = TS_RUNNABLE; LOG_TSKSTAT(p_tcb); make_runnable(p_tcb); if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; } else { /* * 二重待ち状態から待ち状態への遷移 */ p_tcb->tstat &= ~TS_SUSPENDED; LOG_TSKSTAT(p_tcb); ercd = E_OK; } unlock_cpu(); error_exit: LOG_RSM_TSK_LEAVE(ercd); return(ercd); }
/* * 待ち解除のためのタスク状態の更新 * * p_tcbで指定されるタスクを,待ち解除するようタスク状態を更新する. * 待ち解除するタスクが実行できる状態になる場合は,レディキューにつな * ぐ.また,ディスパッチが必要な場合にはtrueを返す. */ Inline bool_t make_non_wait(TCB *p_tcb) { assert(TSTAT_WAITING(p_tcb->tstat)); if (!TSTAT_SUSPENDED(p_tcb->tstat)) { /* * 待ち状態から実行できる状態への遷移 */ return(make_runnable(p_tcb)); } else { /* * 二重待ち状態から強制待ち状態への遷移 */ p_tcb->tstat = TS_SUSPENDED; LOG_TSKSTAT(p_tcb); return(false); } }
/* * 待ち解除のためのタスク状態の更新 * * tcb で指定されるタスクを,待ち解除するようタスク状態を更新する.待 * ち解除するタスクが実行できる状態になる場合は,レディキューにつなぐ. * また,ディスパッチが必要な場合には TRUE を返す. */ Inline BOOL make_non_wait(TCB *tcb) { assert(TSTAT_WAITING(tcb->tstat)); if (!(TSTAT_SUSPENDED(tcb->tstat))) { /* * 待ち状態から実行できる状態への遷移 */ return(make_runnable(tcb)); } else { /* * 二重待ち状態から強制待ち状態への遷移 */ tcb->tstat = TS_SUSPENDED; LOG_TSKSTAT(tcb); return(FALSE); } }
SYSCALL ER rsm_tsk(ID tskid) { TCB *tcb; UINT tstat; ER ercd; LOG_RSM_TSK_ENTER(tskid); CHECK_TSKCTX_UNL(); CHECK_TSKID(tskid); tcb = get_tcb(tskid); t_lock_cpu(); if (!(TSTAT_SUSPENDED(tstat = tcb->tstat))) { ercd = E_OBJ; } else if (!(TSTAT_WAITING(tstat))) { /* * 強制待ち状態から実行できる状態への遷移 */ if (make_runnable(tcb)) { dispatch(); } ercd = E_OK; } else { /* * 二重待ち状態から待ち状態への遷移 */ tcb->tstat &= ~TS_SUSPENDED; LOG_TSKSTAT(tcb); ercd = E_OK; } t_unlock_cpu(); exit: LOG_RSM_TSK_LEAVE(ercd); return(ercd); }
ER ref_tsk(ID tskid, T_RTSK *pk_rtsk) { TCB *p_tcb; uint_t tstat; ER ercd; LOG_REF_TSK_ENTER(tskid, pk_rtsk); CHECK_TSKCTX_UNL(); CHECK_TSKID_SELF(tskid); p_tcb = get_tcb_self(tskid); t_lock_cpu(); tstat = p_tcb->tstat; if (TSTAT_DORMANT(tstat)) { /* * 対象タスクが休止状態の場合 */ pk_rtsk->tskstat = TTS_DMT; } else { /* * タスク状態の取出し */ if (TSTAT_SUSPENDED(tstat)) { if (TSTAT_WAITING(tstat)) { pk_rtsk->tskstat = TTS_WAS; } else { pk_rtsk->tskstat = TTS_SUS; } } else if (TSTAT_WAITING(tstat)) { pk_rtsk->tskstat = TTS_WAI; } else if (p_tcb == p_runtsk) { pk_rtsk->tskstat = TTS_RUN; } else { pk_rtsk->tskstat = TTS_RDY; } /* * 現在優先度とベース優先度の取出し */ pk_rtsk->tskpri = EXT_TSKPRI(p_tcb->priority); pk_rtsk->tskbpri = EXT_TSKPRI(p_tcb->bpriority); if (TSTAT_WAITING(tstat)) { /* * 待ち要因と待ち対象のオブジェクトのIDの取出し */ switch (tstat & TS_WAIT_MASK) { case TS_WAIT_SLP: pk_rtsk->tskwait = TTW_SLP; break; case TS_WAIT_DLY: pk_rtsk->tskwait = TTW_DLY; break; case TS_WAIT_SEM: pk_rtsk->tskwait = TTW_SEM; pk_rtsk->wobjid = SEMID(((WINFO_SEM *)(p_tcb->p_winfo)) ->p_semcb); break; case TS_WAIT_FLG: pk_rtsk->tskwait = TTW_FLG; pk_rtsk->wobjid = FLGID(((WINFO_FLG *)(p_tcb->p_winfo)) ->p_flgcb); break; case TS_WAIT_SDTQ: pk_rtsk->tskwait = TTW_SDTQ; pk_rtsk->wobjid = DTQID(((WINFO_DTQ *)(p_tcb->p_winfo)) ->p_dtqcb); break; case TS_WAIT_RDTQ: pk_rtsk->tskwait = TTW_RDTQ; pk_rtsk->wobjid = DTQID(((WINFO_DTQ *)(p_tcb->p_winfo)) ->p_dtqcb); break; case TS_WAIT_SPDQ: pk_rtsk->tskwait = TTW_SPDQ; pk_rtsk->wobjid = PDQID(((WINFO_PDQ *)(p_tcb->p_winfo)) ->p_pdqcb); break; case TS_WAIT_RPDQ: pk_rtsk->tskwait = TTW_RPDQ; pk_rtsk->wobjid = PDQID(((WINFO_PDQ *)(p_tcb->p_winfo)) ->p_pdqcb); break; case TS_WAIT_MBX: pk_rtsk->tskwait = TTW_MBX; pk_rtsk->wobjid = MBXID(((WINFO_MBX *)(p_tcb->p_winfo)) ->p_mbxcb); break; case TS_WAIT_MPF: pk_rtsk->tskwait = TTW_MPF; pk_rtsk->wobjid = MPFID(((WINFO_MPF *)(p_tcb->p_winfo)) ->p_mpfcb); break; } /* * タイムアウトするまでの時間の取出し */ if (p_tcb->p_winfo->p_tmevtb != NULL) { pk_rtsk->lefttmo = (TMO) tmevt_lefttim(p_tcb->p_winfo->p_tmevtb); } else { pk_rtsk->lefttmo = TMO_FEVR; } } /* * 起床要求キューイング数の取出し */ pk_rtsk->wupcnt = p_tcb->wupque ? 1U : 0U; } /* * 起動要求キューイング数の取出し */ pk_rtsk->actcnt = p_tcb->actque ? 1U : 0U; ercd = E_OK; t_unlock_cpu(); error_exit: LOG_REF_TSK_LEAVE(ercd, pk_rtsk); return(ercd); }
ER ref_tsk(ID tskid, T_RTSK *pk_rtsk) { TCB *p_tcb; uint_t tstat; ER ercd; LOG_REF_TSK_ENTER(tskid, pk_rtsk); CHECK_TSKCTX_UNL(); CHECK_TSKID_SELF(tskid); p_tcb = get_tcb_self(tskid); t_lock_cpu(); tstat = p_tcb->tstat; if (TSTAT_DORMANT(tstat)) { /* * when task is in dormant status */ pk_rtsk->tskstat = TTS_DMT; } else { /* * get task status */ if (TSTAT_SUSPENDED(tstat)) { if (TSTAT_WAITING(tstat)) { pk_rtsk->tskstat = TTS_WAS; } else { pk_rtsk->tskstat = TTS_SUS; } } else if (TSTAT_WAITING(tstat)) { pk_rtsk->tskstat = TTS_WAI; } else if (p_tcb == p_runtsk) { pk_rtsk->tskstat = TTS_RUN; } else { pk_rtsk->tskstat = TTS_RDY; } /* * get current priority and base priority */ pk_rtsk->tskpri = EXT_TSKPRI(p_tcb->priority); pk_rtsk->tskbpri = EXT_TSKPRI(p_tcb->priority); if (TSTAT_WAITING(tstat)) { /* * if the task is in waiting * get the waiting reason and wait objects id */ switch (tstat & TS_WAIT_MASK) { case TS_WAIT_SLP: pk_rtsk->tskwait = TTW_SLP; break; case TS_WAIT_DLY: pk_rtsk->tskwait = TTW_DLY; break; case TS_WAIT_SEM: pk_rtsk->tskwait = TTW_SEM; pk_rtsk->wobjid = SEMID(((WINFO_SEM *)(p_tcb->p_winfo)) ->p_semcb); break; case TS_WAIT_FLG: pk_rtsk->tskwait = TTW_FLG; pk_rtsk->wobjid = FLGID(((WINFO_FLG *)(p_tcb->p_winfo)) ->p_flgcb); break; case TS_WAIT_SDTQ: pk_rtsk->tskwait = TTW_SDTQ; pk_rtsk->wobjid = DTQID(((WINFO_DTQ *)(p_tcb->p_winfo)) ->p_dtqcb); break; case TS_WAIT_RDTQ: pk_rtsk->tskwait = TTW_RDTQ; pk_rtsk->wobjid = DTQID(((WINFO_DTQ *)(p_tcb->p_winfo)) ->p_dtqcb); break; case TS_WAIT_SPDQ: pk_rtsk->tskwait = TTW_SPDQ; pk_rtsk->wobjid = PDQID(((WINFO_PDQ *)(p_tcb->p_winfo)) ->p_pdqcb); break; case TS_WAIT_RPDQ: pk_rtsk->tskwait = TTW_RPDQ; pk_rtsk->wobjid = PDQID(((WINFO_PDQ *)(p_tcb->p_winfo)) ->p_pdqcb); break; case TS_WAIT_MBX: pk_rtsk->tskwait = TTW_MBX; pk_rtsk->wobjid = MBXID(((WINFO_MBX *)(p_tcb->p_winfo)) ->p_mbxcb); break; case TS_WAIT_MPF: pk_rtsk->tskwait = TTW_MPF; pk_rtsk->wobjid = MPFID(((WINFO_MPF *)(p_tcb->p_winfo)) ->p_mpfcb); break; } /* * get left time before timeout */ if (p_tcb->p_winfo->p_tmevtb != NULL) { pk_rtsk->lefttmo = (TMO) tmevt_lefttim(p_tcb->p_winfo->p_tmevtb); } else { pk_rtsk->lefttmo = TMO_FEVR; } } /* * get wakeup request */ pk_rtsk->wupcnt = p_tcb->wupque ? 1U : 0U; } /* * get activation request */ pk_rtsk->actcnt = p_tcb->actque ? 1U : 0U; ercd = E_OK; t_unlock_cpu(); error_exit: LOG_REF_TSK_LEAVE(ercd, pk_rtsk); return(ercd); }