Example #1
0
/* |------------------+------------------------------------------------------------| */
EXPORT StatusType WaitEvent ( EventMaskType Mask )
{
	StatusType ercd = E_OK;
    uint8 flgid;
    OS_EXT_VALIDATE((0 == knl_taskindp),E_OS_CALLEVEL);
    OS_EXT_VALIDATE((INVALID_RESOURCE == knl_tcb_resque[knl_curtsk]),E_OS_RESOURCE);
    flgid = knl_tcb_flgid[knl_curtsk];
    OS_EXT_VALIDATE((flgid != INVALID_FLAG),E_OS_ACCESS);

    BEGIN_CRITICAL_SECTION();
    if((knl_fcb_set[flgid] & Mask) == NO_EVENT)
    {
    	knl_fcb_wait[flgid] = Mask;
        knl_tcb_state[knl_curtsk] = WAITING;
        //release internal resource or for Non-Preemtable Task
        ReleaseInternalResource();
        knl_search_schedtsk();
    }
    END_CRITICAL_SECTION();
    //re-get internal resource or for Non-Preemtable task
    GetInternalResource();
OS_VALIDATE_ERROR_EXIT()
    OsErrorProcess1(WaitEvent,mask,Mask);
	return ercd;
}
Example #2
0
/* |------------------+-------------------------------------------------------------| */
StatusType Schedule ( void )
{
    StatusType ercd = E_OK;
	OS_CHECK_EXT(!in_indp(),E_OS_CALLEVEL);
	OS_CHECK_EXT(isQueEmpty(&knl_ctxtsk->resque),E_OS_RESOURCE);

	BEGIN_CRITICAL_SECTION;
	//if task has internal resource or task is non-premtable
	if(knl_ready_queue.top_priority < knl_ctxtsk->itskpri)
	{	//release internal resource or for Non-Preemtable Task
    	ReleaseInternalResource();
        knl_reschedule();
    }
	END_CRITICAL_SECTION;

	//re-get internal resource or for Non-Preemtable task
	GetInternalResource();

	Error_Exit:
	#if(cfgOS_ERROR_HOOK == STD_ON)
	if(E_OK != ercd)
	{
    	BEGIN_CRITICAL_SECTION;
    	_errorhook_svcid = OSServiceId_Schedule;
    	CallErrorHook(ercd);
    	END_CRITICAL_SECTION;
	}
	#endif /* cfgOS_ERROR_HOOK */
    return ercd;
}
Example #3
0
/* |------------------+--------------------------------------------------------------| */
StatusType TerminateTask ( void )
{
	StatusType ercd = E_NOT_OK;
	OS_CHECK_EXT(!in_indp(),E_OS_CALLEVEL);
	OS_CHECK_EXT(isQueEmpty(&knl_ctxtsk->resque),E_OS_RESOURCE);
	DISABLE_INTERRUPT;

	#if(cfgOS_POST_TASK_HOOK == STD_ON)
    PostTaskHook();
    #endif
	knl_ctxtsk->state = TS_DORMANT;
	//release internal resource or for non-preemtable task
	ReleaseInternalResource();
	knl_ctxtsk->priority = knl_ctxtsk->itskpri;
	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
	knl_force_dispatch();
	/* No return */

	Error_Exit:
	#if(cfgOS_ERROR_HOOK == STD_ON)
    if(E_OK != ercd)
	{
    	BEGIN_CRITICAL_SECTION;
    	_errorhook_svcid = OSServiceId_TerminateTask;
    	CallErrorHook(ercd);
    	END_CRITICAL_SECTION;
    }
	#endif /* cfgOS_ERROR_HOOK */
	return ercd;
}
Example #4
0
/* |------------------+------------------------------------------------------------| */
StatusType WaitEvent( EventMaskType Mask )
{
	StatusType ercd = E_OK;
    ID flgid;
    FLGCB *flgcb;
    OS_CHECK_EXT(!in_indp(),E_OS_CALLEVEL);
    OS_CHECK_EXT(isQueEmpty(&knl_ctxtsk->resque),E_OS_RESOURCE);
    flgid = knl_ctxtsk - knl_tcb_table;
    flgid = knl_gtsk_table[flgid].flgid;
    OS_CHECK_EXT((flgid != INVALID_EVENT),E_OS_ACCESS);
    
    flgcb = &knl_flgcb_table[flgid];
    BEGIN_CRITICAL_SECTION;
    if((flgcb->flgptn & Mask) == NO_EVENT)
    {
        flgcb->waipth = Mask;
        knl_ctxtsk->state = TS_WAIT;
        //release internal resource or for Non-Preemtable Task
        ReleaseInternalResource();
        knl_search_schedtsk();
    }
    END_CRITICAL_SECTION;
    //re-get internal resource or for Non-Preemtable task
    GetInternalResource();
       
  Error_Exit:
    #if(cfgOS_ERROR_HOOK == STD_ON)
	if(E_OK != ercd)
	{
    	BEGIN_CRITICAL_SECTION;
    	_errorhook_svcid = OSServiceId_WaitEvent;
    	_errorhook_par1.mask = Mask;
    	CallErrorHook(ercd);
    	END_CRITICAL_SECTION;
    }
	#endif /* cfgOS_ERROR_HOOK */
	return ercd;
}
Example #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 */
        //release internal resource or for non-preemtable task
        ReleaseInternalResource(); 
        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;
    	//release internal resource or for non-preemtable task
        ReleaseInternalResource();
    	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;
}