From 3891983283132f644cfb14a850cdb4cace74d447 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 3 Apr 2014 11:53:48 +0200 Subject: score: Add and use Scheduler_EDF_Control --- cpukit/sapi/include/confdefs.h | 9 ++++++--- cpukit/score/include/rtems/score/scheduleredf.h | 12 +++++++----- cpukit/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 ef8f09acf4..16049f9d4b 100644 --- a/cpukit/sapi/include/confdefs.h +++ b/cpukit/sapi/include/confdefs.h @@ -770,7 +770,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 @@ -794,8 +794,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 153b882495..2d5f537c59 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 * @@ -96,11 +103,6 @@ typedef struct { Scheduler_EDF_Queue_state queue_state; } Scheduler_EDF_Per_thread; -/** - * Top of the ready queue. - */ -extern RBTree_Control _Scheduler_EDF_Ready_queue; - /** * @brief Initialize EDF scheduler. * diff --git a/cpukit/score/include/rtems/score/scheduleredfimpl.h b/cpukit/score/include/rtems/score/scheduleredfimpl.h index 91df20a9a6..aa1d21591f 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 10d9ae0879..14f784f99d 100644 --- a/cpukit/score/src/scheduleredf.c +++ b/cpukit/score/src/scheduleredf.c @@ -21,6 +21,7 @@ #include #include #include +#include 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 ff10310207..e7c2e44b62 100644 --- a/cpukit/score/src/scheduleredfenqueue.c +++ b/cpukit/score/src/scheduleredfenqueue.c @@ -18,19 +18,18 @@ #include "config.h" #endif -#include -#include -#include -#include +#include 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 434f891060..0287b4ec86 100644 --- a/cpukit/score/src/scheduleredfextract.c +++ b/cpukit/score/src/scheduleredfextract.c @@ -18,19 +18,18 @@ #include "config.h" #endif -#include -#include -#include -#include +#include 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 ffe6b74286..c9856842f5 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 ); -- cgit v1.2.3