Пример #1
0
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;
}