From a3443088f547091ac2a489701557e29acbf24a0e Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 6 Jun 2013 15:32:22 +0200 Subject: scheduler: Add and use _Scheduler_default_Tick() Delete _Scheduler_priority_Tick(). Use _SMP_Get_processor_count() for default tick operation. Delete _Scheduler_simple_smp_Tick(). --- cpukit/score/Makefile.am | 4 +- cpukit/score/include/rtems/score/scheduler.h | 8 ++ cpukit/score/include/rtems/score/schedulercbs.h | 2 +- cpukit/score/include/rtems/score/scheduleredf.h | 2 +- .../score/include/rtems/score/schedulerpriority.h | 11 +-- cpukit/score/include/rtems/score/schedulersimple.h | 2 +- .../score/include/rtems/score/schedulersimplesmp.h | 11 +-- cpukit/score/src/schedulerdefaulttick.c | 93 ++++++++++++++++++ cpukit/score/src/schedulerprioritytick.c | 83 ---------------- cpukit/score/src/schedulersimplesmptick.c | 107 --------------------- 10 files changed, 108 insertions(+), 215 deletions(-) create mode 100644 cpukit/score/src/schedulerdefaulttick.c delete mode 100644 cpukit/score/src/schedulerprioritytick.c delete mode 100644 cpukit/score/src/schedulersimplesmptick.c diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am index 50626fe79c..f072cf3cbc 100644 --- a/cpukit/score/Makefile.am +++ b/cpukit/score/Makefile.am @@ -136,7 +136,7 @@ endif if HAS_SMP libscore_a_SOURCES += src/isrsmp.c src/smp.c \ src/schedulersimplesmpblock.c src/schedulersimplesmpschedule.c \ - src/schedulersimplesmpunblock.c src/schedulersimplesmptick.c + src/schedulersimplesmpunblock.c endif ## CORE_APIMUTEX_C_FILES @@ -197,12 +197,12 @@ libscore_a_SOURCES += src/objectallocate.c src/objectclose.c \ ## SCHEDULER_C_FILES libscore_a_SOURCES += src/scheduler.c +libscore_a_SOURCES += src/schedulerdefaulttick.c libscore_a_SOURCES += src/schedulerdefaultstartidle.c ## SCHEDULERPRIORITY_C_FILES libscore_a_SOURCES += src/schedulerpriority.c \ src/schedulerpriorityallocate.c \ - src/schedulerprioritytick.c \ src/schedulerpriorityblock.c \ src/schedulerpriorityenqueue.c \ src/schedulerpriorityenqueuefirst.c \ diff --git a/cpukit/score/include/rtems/score/scheduler.h b/cpukit/score/include/rtems/score/scheduler.h index aa40e9ba9f..563d6c9598 100644 --- a/cpukit/score/include/rtems/score/scheduler.h +++ b/cpukit/score/include/rtems/score/scheduler.h @@ -149,6 +149,14 @@ extern Scheduler_Control _Scheduler; */ void _Scheduler_Handler_initialization( void ); +/** + * @brief Performs tick operations depending on the CPU budget algorithm for + * each executing thread. + * + * This routine is invoked as part of processing each clock tick. + */ +void _Scheduler_default_Tick( void ); + /** * @brief Unblocks the thread. * diff --git a/cpukit/score/include/rtems/score/schedulercbs.h b/cpukit/score/include/rtems/score/schedulercbs.h index 41f8ab0b57..bec989fd34 100644 --- a/cpukit/score/include/rtems/score/schedulercbs.h +++ b/cpukit/score/include/rtems/score/schedulercbs.h @@ -60,7 +60,7 @@ extern "C" { _Scheduler_EDF_Extract, /* extract entry point */ \ _Scheduler_EDF_Priority_compare, /* compares two priorities */ \ _Scheduler_CBS_Release_job, /* new period of task */ \ - _Scheduler_priority_Tick, /* tick entry point */ \ + _Scheduler_default_Tick, /* tick entry point */ \ _Scheduler_default_Start_idle /* start idle entry point */ \ } diff --git a/cpukit/score/include/rtems/score/scheduleredf.h b/cpukit/score/include/rtems/score/scheduleredf.h index 7846067a7d..090974bb07 100644 --- a/cpukit/score/include/rtems/score/scheduleredf.h +++ b/cpukit/score/include/rtems/score/scheduleredf.h @@ -53,7 +53,7 @@ extern "C" { _Scheduler_EDF_Extract, /* extract entry point */ \ _Scheduler_EDF_Priority_compare, /* compares two priorities */ \ _Scheduler_EDF_Release_job, /* new period of task */ \ - _Scheduler_priority_Tick, /* tick entry point */ \ + _Scheduler_default_Tick, /* tick entry point */ \ _Scheduler_default_Start_idle /* start idle entry point */ \ } diff --git a/cpukit/score/include/rtems/score/schedulerpriority.h b/cpukit/score/include/rtems/score/schedulerpriority.h index f0582c1315..f6fdaffd7c 100644 --- a/cpukit/score/include/rtems/score/schedulerpriority.h +++ b/cpukit/score/include/rtems/score/schedulerpriority.h @@ -52,7 +52,7 @@ extern "C" { _Scheduler_priority_Extract, /* extract entry point */ \ _Scheduler_priority_Priority_compare, /* compares two priorities */ \ _Scheduler_priority_Release_job, /* new period of task */ \ - _Scheduler_priority_Tick, /* tick entry point */ \ + _Scheduler_default_Tick, /* tick entry point */ \ _Scheduler_default_Start_idle /* start idle entry point */ \ } @@ -225,15 +225,6 @@ void _Scheduler_priority_Release_job ( uint32_t deadline ); -/** - * @brief Determines if the current thread allows timeslicing. - * - * This routine is invoked as part of processing each clock tick. - * It is responsible for determining if the current thread allows - * timeslicing and, if so, when its timeslice expires. - */ -void _Scheduler_priority_Tick( void ); - /** * This is the major bit map. */ diff --git a/cpukit/score/include/rtems/score/schedulersimple.h b/cpukit/score/include/rtems/score/schedulersimple.h index 47b74befbe..0cdc8fcd91 100644 --- a/cpukit/score/include/rtems/score/schedulersimple.h +++ b/cpukit/score/include/rtems/score/schedulersimple.h @@ -50,7 +50,7 @@ extern "C" { _Scheduler_simple_Extract, /* extract entry point */ \ _Scheduler_priority_Priority_compare, /* compares two priorities */ \ _Scheduler_priority_Release_job, /* new period of task */ \ - _Scheduler_priority_Tick, /* tick entry point */ \ + _Scheduler_default_Tick, /* tick entry point */ \ _Scheduler_default_Start_idle /* start idle entry point */ \ } diff --git a/cpukit/score/include/rtems/score/schedulersimplesmp.h b/cpukit/score/include/rtems/score/schedulersimplesmp.h index 63213c6b2a..baac7b221d 100644 --- a/cpukit/score/include/rtems/score/schedulersimplesmp.h +++ b/cpukit/score/include/rtems/score/schedulersimplesmp.h @@ -62,7 +62,7 @@ extern "C" { _Scheduler_simple_Extract, /* extract entry point */ \ _Scheduler_priority_Priority_compare, /* compares two priorities */ \ _Scheduler_priority_Release_job, /* new period of task */ \ - _Scheduler_simple_smp_Tick /* tick entry point */ \ + _Scheduler_default_Tick /* tick entry point */ \ } /** @@ -102,15 +102,6 @@ void _Scheduler_simple_smp_Unblock( Thread_Control *the_thread ); -/** - * @brief Invoked as part of processing each SMP clock tick. - * - * This routine is invoked as part of processing each clock tick. - * It is responsible for determining if the current thread allows - * timeslicing and, if so, when its timeslice expires. - */ -void _Scheduler_simple_smp_Tick( void ); - #ifdef __cplusplus } #endif diff --git a/cpukit/score/src/schedulerdefaulttick.c b/cpukit/score/src/schedulerdefaulttick.c new file mode 100644 index 0000000000..a9bc58a8c2 --- /dev/null +++ b/cpukit/score/src/schedulerdefaulttick.c @@ -0,0 +1,93 @@ +/** + * @file + * + * @brief Default Scheduler At Tick Handler + * + * @ingroup ScoreScheduler + */ + +/* + * COPYRIGHT (c) 1989-2009. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +static void _Scheduler_default_Tick_for_executing( Thread_Control *executing ) +{ + #ifdef __RTEMS_USE_TICKS_FOR_STATISTICS__ + /* + * Increment the number of ticks this thread has been executing + */ + executing->cpu_time_used++; + #endif + + /* + * If the thread is not preemptible or is not ready, then + * just return. + */ + + if ( !executing->is_preemptible ) + return; + + if ( !_States_Is_ready( executing->current_state ) ) + return; + + /* + * The cpu budget algorithm determines what happens next. + */ + + switch ( executing->budget_algorithm ) { + case THREAD_CPU_BUDGET_ALGORITHM_NONE: + break; + + case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE: + #if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE) + case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE: + #endif + if ( (int)(--executing->cpu_time_budget) <= 0 ) { + + /* + * A yield performs the ready chain mechanics needed when + * resetting a timeslice. If no other thread's are ready + * at the priority of the currently executing thread, then the + * executing thread's timeslice is reset. Otherwise, the + * currently executing thread is placed at the rear of the + * FIFO for this priority and a new heir is selected. + */ + _Scheduler_Yield( executing ); + executing->cpu_time_budget = _Thread_Ticks_per_timeslice; + } + break; + + #if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT) + case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT: + if ( --executing->cpu_time_budget == 0 ) + (*executing->budget_callout)( executing ); + break; + #endif + } +} + +void _Scheduler_default_Tick( void ) +{ + uint32_t processor_count = _SMP_Get_processor_count(); + uint32_t processor; + + for ( processor = 0 ; processor < processor_count ; ++processor ) { + _Scheduler_default_Tick_for_executing( + _Per_CPU_Information[ processor ].executing + ); + } +} diff --git a/cpukit/score/src/schedulerprioritytick.c b/cpukit/score/src/schedulerprioritytick.c deleted file mode 100644 index 7ce3efdb3a..0000000000 --- a/cpukit/score/src/schedulerprioritytick.c +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @file - * - * @brief Priority Scheduler At Tick Handler - * - * @ingroup ScoreScheduler - */ - -/* - * COPYRIGHT (c) 1989-2009. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.com/license/LICENSE. - */ - -#if HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -void _Scheduler_priority_Tick( void ) -{ - Thread_Control *executing; - - executing = _Thread_Executing; - - #ifdef __RTEMS_USE_TICKS_FOR_STATISTICS__ - /* - * Increment the number of ticks this thread has been executing - */ - executing->cpu_time_used++; - #endif - - /* - * If the thread is not preemptible or is not ready, then - * just return. - */ - - if ( !executing->is_preemptible ) - return; - - if ( !_States_Is_ready( executing->current_state ) ) - return; - - /* - * The cpu budget algorithm determines what happens next. - */ - - switch ( executing->budget_algorithm ) { - case THREAD_CPU_BUDGET_ALGORITHM_NONE: - break; - - case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE: - #if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE) - case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE: - #endif - if ( (int)(--executing->cpu_time_budget) <= 0 ) { - - /* - * A yield performs the ready chain mechanics needed when - * resetting a timeslice. If no other thread's are ready - * at the priority of the currently executing thread, then the - * executing thread's timeslice is reset. Otherwise, the - * currently executing thread is placed at the rear of the - * FIFO for this priority and a new heir is selected. - */ - _Scheduler_Yield( executing ); - executing->cpu_time_budget = _Thread_Ticks_per_timeslice; - } - break; - - #if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT) - case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT: - if ( --executing->cpu_time_budget == 0 ) - (*executing->budget_callout)( executing ); - break; - #endif - } -} diff --git a/cpukit/score/src/schedulersimplesmptick.c b/cpukit/score/src/schedulersimplesmptick.c deleted file mode 100644 index 72f8b1f761..0000000000 --- a/cpukit/score/src/schedulersimplesmptick.c +++ /dev/null @@ -1,107 +0,0 @@ -/** - * @file - * - * @brief Scheduler Simple SMP Tick Method - * @ingroup ScoreScheduler - */ - -/* - * COPYRIGHT (c) 1989-2009. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.com/license/LICENSE. - */ - -#if HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -static void _Scheduler_simple_smp_Tick_helper( - int cpu -) -{ - Thread_Control *executing; - ISR_Level level; - - executing = _Per_CPU_Information[cpu].executing; - - #ifdef __RTEMS_USE_TICKS_FOR_STATISTICS__ - /* - * Increment the number of ticks this thread has been executing - */ - executing->cpu_time_used++; - #endif - - /* - * If the thread is not preemptible or is not ready, then - * just return. - */ - - if ( !executing->is_preemptible ) - return; - - if ( !_States_Is_ready( executing->current_state ) ) - return; - - /* - * The cpu budget algorithm determines what happens next. - */ - - switch ( executing->budget_algorithm ) { - case THREAD_CPU_BUDGET_ALGORITHM_NONE: - break; - - case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE: - #if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE) - case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE: - #endif - if ( (int)(--executing->cpu_time_budget) <= 0 ) { - - /* - * A yield performs the ready chain mechanics needed when - * resetting a timeslice. If no other thread's are ready - * at the priority of the currently executing thread, then the - * executing thread's timeslice is reset. Otherwise, the - * currently executing thread is placed at the rear of the - * FIFO for this priority and a new heir is selected. - * - * In the SMP case, we do the chain manipulation for every - * CPU, then schedule after all CPUs have been evaluated. - */ - _ISR_Disable( level ); - _Scheduler_simple_Ready_queue_requeue( &_Scheduler, executing ); - _ISR_Enable( level ); - - executing->cpu_time_budget = _Thread_Ticks_per_timeslice; - } - break; - - #if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT) - case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT: - if ( --executing->cpu_time_budget == 0 ) - (*executing->budget_callout)( executing ); - break; - #endif - } -} - -void _Scheduler_simple_smp_Tick( void ) -{ - uint32_t cpu; - - /* - * Iterate over all cores, updating time slicing information - * and logically performing a yield. Then perform a schedule - * operation to account for all the changes. - */ - for ( cpu=0 ; cpu < _SMP_Processor_count ; cpu++ ) { - _Scheduler_simple_smp_Tick_helper( cpu ); - } - _Scheduler_simple_smp_Schedule(); -} -- cgit v1.2.3