mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-21 23:05:18 +08:00
score: Add and use Scheduler_EDF_Control
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
_RBTree_Initialize_empty(
|
||||
&_Scheduler_EDF_Ready_queue,
|
||||
&_Scheduler_EDF_RBTree_compare_function,
|
||||
0
|
||||
);
|
||||
}
|
||||
Scheduler_EDF_Control *scheduler =
|
||||
_Workspace_Allocate_or_fatal_error( sizeof( *scheduler ) );
|
||||
|
||||
/* Instantiate any global variables needed by the EDF scheduler */
|
||||
RBTree_Control _Scheduler_EDF_Ready_queue;
|
||||
_RBTree_Initialize_empty(
|
||||
&scheduler->Ready,
|
||||
_Scheduler_EDF_RBTree_compare_function,
|
||||
0
|
||||
);
|
||||
|
||||
_Scheduler.information = scheduler;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
|
||||
Reference in New Issue
Block a user