Exemplo n.º 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;
}
Exemplo n.º 2
0
/* |------------------+-------------------------------------------------------------| */
StatusType CancelAlarm ( AlarmType AlarmID )
{
    StatusType ercd = E_OK;
    ALMCB* almcb;
    OS_CHECK_EXT((AlarmID < cfgOSEK_ALARM_NUM),E_OS_ID);
    almcb = &knl_almcb_table[AlarmID];
    OS_CHECK((!isQueEmpty(&almcb->almque)),E_OS_NOFUNC);

    BEGIN_DISABLE_INTERRUPT;
    QueRemove(&almcb->almque);
    QueInit(&almcb->almque);
    END_DISABLE_INTERRUPT;
    Error_Exit:
    #if(cfgOS_ERROR_HOOK == STD_ON)
	if(E_OK != ercd)
	{
    	BEGIN_CRITICAL_SECTION;
    	_errorhook_svcid = OSServiceId_CancelAlarm;
    	_errorhook_par1.almid = AlarmID;
    	CallErrorHook(ercd);
    	END_CRITICAL_SECTION;
    }
	#endif /* cfgOS_ERROR_HOOK */
    	return ercd;
}
Exemplo n.º 3
0
/* |------------------+------------------------------------------------------------| */
StatusType ActivateTask ( TaskType TaskID )
{
	StatusType ercd = E_OK;
	TCB *tcb;
	TSTAT	state;
	OS_CHECK((TaskID<cfgOSEK_TASK_NUM),E_OS_ID);
	tcb = &knl_tcb_table[TaskID];
	BEGIN_CRITICAL_SECTION;
	state = (TSTAT)tcb->state;
	if (TS_DORMANT == state) {
        knl_make_active(tcb);
	} else {
	    #if((cfgOS_CONFORMANCE_CLASS == ECC2) || (cfgOS_CONFORMANCE_CLASS == BCC2))
	    if(tcb->actcnt < knl_gtsk_table[TaskID].maxact)
	    {
	        tcb->actcnt += 1;
	    }
	    else
	    #endif
	    {
	    	ercd = E_OS_LIMIT;
		}
	}
	END_CRITICAL_SECTION;

	Error_Exit:
	return ercd;
}
Exemplo n.º 4
0
/* |------------------+-------------------------------------------------------| */
StatusType GetTaskState ( TaskType TaskID,TaskStateRefType State )
{
	StatusType ercd = E_OK;
	TCB* tcb;
	TSTAT state;
	OS_CHECK((TaskID<cfgOSEK_TASK_NUM),E_OS_ID);
	tcb = &knl_tcb_table[TaskID];
	state = (TSTAT)tcb->state;
	if(TS_READY== state)
	{
	    if(knl_ctxtsk == tcb)
	    {
	        *State = RUNNING;
	    }
	    else
	    {
	        *State = READY;
	    }
	}
	else if(TS_WAIT == state)
	{
	    *State = WAITING;
	}
	else
	{
	    *State = SUSPENDED;
	}
Error_Exit:
	return ercd;
}
Exemplo n.º 5
0
/* |------------------+-------------------------------------------------------------| */
StatusType ChainTask ( TaskType TaskID )
{
	StatusType ercd = E_NOT_OK;
	TCB * tcb;
	TSTAT state;

	OS_CHECK((TaskID<cfgOSEK_TASK_NUM),E_OS_ID);
    OS_CHECK_EXT(!in_indp(),E_OS_CALLEVEL);
	OS_CHECK_EXT(isQueEmpty(&knl_ctxtsk->resque),E_OS_RESOURCE);
	DISABLE_INTERRUPT;
    if(TaskID == knl_ctxtsk->tskid){
        /* chain to itself */
        knl_search_schedtsk();
        knl_make_active(knl_ctxtsk);
    }
    else{
        /* firstly terminate current running task knl_ctxtsk,
         * and then activate TaskID */
      	tcb = &knl_tcb_table[TaskID];
        state = (TSTAT)tcb->state;
    	if (TS_DORMANT != state) {
    	    #if((cfgOS_CONFORMANCE_CLASS == ECC2) || (cfgOS_CONFORMANCE_CLASS == BCC2))
    	    if(tcb->actcnt < knl_gtsk_table[TaskID].maxact)
    	    {
    	        tcb->actcnt += 1;
    	    }
    	    else
    	    #endif
    	    {
    	    	ercd = E_OS_LIMIT;
    	    	goto Error_Exit;
    		}
    	}
    	
    	knl_ctxtsk->state = TS_DORMANT;
    	knl_search_schedtsk();
    	#if((cfgOS_CONFORMANCE_CLASS == ECC2) || (cfgOS_CONFORMANCE_CLASS == BCC2))
    	if(knl_ctxtsk->actcnt > 0)
    	{
    	    knl_ctxtsk->actcnt -= 1;
    	    knl_make_active(knl_ctxtsk);
    	}
        #endif
        if (TS_DORMANT == state) {
            knl_make_active(tcb);
    	}
    }
    knl_force_dispatch();

	/* No return */
	Error_Exit:
    return ercd;
}
Exemplo n.º 6
0
/* |------------------+------------------------------------------------------------| */
StatusType ActivateTask ( TaskType TaskID )
{
	StatusType ercd = E_OK;
	TCB *tcb;
	TSTAT	state;
	OS_CHECK((TaskID<cfgOSEK_TASK_NUM),E_OS_ID);
	tcb = &knl_tcb_table[TaskID];
	BEGIN_CRITICAL_SECTION;
	state = (TSTAT)tcb->state;
	if (TS_DORMANT == state) {
        knl_make_active(tcb);
	} else {
	    #if((cfgOS_CONFORMANCE_CLASS == ECC2) || (cfgOS_CONFORMANCE_CLASS == BCC2))
	    if(tcb->actcnt < knl_gtsk_table[TaskID].maxact)
	    {
	        tcb->actcnt += 1;
	        #if(cfgOSEK_FIFO_QUEUE_PER_PRIORITY == STD_ON)
	        knl_ready_queue_insert(&knl_ready_queue, tcb);
	        #endif
	    }
	    else
	    #endif
	    {
	    	ercd = E_OS_LIMIT;
		}
	}
	END_CRITICAL_SECTION;

	Error_Exit:
	#if(cfgOS_ERROR_HOOK == STD_ON)
	if(E_OK != ercd)
	{
    	BEGIN_CRITICAL_SECTION;
    	_errorhook_svcid = OSServiceId_ActivateTask;
    	_errorhook_par1.tskid = TaskID;
    	CallErrorHook(ercd);
    	END_CRITICAL_SECTION;
	}
	#endif /* cfgOS_ERROR_HOOK */
	return ercd;
}
Exemplo n.º 7
0
/* |------------------+-------------------------------------------------------| */
StatusType GetTaskState ( TaskType TaskID,TaskStateRefType State )
{
	StatusType ercd = E_OK;
	TCB* tcb;
	TSTAT state;
	OS_CHECK((TaskID<cfgOSEK_TASK_NUM),E_OS_ID);
	tcb = &knl_tcb_table[TaskID];
	state = (TSTAT)tcb->state;
	if(TS_READY== state)
	{
	    if(knl_ctxtsk == tcb)
	    {
	        *State = RUNNING;
	    }
	    else
	    {
	        *State = READY;
	    }
	}
	else if(TS_WAIT == state)
	{
	    *State = WAITING;
	}
	else
	{
	    *State = SUSPENDED;
	}
Error_Exit:
	#if(cfgOS_ERROR_HOOK == STD_ON)
	if(E_OK != ercd)
	{
    	BEGIN_CRITICAL_SECTION;
    	_errorhook_svcid = OSServiceId_GetTaskState;
    	_errorhook_par1.tskid = TaskID;
    	_errorhook_par2.p_state = State;
    	CallErrorHook(ercd);
    	END_CRITICAL_SECTION;
	}
	#endif /* cfgOS_ERROR_HOOK */
	return ercd;
}
Exemplo n.º 8
0
/* |------------------+------------------------------------------------------------------| */
StatusType GetAlarm ( AlarmType AlarmID ,TickRefType Tick )
{
	StatusType ercd = E_OK;
    ALMCB* almcb;
    CCB *ccb;
    CounterType cntid;
    TickType max;
    OS_CHECK_EXT((AlarmID < cfgOSEK_ALARM_NUM),E_OS_ID);
    almcb = &knl_almcb_table[AlarmID];
    OS_CHECK((!isQueEmpty(&almcb->almque)),E_OS_NOFUNC);
    cntid = knl_galm_table[AlarmID].owner;
    ccb = &knl_ccb_table[cntid];
    max = knl_almbase_table[cntid].maxallowedvalue;
    
    BEGIN_DISABLE_INTERRUPT;
    if(ccb->curvalue <  almcb->time)
    {
        *Tick = almcb->time - ccb->curvalue;
    }
    else
    {
        *Tick = max*2 + 1- ccb->curvalue + almcb->time;
    }
    END_DISABLE_INTERRUPT;
    
    Error_Exit:
    #if(cfgOS_ERROR_HOOK == STD_ON)
	if(E_OK != ercd)
	{
    	BEGIN_CRITICAL_SECTION;
    	_errorhook_svcid = OSServiceId_GetAlarm;
    	_errorhook_par1.almid = AlarmID;
    	_errorhook_par2.p_tick = Tick;
    	CallErrorHook(ercd);
    	END_CRITICAL_SECTION;
    }
	#endif /* cfgOS_ERROR_HOOK */
    return ercd;
}
Exemplo n.º 9
0
/* |------------------+-----------------------------------------------------------------| */
StatusType SetRelAlarm ( AlarmType AlarmID , TickType Increment ,TickType Cycle )
{
	StatusType ercd = E_OK;
    ALMCB *almcb;
    CCB *ccb;
    CounterType cntid;
    TickType max;
    OS_CHECK_EXT((AlarmID < cfgOSEK_ALARM_NUM),E_OS_ID);
    almcb = &knl_almcb_table[AlarmID];
    OS_CHECK((isQueEmpty(&almcb->almque)),E_OS_STATE);
    cntid = knl_galm_table[AlarmID].owner;
    max = knl_almbase_table[cntid].maxallowedvalue;
    OS_CHECK_EXT((max >= Increment),E_OS_VALUE);
    OS_CHECK_EXT((max >= Cycle),E_OS_VALUE);
    OS_CHECK_EXT(((knl_almbase_table[cntid].mincycle <= Cycle) || (0 == Cycle)),E_OS_VALUE);
    ccb = &knl_ccb_table[cntid];
    
    BEGIN_DISABLE_INTERRUPT;
    almcb->time = knl_add_ticks(ccb->curvalue,Increment,max*2);
    almcb->cycle = Cycle;
    knl_alm_insert(almcb,ccb);
    END_DISABLE_INTERRUPT;
    
Error_Exit:
    #if(cfgOS_ERROR_HOOK == STD_ON)
	if(E_OK != ercd)
	{
    	BEGIN_CRITICAL_SECTION;
    	_errorhook_svcid = OSServiceId_SetRelAlarm;
    	_errorhook_par1.almid = AlarmID;
    	_errorhook_par2.incr = Increment;
    	_errorhook_par3.cycle = Cycle;
    	CallErrorHook(ercd);
    	END_CRITICAL_SECTION;
    }
	#endif /* cfgOS_ERROR_HOOK */
    return ercd;
}
Exemplo n.º 10
0
/* |------------------+-------------------------------------------------------------| */
StatusType ChainTask ( TaskType TaskID )
{
	StatusType ercd = E_NOT_OK;
	TCB * tcb;
	TSTAT state;

	OS_CHECK((TaskID<cfgOSEK_TASK_NUM),E_OS_ID);
    OS_CHECK_EXT(!in_indp(),E_OS_CALLEVEL);
	OS_CHECK_EXT(isQueEmpty(&knl_ctxtsk->resque),E_OS_RESOURCE);
	DISABLE_INTERRUPT;
    if(TaskID == knl_ctxtsk->tskid){
        /* chain to itself */
        knl_search_schedtsk();
        knl_make_active(knl_ctxtsk);
    }
    else{
        /* firstly terminate current running task knl_ctxtsk,
         * and then activate TaskID */
      	tcb = &knl_tcb_table[TaskID];
        state = (TSTAT)tcb->state;
    	if (TS_DORMANT != state) {
    	    #if((cfgOS_CONFORMANCE_CLASS == ECC2) || (cfgOS_CONFORMANCE_CLASS == BCC2))
    	    if(tcb->actcnt < knl_gtsk_table[TaskID].maxact)
    	    {
    	        tcb->actcnt += 1;
    	        #if(cfgOSEK_FIFO_QUEUE_PER_PRIORITY == STD_ON)
    	        knl_ready_queue_insert(&knl_ready_queue, tcb);
    	        #endif
    	    }
    	    else
    	    #endif
    	    {
    	    	ercd = E_OS_LIMIT;
    	    	goto Error_Exit;
    		}
    	}
    	
    	#if(cfgOS_POST_TASK_HOOK == STD_ON)
	    PostTaskHook();
	    #endif

    	knl_ctxtsk->state = TS_DORMANT;
    	knl_search_schedtsk();
    	#if((cfgOS_CONFORMANCE_CLASS == ECC2) || (cfgOS_CONFORMANCE_CLASS == BCC2))
    	if(knl_ctxtsk->actcnt > 0)
    	{
    	    knl_ctxtsk->actcnt -= 1;
    	    #if(cfgOSEK_FIFO_QUEUE_PER_PRIORITY == STD_OFF)
    	    knl_make_active(knl_ctxtsk);
    	    #else
    	    knl_make_ready(knl_ctxtsk);
    	    #endif
    	}
        #endif
        if (TS_DORMANT == state) {
            knl_make_active(tcb);
    	}
    }
    knl_force_dispatch();

	/* No return */
	Error_Exit:
	ENABLE_INTERRUPT;
	#if(cfgOS_ERROR_HOOK == STD_ON)
	if(E_OK != ercd)
	{
    	BEGIN_CRITICAL_SECTION;
    	_errorhook_svcid = OSServiceId_ChainTask;
    	_errorhook_par1.tskid = TaskID;
    	CallErrorHook(ercd);
    	END_CRITICAL_SECTION;
    }
	#endif /* cfgOS_ERROR_HOOK */	
    return ercd;
}