SYSCALL ER _td_ref_tsk_u( ID tskid, TD_RTSK_U *pk_rtsk ) { TCB *tcb; TSTAT state; ER ercd = E_OK; CHECK_TSKID_SELF(tskid); tcb = get_tcb_self(tskid); MEMSET(pk_rtsk, 0, sizeof(*pk_rtsk)); BEGIN_DISABLE_INTERRUPT; state = (TSTAT)tcb->state; if ( state == TS_NONEXIST ) { ercd = E_NOEXS; } else { if ( ( state == TS_READY ) && ( tcb == ctxtsk ) ) { pk_rtsk->tskstat = TTS_RUN; } else { pk_rtsk->tskstat = (UINT)state << 1; } if ( (state & TS_WAIT) != 0 ) { pk_rtsk->tskwait = tcb->wspec->tskwait; pk_rtsk->wid = tcb->wid; if ( ctxtsk->nodiswai ) { pk_rtsk->tskstat |= TTS_NODISWAI; } } pk_rtsk->exinf = tcb->exinf; pk_rtsk->tskpri = ext_tskpri(tcb->priority); pk_rtsk->tskbpri = ext_tskpri(tcb->bpriority); pk_rtsk->wupcnt = tcb->wupcnt; pk_rtsk->suscnt = tcb->suscnt; pk_rtsk->slicetime_u = tcb->slicetime; pk_rtsk->waitmask = tcb->waitmask; pk_rtsk->texmask = tcb->texmask; pk_rtsk->tskevent = tcb->tskevt; pk_rtsk->task = tcb->task; pk_rtsk->stksz = tcb->stksz; pk_rtsk->sstksz = tcb->sstksz - RESERVE_SSTACK(tcb->tskatr); pk_rtsk->istack = tcb->istack; pk_rtsk->isstack = tcb->isstack; } END_DISABLE_INTERRUPT; return ercd; }
/* * Refer task state */ SYSCALL ER td_ref_tsk_impl( ID tskid, TD_RTSK *pk_rtsk ) { TCB *tcb; TSTAT state; ER ercd = E_OK; CHECK_TSKID_SELF(tskid); tcb = get_tcb_self(tskid); memset(pk_rtsk, 0, sizeof(*pk_rtsk)); BEGIN_DISABLE_INTERRUPT; state = (TSTAT)tcb->state; if ( state == TS_NONEXIST ) { ercd = E_NOEXS; } else { if ( ( state == TS_READY ) && ( tcb == knl_ctxtsk ) ) { pk_rtsk->tskstat = TTS_RUN; } else { pk_rtsk->tskstat = (UINT)state << 1; } if ( (state & TS_WAIT) != 0 ) { pk_rtsk->tskwait = tcb->wspec->tskwait; pk_rtsk->wid = tcb->wid; } pk_rtsk->exinf = tcb->exinf; pk_rtsk->tskpri = ext_tskpri(tcb->priority); pk_rtsk->tskbpri = ext_tskpri(tcb->bpriority); pk_rtsk->wupcnt = tcb->wupcnt; pk_rtsk->suscnt = tcb->suscnt; pk_rtsk->task = tcb->task; pk_rtsk->stksz = tcb->sstksz; pk_rtsk->istack = tcb->isstack; } END_DISABLE_INTERRUPT; return ercd; }
/* * Refer task state */ SYSCALL ER tk_ref_tsk_impl( ID tskid, T_RTSK *pk_rtsk ) { TCB *tcb; TSTAT state; ER ercd = E_OK; CHECK_TSKID_SELF(tskid); tcb = get_tcb_self(tskid); (void)memset(pk_rtsk, 0, sizeof(*pk_rtsk)); BEGIN_CRITICAL_SECTION; state = (TSTAT)tcb->state; if ( state == TS_NONEXIST ) { ercd = E_NOEXS; } else { if ( ( state == TS_READY ) && ( tcb == knl_ctxtsk ) ) { pk_rtsk->tskstat = TTS_RUN; } else { pk_rtsk->tskstat = (UINT)state << 1; } if ( (state & TS_WAIT) != 0 ) { pk_rtsk->tskwait = tcb->wspec->tskwait; pk_rtsk->wid = tcb->wid; } pk_rtsk->exinf = tcb->exinf; pk_rtsk->tskpri = ext_tskpri(tcb->priority); pk_rtsk->tskbpri = ext_tskpri(tcb->bpriority); pk_rtsk->wupcnt = tcb->wupcnt; pk_rtsk->suscnt = tcb->suscnt; } END_CRITICAL_SECTION; return ercd; }