#include <stdio.h>
#include <rtems/system.h>
#include <rtems/score/isr.h>
+#include <rtems/score/watchdog.h>
#include <rtems/score/wkspace.h>
/* let the scheduler talk */
#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 ) {
#ifdef SCHED_VERBOSE
printf("Sched: Schedule");
#endif
- // hastavit heir
+ // set the heir
_Thread_Heir = (Thread_Control *) _Thread_Ready_EDF_chain.first;
}
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;
}
#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 ) {
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);
}