diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-09-15 15:49:32 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-09-15 15:49:32 +0000 |
commit | 82db8e5675c79ddbdf6382308b0ff034e6f02103 (patch) | |
tree | 2aef1a6f350019f5a73501beaf6b875b69706099 /cpukit/score/src/schedulercbs.c | |
parent | 2011-09-15 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff) | |
download | rtems-82db8e5675c79ddbdf6382308b0ff034e6f02103.tar.bz2 |
2011-09-15 Petr Benes <benesp16@fel.cvut.cz>
PR 1906/cpukit
* sapi/Makefile.am, sapi/preinstall.am, sapi/include/confdefs.h,
score/Makefile.am, score/preinstall.am: Add the CBS (Constant
Bandwidth Server) scheduler. This is a complex scheduling policy
built atop of the EDF scheduler. Unlike other schedulers, this one
provides a user API and handles not only deadlines of tasks but also
claimed budget per period. The main aim of the scheduler is isolation
of tasks so that each task is guaranteed to meet all deadlines
regardless of how other tasks behave.
* sapi/include/rtems/cbs.h, sapi/inline/rtems/cbs.inl,
score/include/rtems/score/schedulercbs.h, score/src/schedulercbs.c,
score/src/schedulercbsattachthread.c,
score/src/schedulercbscleanup.c,
score/src/schedulercbscreateserver.c,
score/src/schedulercbsdestroyserver.c,
score/src/schedulercbsdetachthread.c,
score/src/schedulercbsgetapprovedbudget.c,
score/src/schedulercbsgetexecutiontime.c,
score/src/schedulercbsgetparameters.c,
score/src/schedulercbsgetremainingbudget.c,
score/src/schedulercbsgetserverid.c,
score/src/schedulercbsreleasejob.c,
score/src/schedulercbssetparameters.c,
score/src/schedulercbsunblock.c: New files.
Diffstat (limited to 'cpukit/score/src/schedulercbs.c')
-rw-r--r-- | cpukit/score/src/schedulercbs.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/cpukit/score/src/schedulercbs.c b/cpukit/score/src/schedulercbs.c new file mode 100644 index 0000000000..dba4925b8d --- /dev/null +++ b/cpukit/score/src/schedulercbs.c @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2011 Petr Benes. + * Copyright (C) 2011 On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems/system.h> +#include <rtems/config.h> +#include <rtems/score/scheduler.h> +#include <rtems/score/schedulercbs.h> +#include <rtems/rtems/signal.h> + +void _Scheduler_CBS_Budget_callout( + Thread_Control *the_thread +) +{ + Priority_Control new_priority; + Scheduler_CBS_Per_thread *sched_info; + Scheduler_CBS_Server_id server_id; + + /* Put violating task to background until the end of period. */ + new_priority = the_thread->Start.initial_priority; + if ( the_thread->real_priority != new_priority ) + the_thread->real_priority = new_priority; + if ( the_thread->current_priority != new_priority ) + _Thread_Change_priority(the_thread, new_priority, true); + + /* Invoke callback function if any. */ + sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info; + if ( sched_info->cbs_server->cbs_budget_overrun ) { + _Scheduler_CBS_Get_server_id( + sched_info->cbs_server->task_id, + &server_id + ); + sched_info->cbs_server->cbs_budget_overrun( server_id ); + } +} + +int _Scheduler_CBS_Initialize(void) +{ + unsigned int i; + _Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate( + _Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) ); + if ( !_Scheduler_CBS_Server_list ) + return SCHEDULER_CBS_ERROR_NO_MEMORY; + for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) { + _Scheduler_CBS_Server_list[i] = NULL; + } + return SCHEDULER_CBS_OK; +} |