]> rtime.felk.cvut.cz Git - rtems-pluggable-edf.git/commitdiff
scheduler_edf.c updated, still does not work
authorPetr Benes <benesp16@fel.cvut.cz>
Fri, 25 Mar 2011 12:10:06 +0000 (13:10 +0100)
committerPetr Benes <benesp16@fel.cvut.cz>
Fri, 25 Mar 2011 12:10:06 +0000 (13:10 +0100)
rtems-omk-template/appfoo/scheduler_edf.c

index 7df3342ce191d9729b4970393b26ee8a84616d8f..2cbd8b3419eaaf1e5f70d4269917087829015770 100644 (file)
@@ -3,6 +3,7 @@
 #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 */
@@ -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);
 }