/********************************************************************** * Return the TCB of the next task ready to run. According to OSEK * specification, the next running task is the task in READY state * with the highest priority. * * @param void * @return ptrTCB Addresse of the TCB **********************************************************************/ ptrTCB GetNextRunningTCB(void) { ptrTCB parserTCB; parserTCB = firstTCB; SuspendOSInterrupts(); while (1) { if ((parserTCB->State & READY) && (parserTCB->State != WAITING)) { if ((parserTCB->Type & ROUND_ROBIN) && !(parserTCB->State & RR_RUNNING)) { if (parserTCB == parserTCB->next) break; else parserTCB = parserTCB->next; continue; } currentTCB = parserTCB; ResumeOSInterrupts(); return(parserTCB); } if (parserTCB == parserTCB->next) break; else parserTCB = parserTCB->next; } ResumeOSInterrupts(); return (NULL); }
/*test case:test the reaction of the system called with an activation of a task*/ static void test_t1_instance(void) { StatusType result_inst_1, result_inst_2, result_inst_3; SCHEDULING_CHECK_STEP(1); SuspendAllInterrupts(); SCHEDULING_CHECK_INIT(2); result_inst_1 = ActivateTask(t2); SCHEDULING_CHECK_AND_EQUAL_INT(2,E_OS_DISABLEDINT, result_inst_1); SCHEDULING_CHECK_STEP(3); sendSoftwareIt(0, SOFT_IRQ0); SCHEDULING_CHECK_STEP(4); ResumeOSInterrupts(); SCHEDULING_CHECK_STEP(5); EnableAllInterrupts(); SCHEDULING_CHECK_STEP(6); ResumeAllInterrupts(); SCHEDULING_CHECK_STEP(8); SuspendOSInterrupts(); SCHEDULING_CHECK_INIT(9); result_inst_2 = ActivateTask(t2); SCHEDULING_CHECK_AND_EQUAL_INT(9,E_OS_DISABLEDINT, result_inst_2); SCHEDULING_CHECK_STEP(10); sendSoftwareIt(0, SOFT_IRQ0); SCHEDULING_CHECK_STEP(11); ResumeAllInterrupts(); SCHEDULING_CHECK_STEP(12); EnableAllInterrupts(); SCHEDULING_CHECK_STEP(13); DisableAllInterrupts(); SCHEDULING_CHECK_STEP(14); EnableAllInterrupts(); SCHEDULING_CHECK_STEP(15); ResumeOSInterrupts(); SCHEDULING_CHECK_STEP(17); DisableAllInterrupts(); SCHEDULING_CHECK_INIT(18); result_inst_3 = ActivateTask(t2); SCHEDULING_CHECK_AND_EQUAL_INT(18,E_OS_DISABLEDINT, result_inst_3); SCHEDULING_CHECK_STEP(19); sendSoftwareIt(0, SOFT_IRQ0); SCHEDULING_CHECK_STEP(20); ResumeAllInterrupts(); SCHEDULING_CHECK_STEP(21); ResumeOSInterrupts(); SCHEDULING_CHECK_STEP(22); EnableAllInterrupts(); SCHEDULING_CHECK_STEP(24); }