INT16S start_rtcs_scheduler(void) /***************************************************************************** * Input : - * Output : - * Function : The RTCS scheduler ******************************************************************************/ { // contains temp status of semaphores. // INT16U semaphores_task = 0; ENTER_CRITICAL(); task_setup(); init_tasks(); systick_init(); EXIT_CRITICAL(); while(1) { if (systick_get()) { systick_decrement(); for (rtcs_i = 0; rtcs_i < LAST_TASK+1; rtcs_i++) { if ((task_state[rtcs_i] == RUNNING) && (task_time[rtcs_i] > 0)) { task_time[rtcs_i]--; } } for (rtcs_i = 0; rtcs_i < LAST_TASK+1; rtcs_i++) { if _READY(rtcs_i) { task_time[rtcs_i] = 0; current_task = rtcs_i; // Call task. (*task[rtcs_i])(); } } } // if (tick_flag) } // while(!) return 0; }
int16_t start_rtcs_scheduler(void) /***************************************************************************** * Input : - * Output : - * Function : The RTCS scheduler ******************************************************************************/ { // contains temp status of semaphores. // INT16U semaphores_task = 0; ENTER_CRITICAL(); timer0_systick_init(); timer0_systick_start(); task_setup(); init_tasks(); EXIT_CRITICAL(); while(1) { //Simple and no good implementation of timer incrementation //This needs to be changed into a correct interrupt handler. if (Xil_In32(XSCUTIMER_0_INT_STATUS_REG) & 0x00000001) { // Clear SCUtimer interrupt flag Xil_Out32(XSCUTIMER_0_INT_STATUS_REG,0x00000001); //increment tick systick_increment(); //increment systime systime_increment(); } if (systick_get()) { systick_decrement(); for (rtcs_i = 0; rtcs_i < LAST_TASK+1; rtcs_i++) { if ((task_state[rtcs_i] == RUNNING) && (task_time[rtcs_i] > 0)) { task_time[rtcs_i]--; } } for (rtcs_i = 0; rtcs_i < LAST_TASK+1; rtcs_i++) { if _READY(rtcs_i) { task_time[rtcs_i] = 0; current_task = rtcs_i; // Call task. (*task[rtcs_i])(); } } if(err_overload_hndlr != NULL) { //call overload error handler (*err_overload_hndlr)(systick_get()); //if tick > 0 the cpu is overloaded } } } // while(!) return 0; }