[PATCH 1/3] score: Add and use Scheduler_EDF_Control
Gedare Bloom
gedare at rtems.org
Fri Apr 4 18:12:29 UTC 2014
Good.
On Thu, Apr 3, 2014 at 10:28 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> ---
> cpukit/sapi/include/confdefs.h | 9 ++++++---
> cpukit/score/include/rtems/score/scheduleredf.h | 12 +++++++-----
> .../score/include/rtems/score/scheduleredfimpl.h | 13 ++++++++++---
> cpukit/score/src/scheduleredf.c | 15 +++++++++------
> cpukit/score/src/scheduleredfenqueue.c | 9 ++++-----
> cpukit/score/src/scheduleredfextract.c | 9 ++++-----
> cpukit/score/src/scheduleredfyield.c | 8 +++++---
> 7 files changed, 45 insertions(+), 30 deletions(-)
>
> diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h
> index 53ea2f1..aed15fc 100644
> --- a/cpukit/sapi/include/confdefs.h
> +++ b/cpukit/sapi/include/confdefs.h
> @@ -748,7 +748,7 @@ const rtems_libio_helper rtems_fs_init_helper =
> * define the memory used by the EDF scheduler
> */
> #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
> - _Configure_From_workspace(0))
> + _Configure_From_workspace(sizeof(Scheduler_EDF_Control)))
> #define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER ( \
> _Configure_From_workspace(sizeof(Scheduler_EDF_Per_thread)))
> #endif
> @@ -772,8 +772,11 @@ const rtems_libio_helper rtems_fs_init_helper =
> * define the memory used by the CBS scheduler
> */
> #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
> - _Configure_From_workspace((sizeof(Scheduler_CBS_Server) + \
> - sizeof(Scheduler_CBS_Server*)) * CONFIGURE_CBS_MAXIMUM_SERVERS))
> + _Configure_From_workspace(sizeof(Scheduler_EDF_Control)) + \
> + _Configure_From_workspace(CONFIGURE_CBS_MAXIMUM_SERVERS * \
> + sizeof(Scheduler_CBS_Server *)) + \
> + CONFIGURE_CBS_MAXIMUM_SERVERS * \
> + _Configure_From_workspace(sizeof(Scheduler_CBS_Server)))
> #define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER ( \
> _Configure_From_workspace(sizeof(Scheduler_CBS_Per_thread)))
> #endif
> diff --git a/cpukit/score/include/rtems/score/scheduleredf.h b/cpukit/score/include/rtems/score/scheduleredf.h
> index 153b882..2d5f537 100644
> --- a/cpukit/score/include/rtems/score/scheduleredf.h
> +++ b/cpukit/score/include/rtems/score/scheduleredf.h
> @@ -66,6 +66,13 @@ extern "C" {
> */
> #define SCHEDULER_EDF_PRIO_MSB 0x80000000
>
> +typedef struct {
> + /**
> + * Top of the ready queue.
> + */
> + RBTree_Control Ready;
> +} Scheduler_EDF_Control;
> +
> /**
> * @typedef Scheduler_EDF_Queue_state
> *
> @@ -97,11 +104,6 @@ typedef struct {
> } Scheduler_EDF_Per_thread;
>
> /**
> - * Top of the ready queue.
> - */
> -extern RBTree_Control _Scheduler_EDF_Ready_queue;
> -
> -/**
> * @brief Initialize EDF scheduler.
> *
> * This routine initializes the EDF scheduler.
> diff --git a/cpukit/score/include/rtems/score/scheduleredfimpl.h b/cpukit/score/include/rtems/score/scheduleredfimpl.h
> index 91df20a..aa1d215 100644
> --- a/cpukit/score/include/rtems/score/scheduleredfimpl.h
> +++ b/cpukit/score/include/rtems/score/scheduleredfimpl.h
> @@ -31,12 +31,19 @@ extern "C" {
> * @{
> */
>
> +RTEMS_INLINE_ROUTINE Scheduler_EDF_Control *_Scheduler_EDF_Instance( void )
> +{
> + return _Scheduler.information;
> +}
> +
> RTEMS_INLINE_ROUTINE void _Scheduler_EDF_Schedule_body(
> - Thread_Control *thread,
> - bool force_dispatch
> + Thread_Control *the_thread
> + bool force_dispatch
> )
> {
> - RBTree_Node *first = _RBTree_First(&_Scheduler_EDF_Ready_queue, RBT_LEFT);
> + Scheduler_EDF_Control *scheduler =
> + _Scheduler_EDF_Instance();
> + RBTree_Node *first = _RBTree_First(&scheduler->Ready, RBT_LEFT);
> Scheduler_EDF_Per_thread *sched_info =
> _RBTree_Container_of(first, Scheduler_EDF_Per_thread, Node);
> Thread_Control *heir = (Thread_Control *) sched_info->thread;
> diff --git a/cpukit/score/src/scheduleredf.c b/cpukit/score/src/scheduleredf.c
> index 10d9ae0..14f784f 100644
> --- a/cpukit/score/src/scheduleredf.c
> +++ b/cpukit/score/src/scheduleredf.c
> @@ -21,6 +21,7 @@
> #include <rtems/score/scheduleredf.h>
> #include <rtems/score/schedulerimpl.h>
> #include <rtems/score/thread.h>
> +#include <rtems/score/wkspace.h>
>
> static int _Scheduler_EDF_RBTree_compare_function
> (
> @@ -42,12 +43,14 @@ static int _Scheduler_EDF_RBTree_compare_function
>
> void _Scheduler_EDF_Initialize(void)
> {
> + Scheduler_EDF_Control *scheduler =
> + _Workspace_Allocate_or_fatal_error( sizeof( *scheduler ) );
> +
> _RBTree_Initialize_empty(
> - &_Scheduler_EDF_Ready_queue,
> - &_Scheduler_EDF_RBTree_compare_function,
> - 0
> + &scheduler->Ready,
> + _Scheduler_EDF_RBTree_compare_function,
> + 0
> );
> -}
>
> -/* Instantiate any global variables needed by the EDF scheduler */
> -RBTree_Control _Scheduler_EDF_Ready_queue;
> + _Scheduler.information = scheduler;
> +}
> diff --git a/cpukit/score/src/scheduleredfenqueue.c b/cpukit/score/src/scheduleredfenqueue.c
> index ff10310..e7c2e44 100644
> --- a/cpukit/score/src/scheduleredfenqueue.c
> +++ b/cpukit/score/src/scheduleredfenqueue.c
> @@ -18,19 +18,18 @@
> #include "config.h"
> #endif
>
> -#include <rtems/system.h>
> -#include <rtems/config.h>
> -#include <rtems/score/scheduler.h>
> -#include <rtems/score/scheduleredf.h>
> +#include <rtems/score/scheduleredfimpl.h>
>
> void _Scheduler_EDF_Enqueue(
> Thread_Control *the_thread
> )
> {
> + Scheduler_EDF_Control *scheduler =
> + _Scheduler_EDF_Instance();
> Scheduler_EDF_Per_thread *sched_info =
> (Scheduler_EDF_Per_thread*) the_thread->scheduler_info;
> RBTree_Node *node = &(sched_info->Node);
>
> - _RBTree_Insert( &_Scheduler_EDF_Ready_queue, node );
> + _RBTree_Insert( &scheduler->Ready, node );
> sched_info->queue_state = SCHEDULER_EDF_QUEUE_STATE_YES;
> }
> diff --git a/cpukit/score/src/scheduleredfextract.c b/cpukit/score/src/scheduleredfextract.c
> index 434f891..0287b4e 100644
> --- a/cpukit/score/src/scheduleredfextract.c
> +++ b/cpukit/score/src/scheduleredfextract.c
> @@ -18,19 +18,18 @@
> #include "config.h"
> #endif
>
> -#include <rtems/system.h>
> -#include <rtems/config.h>
> -#include <rtems/score/chain.h>
> -#include <rtems/score/scheduleredf.h>
> +#include <rtems/score/scheduleredfimpl.h>
>
> void _Scheduler_EDF_Extract(
> Thread_Control *the_thread
> )
> {
> + Scheduler_EDF_Control *scheduler =
> + _Scheduler_EDF_Instance();
> Scheduler_EDF_Per_thread *sched_info =
> (Scheduler_EDF_Per_thread*) the_thread->scheduler_info;
> RBTree_Node *node = &(sched_info->Node);
>
> - _RBTree_Extract( &_Scheduler_EDF_Ready_queue, node );
> + _RBTree_Extract( &scheduler->Ready, node );
> sched_info->queue_state = SCHEDULER_EDF_QUEUE_STATE_NOT_PRESENTLY;
> }
> diff --git a/cpukit/score/src/scheduleredfyield.c b/cpukit/score/src/scheduleredfyield.c
> index ffe6b74..c985684 100644
> --- a/cpukit/score/src/scheduleredfyield.c
> +++ b/cpukit/score/src/scheduleredfyield.c
> @@ -23,7 +23,9 @@
>
> void _Scheduler_EDF_Yield( Thread_Control *thread )
> {
> - ISR_Level level;
> + Scheduler_EDF_Control *scheduler =
> + _Scheduler_EDF_Instance();
> + ISR_Level level;
>
> Scheduler_EDF_Per_thread *thread_info =
> (Scheduler_EDF_Per_thread *) thread->scheduler_info;
> @@ -35,8 +37,8 @@ void _Scheduler_EDF_Yield( Thread_Control *thread )
> * The RBTree has more than one node, enqueue behind the tasks
> * with the same priority in case there are such ones.
> */
> - _RBTree_Extract( &_Scheduler_EDF_Ready_queue, thread_node );
> - _RBTree_Insert( &_Scheduler_EDF_Ready_queue, thread_node );
> + _RBTree_Extract( &scheduler->Ready, thread_node );
> + _RBTree_Insert( &scheduler->Ready, thread_node );
>
> _ISR_Flash( level );
>
> --
> 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