StatusType WakeUpTask ( TaskType TaskID ) { StatusType ercd = E_OK; TCB *tcb; TSTAT state; OS_CHECK((TaskID<cfgOSEK_TASK_NUM),E_OS_ID); OS_CHECK((TaskID != knl_ctxtsk->tskid),E_OS_ID); tcb = &knl_tcb_table[TaskID]; BEGIN_CRITICAL_SECTION; state = (TSTAT)tcb->state; if ( !knl_task_alive(state) ) { ercd = E_OS_ID; } else if ( (state & TS_WAIT) != 0 && tcb->wspec == &knl_wspec_slp ) { knl_wait_release_ok(tcb); } else if ( tcb->wupcnt == UINT_MAX ) { ercd = E_OS_QOVR; } else { ++tcb->wupcnt; } END_CRITICAL_SECTION; Error_Exit: return ercd; }
/* * Termination of other task */ SYSCALL ER tk_ter_tsk_impl( ID tskid ) { TCB *tcb; TSTAT state; ER ercd = E_OK; CHECK_TSKID(tskid); CHECK_NONSELF(tskid); tcb = get_tcb(tskid); BEGIN_CRITICAL_SECTION; state = (TSTAT)tcb->state; if ( !knl_task_alive(state) ) { ercd = ( state == TS_NONEXIST )? E_NOEXS: E_OBJ; } else if ( tcb->klocked ) { /* Normally, it does not become this state. * When the state is page-in wait in the virtual memory * system and when trying to terminate any task, * it becomes this state. */ ercd = E_OBJ; } else { knl_ter_tsk(tcb); knl_make_dormant(tcb); } END_CRITICAL_SECTION; return ercd; }