/*
 * End and delete its own task
 */
SYSCALL void tk_exd_tsk_impl( void )
{
	/* Check context error */
#if CHK_CTX2
	if ( in_indp() ) {
#if USE_KERNEL_MESSAGE
		tm_putstring((UB*)"tk_exd_tsk was called in the task independent\n");
#endif
		tm_monitor(); /* To monitor */
	}
#endif
#if CHK_CTX1
	if ( in_ddsp() ) {
#if USE_KERNEL_MESSAGE
		tm_putstring((UB*)"tk_exd_tsk was called in the dispatch disabled\n");
#endif
	}
#endif

	DISABLE_INTERRUPT;
	knl_ter_tsk(knl_ctxtsk);
	knl_del_tsk(knl_ctxtsk);

	knl_force_dispatch();
	/* No return */
}
示例#2
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;
}
示例#3
0
文件: osctrl.c 项目: parai/OpenOSEK
/* |------------------+------------------------------------------------------| */
EXPORT void StartOS ( AppModeType AppMode )
{
	DISABLE_INTERRUPT();
	knl_dispatch_disabled = 1; /* Dispatch disable */
#if defined( OpenOSEKStartupHook )
	OpenOSEKStartupHook();
#endif
	knl_appmode = AppMode;
	knl_task_init();
#if(cfgOS_ALARM_NUM > 0)
	knl_alarm_counter_init();
#endif
	knl_resource_init();
#if(cfgOS_STARTUPHOOK == 1)
	StartupHook();
#endif
    knl_force_dispatch();
    
}
示例#4
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;
}
示例#5
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;

	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
	knl_force_dispatch();
	/* No return */

	Error_Exit:
	return ercd;
}
/*
 * End its own task
 */
SYSCALL void tk_ext_tsk_impl( void )
{
#ifdef DORMANT_STACK_SIZE
	/* To avoid destroying stack used in 'knl_make_dormant', 
	   allocate the dummy area on the stack. */
	volatile VB _dummy[DORMANT_STACK_SIZE];
#endif

	/* Check context error */
#if CHK_CTX2
	if ( in_indp() ) {
#if USE_KERNEL_MESSAGE
		tm_putstring((UB*)"tk_ext_tsk was called in the task independent\n");
#endif
		tm_monitor(); /* To monitor */
	}
#endif
#if CHK_CTX1
	if ( in_ddsp() ) {
#if USE_KERNEL_MESSAGE
		tm_putstring((UB*)"tk_ext_tsk was called in the dispatch disabled\n");
#endif
	}
#endif

	DISABLE_INTERRUPT;
	knl_ter_tsk(knl_ctxtsk);
	knl_make_dormant(knl_ctxtsk);

	knl_force_dispatch();
	/* No return */

#ifdef DORMANT_STACK_SIZE
	/* for WARNING */
	_dummy[0] = 0;
#endif
}
/*
 * Initialize kernel and create/start initial task
 */
EXPORT void knl_t_kernel_main( T_CTSK *inittask )
{

    DISABLE_INTERRUPT;

    /*
     * Target-dependent initialization
     */
    InitModule(cpu);
    InitModule(tkdev);

    /*
     * Each module initialization
     */
    InitModule(task);
#if CFN_MAX_SEMID > 0
#ifdef USE_FUNC_SEMAPHORE_INITIALIZE
    InitModule(semaphore);
#endif
#endif
#if CFN_MAX_FLGID > 0
#ifdef USE_FUNC_EVENTFLAG_INITIALIZE
    InitModule(eventflag);
#endif
#endif
#if CFN_MAX_MBXID > 0
#ifdef USE_FUNC_MAILBOX_INITIALIZE
    InitModule(mailbox);
#endif
#endif
#if CFN_MAX_MBFID > 0
#ifdef USE_FUNC_MESSAGEBUFFER_INITIALIZE
    InitModule(messagebuffer);
#endif
#endif
#if CFN_MAX_PORID > 0
#ifdef USE_FUNC_RENDEZVOUS_INITIALIZE
    InitModule(rendezvous);
#endif
#endif
#if CFN_MAX_MTXID > 0
#ifdef USE_FUNC_MUTEX_INITIALIZE
    InitModule(mutex);
#endif
#endif
#if CFN_MAX_MPLID > 0
#ifdef USE_FUNC_MEMORYPOOL_INITIALIZE
    InitModule(memorypool);
#endif
#endif
#if CFN_MAX_MPFID > 0
#ifdef USE_FUNC_FIX_MEMORYPOOL_INITIALIZE
    InitModule(fix_memorypool);
#endif
#endif
#if CFN_MAX_CYCID > 0
#ifdef USE_FUNC_CYCLICHANDLER_INITIALIZE
    InitModule(cyclichandler);
#endif
#endif
#if CFN_MAX_ALMID > 0
#ifdef USE_FUNC_ALARMHANDLER_INITIALIZE
    InitModule(alarmhandler);
#endif
#endif
#if CFN_MAX_SSYID > 0
#ifdef USE_FUNC_SUBSYSTEM_INITIALIZE
    InitModule(subsystem);
#endif
#endif
    InitModule(timer);

    /*
     * Create/start initial task
     */
    knl_init_task_startup(inittask);

    knl_force_dispatch();
    /* No return */
}
示例#8
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;
}