From c5466a3ae49d744834b026d0e16d622234181c50 Mon Sep 17 00:00:00 2001 From: Petr Benes Date: Fri, 25 Mar 2011 13:10:06 +0100 Subject: [PATCH] scheduler_edf.c updated, still does not work --- rtems-omk-template/appfoo/scheduler_edf.c | 42 +++++++++++++++++------ 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/rtems-omk-template/appfoo/scheduler_edf.c b/rtems-omk-template/appfoo/scheduler_edf.c index 7df3342..2cbd8b3 100644 --- a/rtems-omk-template/appfoo/scheduler_edf.c +++ b/rtems-omk-template/appfoo/scheduler_edf.c @@ -3,6 +3,7 @@ #include #include #include +#include #include /* let the scheduler talk */ @@ -13,9 +14,11 @@ void _Scheduler_edf_Initialize(void) { #ifdef SCHED_VERBOSE printf("Sched: Initialize"); #endif - // nainicializovat strom + // initialize the RB tree _Thread_Ready_EDF_chain.root = NULL; _Thread_Ready_EDF_chain.first = NULL; + _Thread_Heir = NULL; + _Thread_Executing = NULL; } void _Scheduler_edf_Block( Thread_Control *the_thread ) { @@ -29,7 +32,7 @@ void _Scheduler_edf_Schedule(void) { #ifdef SCHED_VERBOSE printf("Sched: Schedule"); #endif - // hastavit heir + // set the heir _Thread_Heir = (Thread_Control *) _Thread_Ready_EDF_chain.first; } @@ -38,8 +41,22 @@ void * _Scheduler_edf_Allocate( Thread_Control *the_thread) { printf("Sched: Allocate"); #endif void * sched; + RBT_Node *schinfo; sched = _Workspace_Allocate (sizeof(RBT_Node)); the_thread->scheduler_info = (RBT_Node *) sched; + the_thread->real_priority = ABS_DEADLINE_MAXIMUM - _Watchdog_Ticks_since_boot-2; + the_thread->is_preemptible = TRUE; + the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; + the_thread->budget_callout = NULL; + + schinfo = (RBT_Node *)(the_thread->scheduler_info); + schinfo->rel_deadline = the_thread->real_priority; + schinfo->abs_deadline = 0; + schinfo->left = NULL; + schinfo->right = NULL; + schinfo->parent = NULL; + schinfo->ready_chain = &_Thread_Ready_EDF_chain; + return sched; } @@ -56,8 +73,9 @@ void _Scheduler_edf_Update( Thread_Control *the_thread) { #endif // after a priority changes, just extract and insert again //in case it is in the tree - _Scheduler_edf_Extract(the_thread); - _Scheduler_edf_Enqueue(the_thread); + EDF_Chain_Control* chain = ((RBT_Node*)the_thread->scheduler_info)->ready_chain; + _RBT_Extract(chain, the_thread); + _RBT_Insert(chain, the_thread); // preserve the abs_deadline } void _Scheduler_edf_Unblock( Thread_Control *the_thread ) { @@ -82,28 +100,30 @@ void _Scheduler_edf_Yield( void ) { ready = sched_info->ready_chain; _ISR_Disable( level ); if ( !_RBT_Has_only_one_node( ready ) ) { - _RBT_Extract(ready,executing); - _RBT_Insert(ready,executing); + _RBT_Extract(ready,executing); + _RBT_Insert(ready,executing); // preserve the abs_deadline _ISR_Flash( level ); if ( _Thread_Is_heir( executing ) ) _Thread_Heir = (Thread_Control *) ready->first; - _Thread_Dispatch_necessary = true; + _Thread_Dispatch_necessary = TRUE; } else if ( !_Thread_Is_heir( executing ) ) - _Thread_Dispatch_necessary = true; + _Thread_Dispatch_necessary = TRUE; _ISR_Enable( level ); - + // -------------------------------- + } void _Scheduler_edf_Enqueue( Thread_Control *the_thread) { #ifdef SCHED_VERBOSE printf("Sched: Enqueue"); #endif - // insert do stromu - EDF_Chain_Control* chain = ((RBT_Node*)the_thread->scheduler_info)->ready_chain; + RBT_Node *node = (RBT_Node*)the_thread->scheduler_info; + EDF_Chain_Control *chain = node->ready_chain; + node->abs_deadline = _Watchdog_Ticks_since_boot + node->rel_deadline; _RBT_Insert(chain,the_thread); } -- 2.39.2