/* * End and delete its own task */ SYSCALL void _tk_exd_tsk( 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; _ter_tsk(ctxtsk); _del_tsk(ctxtsk); force_dispatch(); /* No return */ }
/* |------------------+-------------------------------------------------------------| */ StatusType ChainTask ( TaskType xTaskID ) { StatusType ercd; #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*)"ChainTask 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*)"ChainTask was called in the dispatch disabled\n"); #endif } #endif DISABLE_INTERRUPT; ercd = tk_sta_tsk(xTaskID,xTaskID); if(ercd < E_OK) { ENABLE_INTERRUPT; return ercd; } knl_ter_tsk(knl_ctxtsk); knl_make_dormant(knl_ctxtsk); OsekStartHighReadyTask(); /* No return */ #ifdef DORMANT_STACK_SIZE /* for WARNING */ _dummy[0] = 0; #endif }
/* * Refer system state */ SYSCALL ER tk_ref_sys_impl( T_RSYS *pk_rsys ) { if ( in_indp() ) { pk_rsys->sysstat = TSS_INDP; } else { if ( in_qtsk() ) { pk_rsys->sysstat = TSS_QTSK; } else { pk_rsys->sysstat = TSS_TSK; } if ( in_loc() ) { pk_rsys->sysstat |= TSS_DINT; } if ( in_ddsp() ) { pk_rsys->sysstat |= TSS_DDSP; } } pk_rsys->runtskid = ( knl_ctxtsk != NULL )? knl_ctxtsk->tskid: 0; pk_rsys->schedtskid = ( knl_schedtsk != NULL )? knl_schedtsk->tskid: 0; return E_OK; }
/* * End its own task */ SYSCALL void _tk_ext_tsk( void ) { #ifdef DORMANT_STACK_SIZE /* To avoid destroying stack used in 'make_dormant', allocate the dummy area on the stack. */ volatile VB _dummy[DORMANT_STACK_SIZE]; MEMSET((void *)_dummy, 0xCC, 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; _ter_tsk(ctxtsk); make_dormant(ctxtsk); force_dispatch(); /* No return */ #ifdef DORMANT_STACK_SIZE /* for WARNING */ _dummy[0] = 0; #endif }