[PATCH 09/12] scheduler: Add and use _Scheduler_default_Tick()
Gedare Bloom
gedare at rtems.org
Thu Jun 13 15:52:09 UTC 2013
On Wed, Jun 12, 2013 at 11:12 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> Delete _Scheduler_priority_Tick(). Use _Processors_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 | 92 +++++++++++++++++
> cpukit/score/src/schedulerprioritytick.c | 83 ---------------
> cpukit/score/src/schedulersimplesmptick.c | 107 --------------------
> 10 files changed, 107 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 9bc40b1..dc018f0 100644
> --- a/cpukit/score/Makefile.am
> +++ b/cpukit/score/Makefile.am
> @@ -138,7 +138,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
> @@ -199,12 +199,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 930412f..6e3b35f 100644
> --- a/cpukit/score/include/rtems/score/scheduler.h
> +++ b/cpukit/score/include/rtems/score/scheduler.h
> @@ -150,6 +150,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.
> *
> * @param[in/out] thread An idle thread.
> diff --git a/cpukit/score/include/rtems/score/schedulercbs.h b/cpukit/score/include/rtems/score/schedulercbs.h
> index 41f8ab0..bec989f 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 7846067..090974b 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 f0582c1..f6fdaff 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 */ \
> }
>
> @@ -226,15 +226,6 @@ void _Scheduler_priority_Release_job (
> );
>
> /**
> - * @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.
> */
> extern volatile Priority_bit_map_Control _Priority_Major_bit_map;
> diff --git a/cpukit/score/include/rtems/score/schedulersimple.h b/cpukit/score/include/rtems/score/schedulersimple.h
> index 47b74be..0cdc8fc 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 63213c6..baac7b2 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 0000000..a291edc
> --- /dev/null
> +++ b/cpukit/score/src/schedulerdefaulttick.c
> @@ -0,0 +1,92 @@
> +/**
> + * @file
> + *
> + * @brief Priority Scheduler At Tick Handler
s/Priority/Default ?
> + *
> + * @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 <rtems/system.h>
> +#include <rtems/score/scheduler.h>
> +#include <rtems/score/thread.h>
> +
> +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_with_thread( 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 = _Processors_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 8fa739c..0000000
> --- 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 <rtems/system.h>
> -#include <rtems/score/schedulerpriority.h>
> -
> -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_with_thread( 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 72f8b1f..0000000
> --- 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 <rtems/system.h>
> -#include <rtems/score/schedulersimplesmp.h>
> -#include <rtems/score/smp.h>
> -
> -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();
> -}
> --
> 1.7.7
>
> _______________________________________________
> rtems-devel mailing list
> rtems-devel at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-devel
More information about the devel
mailing list