#define EDF_BYTES_FOR_TIME 4 // It is uint32_t
//#define EDF_TIME_RANGE 0xffffffff
-#define EDF_ABS_DEADLINE_MAX ((1 << (EDF_BYTES_FOR_TIME*4)) - 1)
+
#define EDF_PRIORITY_MAX 255
/**
* We can distinguish them by looking at the MSB of their priority. Priority diven
* have 1 and deadline driven have 0.
*/
-#define EDF_HYBRID_MASK (1 << (EDF_BYTES_FOR_TIME*8 - 1)) //This is MSB
-
+#define EDF_HYBRID_MASK 0x80000000 //This is MSB
+//#define EDF_ABS_DEADLINE_MAX (EDF_HYBRID_MASK - 1)
typedef enum node_color_struct { N_RED, N_BLACK } Node_Color;
typedef Thread_Control EDF_Node;
* The threads wanted to be served on a priority base will be assigned the very
* longest deadlines.
*/
-#define edf_initial_priority_shift(init_prio) \
- (init_prio + EDF_ABS_DEADLINE_MAX + 1)
+// inline void edf_initial_priority_shift(Priority_Control *prio) {
+// prio += EDF_ABS_DEADLINE_MAX + 1;
+// }
void edf_next_period(Thread_Control *the_thread) {
RBT_Node *node = (RBT_Node*)the_thread->scheduler_info;
RBT_Node *schinfo;
sched = _Workspace_Allocate (sizeof(RBT_Node));
the_thread->scheduler_info = (RBT_Node *) sched;
- the_thread->real_priority = the_thread->current_priority = edf_initial_priority_shift(the_thread->real_priority);
+ //edf_initial_priority_shift(&(the_thread->real_priority));
+
+ the_thread->real_priority += (EDF_HYBRID_MASK);
+ the_thread->current_priority = the_thread->real_priority;
schinfo = (RBT_Node *)(the_thread->scheduler_info);
schinfo->rel_deadline = 0; // This has to be negotiated afterwards
schinfo->abs_deadline = 0;
+ schinfo->is_enqueued = 0;
schinfo->left = NULL;
schinfo->right = NULL;
schinfo->parent = NULL;
}
void _Scheduler_edf_Update( Thread_Control *the_thread) {
+ RBT_Node *node = (RBT_Node*)the_thread->scheduler_info;
// Update deadlines for deadline driven tasks
if (!(the_thread->current_priority && EDF_HYBRID_MASK))
((RBT_Node*)the_thread->scheduler_info)->abs_deadline = the_thread->current_priority;
else
((RBT_Node*)the_thread->scheduler_info)->abs_deadline = 0;
- _Scheduler_edf_Extract(the_thread);
- _Scheduler_edf_Enqueue(the_thread);
- if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
- _Thread_Heir = the_thread;
- if ( _Thread_Executing->is_preemptible || the_thread->current_priority == 0 )
- _Thread_Dispatch_necessary = true;
+ if(node->is_enqueued) {
+ _Scheduler_edf_Extract(the_thread);
+ _Scheduler_edf_Enqueue(the_thread);
+ if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
+ _Thread_Heir = the_thread;
+ if ( _Thread_Executing->is_preemptible || the_thread->current_priority == 0 )
+ _Thread_Dispatch_necessary = true;
+ }
}
}
ready = sched_info->ready_chain;
_ISR_Disable( level );
if ( !_RBT_Has_only_one_node( ready ) ) {
- _RBT_Extract(ready,executing);
- _RBT_Insert(ready,executing); // preserve the abs_deadline
+ _Scheduler_edf_Extract(executing);
+ _Scheduler_edf_Enqueue(executing); // preserve the abs_deadline
_ISR_Flash( level );
EDF_Chain_Control *chain = node->ready_chain;
_RBT_Insert(chain,the_thread);
+ node->is_enqueued = 1;
}
void _Scheduler_edf_Enqueue_first( Thread_Control *the_thread) {
}
void _Scheduler_edf_Extract( Thread_Control *the_thread) {
+ RBT_Node *node = (RBT_Node*)the_thread->scheduler_info;
EDF_Chain_Control* chain = ((RBT_Node*)the_thread->scheduler_info)->ready_chain;
+
_RBT_Extract(chain,the_thread);
+ node->is_enqueued = 0;
}