📄 task_manage.c
字号:
#endif /* Change priority */ change_task_priority(tcb, priority); ercd = E_OK; error_exit: END_CRITICAL_SECTION; return ercd;}/* * Rotate ready queue */SYSCALL ER _tk_rot_rdq( PRI tskpri ){ CHECK_PRI_RUN(tskpri); BEGIN_CRITICAL_SECTION; if ( tskpri == TPRI_RUN ) { if ( in_indp() ) { rotate_ready_queue_run(); } else { rotate_ready_queue(ctxtsk->priority); } } else { rotate_ready_queue(int_priority(tskpri)); } END_CRITICAL_SECTION; return E_OK;}/* * Change slice time */SYSCALL ER _tk_chg_slt( ID tskid, RELTIM slicetime ){ TCB *tcb; ER ercd = E_OK; CHECK_TSKID_SELF(tskid); tcb = get_tcb_self(tskid); BEGIN_CRITICAL_SECTION; if ( tcb->state == TS_NONEXIST ) { ercd = E_NOEXS; } else { tcb->slicetime = slicetime; } END_CRITICAL_SECTION; return ercd;}/* ------------------------------------------------------------------------ *//* * Refer task ID at execution */SYSCALL ID _tk_get_tid( void ){ return ( ctxtsk == NULL )? 0: ctxtsk->tskid;}/* * Refer task state */SYSCALL ER _tk_ref_tsk( ID tskid, T_RTSK *pk_rtsk ){ TCB *tcb; TSTAT state; ER ercd = E_OK; CHECK_TSKID_SELF(tskid); tcb = get_tcb_self(tskid); bzero(pk_rtsk, sizeof(*pk_rtsk)); BEGIN_CRITICAL_SECTION; state = tcb->state; if ( state == TS_NONEXIST ) { ercd = E_NOEXS; } else { if ( 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 ( tcb->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 = tcb->slicetime; pk_rtsk->waitmask = tcb->waitmask; pk_rtsk->texmask = tcb->texmask; pk_rtsk->tskevent = tcb->tskevt; } END_CRITICAL_SECTION; return ercd;}/* * Get task statistic information */SYSCALL ER _tk_inf_tsk( ID tskid, T_ITSK *pk_itsk, BOOL clr ){ TCB *tcb; ER ercd = E_OK; CHECK_TSKID_SELF(tskid); tcb = get_tcb_self(tskid); BEGIN_CRITICAL_SECTION; if ( tcb->state == TS_NONEXIST ) { ercd = E_NOEXS; } else { pk_itsk->stime = tcb->stime; pk_itsk->utime = tcb->utime; if ( clr ) { tcb->stime = 0; tcb->utime = 0; } } END_CRITICAL_SECTION; return ercd;}/* ------------------------------------------------------------------------ *//* * Get task resource group */SYSCALL ID _tk_get_rid( ID tskid ){ TCB *tcb; ER ercd; CHECK_TSKID_SELF(tskid); tcb = get_tcb_self(tskid); BEGIN_CRITICAL_SECTION; if ( tcb->state == TS_NONEXIST ) { ercd = E_NOEXS; } else { ercd = tcb->resid; } END_CRITICAL_SECTION; return ercd;}/* * Set task resource group */SYSCALL ID _tk_set_rid( ID tskid, ID resid ){ TCB *tcb; ER ercd; CHECK_TSKID_SELF(tskid); CHECK_RESID(resid); tcb = get_tcb_self(tskid); BEGIN_CRITICAL_SECTION; if ( tcb->state == TS_NONEXIST ) { ercd = E_NOEXS; } else { ercd = tcb->resid; tcb->resid = resid; } END_CRITICAL_SECTION; return ercd;}/* ------------------------------------------------------------------------ *//* * Release wait */SYSCALL ER _tk_rel_wai( ID tskid ){ TCB *tcb; TSTAT state; ER ercd = E_OK; CHECK_TSKID(tskid); tcb = get_tcb(tskid); BEGIN_CRITICAL_SECTION; state = tcb->state; if ( (state & TS_WAIT) == 0 ) { ercd = ( state == TS_NONEXIST )? E_NOEXS: E_OBJ; } else { wait_release_ng(tcb, E_RLWAI); } END_CRITICAL_SECTION; return ercd;}/* * Disable task wait */#define WAIT_PATTERN ( TTW_SLP | TTW_DLY | TTW_SEM | TTW_FLG \ | TTW_SDTQ | TTW_RDTQ | TTW_MBX | TTW_MTX \ | TTW_SMBF | TTW_RMBF | TTW_CAL | TTW_ACP \ | TTW_RDV | TTW_MPF | TTW_MPL \ | TTW_EV1 | TTW_EV2 | TTW_EV3 | TTW_EV4 \ | TTW_EV5 | TTW_EV6 | TTW_EV7 | TTW_EV8 \ | TTX_SVC )SYSCALL INT _tk_dis_wai( ID tskid, UINT waitmask ){ TCB *tcb; UINT tskwait; ER ercd = E_OK; CHECK_TSKID_SELF(tskid); CHECK_PAR((waitmask & ~WAIT_PATTERN) == 0); tcb = get_tcb_self(tskid); BEGIN_CRITICAL_SECTION; if ( tcb->state == TS_NONEXIST ) { ercd = E_NOEXS; goto error_exit; } /* Update wait disable mask */ tcb->waitmask = waitmask; if ( (tcb->state & TS_WAIT) != 0 ) { tskwait = tcb->wspec->tskwait; if ( (tskwait & waitmask) != 0 && !tcb->nodiswai ) { /* Free wait */ wait_release_ng(tcb, E_DISWAI); tskwait = 0; } } else { tskwait = 0; } error_exit: END_CRITICAL_SECTION; return ( ercd < E_OK )? ercd: tskwait;}/* * Enable task wait */SYSCALL ER _tk_ena_wai( ID tskid ){ TCB *tcb; ER ercd = E_OK; CHECK_TSKID_SELF(tskid); tcb = get_tcb_self(tskid); BEGIN_CRITICAL_SECTION; if ( tcb->state == TS_NONEXIST ) { ercd = E_NOEXS; } else { tcb->waitmask = 0; } END_CRITICAL_SECTION; return ercd;}/* ------------------------------------------------------------------------ *//* * Debug support function */#if USE_DBGSPT/* * Get object name from control block */#if USE_OBJECT_NAMEEXPORT ER task_getname(ID id, UB **name){ TCB *tcb; ER ercd = E_OK; CHECK_TSKID_SELF(id); BEGIN_DISABLE_INTERRUPT; tcb = get_tcb_self(id); if ( tcb->state == TS_NONEXIST ) { ercd = E_NOEXS; goto error_exit; } if ( (tcb->tskatr & TA_DSNAME) == 0 ) { ercd = E_OBJ; goto error_exit; } *name = tcb->name; error_exit: END_DISABLE_INTERRUPT; return ercd;}#endif /* USE_OBJECT_NAME *//* * Refer task usage state */SYSCALL INT _td_lst_tsk( ID list[], INT nent ){ TCB *tcb, *end; INT n = 0; BEGIN_DISABLE_INTERRUPT; end = tcb_table + NUM_TSKID; for ( tcb = tcb_table; tcb < end; tcb++ ) { if ( tcb->state == TS_NONEXIST ) continue; if ( n++ < nent ) { *list++ = tcb->tskid; } } END_DISABLE_INTERRUPT; return n;}/* * Refer task state */SYSCALL ER _td_ref_tsk( ID tskid, TD_RTSK *pk_rtsk ){ TCB *tcb; TSTAT state; ER ercd = E_OK; CHECK_TSKID_SELF(tskid); tcb = get_tcb_self(tskid); bzero(pk_rtsk, sizeof(*pk_rtsk)); BEGIN_DISABLE_INTERRUPT; state = tcb->state; if ( state == TS_NONEXIST ) { ercd = E_NOEXS; } else { if ( 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 = 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;}/* * Get task statistic information */SYSCALL ER _td_inf_tsk( ID tskid, TD_ITSK *pk_itsk, BOOL clr ){ TCB *tcb; ER ercd = E_OK; CHECK_TSKID_SELF(tskid); tcb = get_tcb_self(tskid); BEGIN_DISABLE_INTERRUPT; if ( tcb->state == TS_NONEXIST ) { ercd = E_NOEXS; } else { pk_itsk->stime = tcb->stime; pk_itsk->utime = tcb->utime; if ( clr ) { tcb->stime = 0; tcb->utime = 0; } } END_DISABLE_INTERRUPT; return ercd;}#endif /* USE_DBGSPT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -