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