/* * 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 */ }
/* |------------------+-------------------------------------------------------------| */ 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; }
/* |------------------+------------------------------------------------------| */ 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(); }
/* |------------------+--------------------------------------------------------------| */ 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; }
/* |------------------+--------------------------------------------------------------| */ 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 */ }
/* |------------------+-------------------------------------------------------------| */ 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; }