change log for rtems (2011-09-15)

rtems-vc at rtems.org rtems-vc at rtems.org
Thu Sep 15 16:10:24 UTC 2011


 *joel*:
2011-09-15	Petr Benes <benesp16 at 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.

M 1.2921  cpukit/ChangeLog
M   1.43  cpukit/sapi/Makefile.am
M  1.173  cpukit/sapi/include/confdefs.h
A    1.1  cpukit/sapi/include/rtems/cbs.h
A    1.1  cpukit/sapi/inline/rtems/cbs.inl
M   1.13  cpukit/sapi/preinstall.am
M  1.110  cpukit/score/Makefile.am
A    1.1  cpukit/score/include/rtems/score/schedulercbs.h
M   1.35  cpukit/score/preinstall.am
A    1.1  cpukit/score/src/schedulercbs.c
A    1.1  cpukit/score/src/schedulercbsattachthread.c
A    1.1  cpukit/score/src/schedulercbscleanup.c
A    1.1  cpukit/score/src/schedulercbscreateserver.c
A    1.1  cpukit/score/src/schedulercbsdestroyserver.c
A    1.1  cpukit/score/src/schedulercbsdetachthread.c
A    1.1  cpukit/score/src/schedulercbsgetapprovedbudget.c
A    1.1  cpukit/score/src/schedulercbsgetexecutiontime.c
A    1.1  cpukit/score/src/schedulercbsgetparameters.c
A    1.1  cpukit/score/src/schedulercbsgetremainingbudget.c
A    1.1  cpukit/score/src/schedulercbsgetserverid.c
A    1.1  cpukit/score/src/schedulercbsreleasejob.c
A    1.1  cpukit/score/src/schedulercbssetparameters.c
A    1.1  cpukit/score/src/schedulercbsunblock.c

diff -u rtems/cpukit/ChangeLog:1.2920 rtems/cpukit/ChangeLog:1.2921
--- rtems/cpukit/ChangeLog:1.2920	Thu Sep 15 09:34:19 2011
+++ rtems/cpukit/ChangeLog	Thu Sep 15 10:49:30 2011
@@ -1,3 +1,30 @@
+2011-09-15	Petr Benes <benesp16 at 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.
+
 2011-09-15	Sebastian Huber <sebastian.huber at embedded-brains.de>
 
 	* cpukit/libmisc/cpuuse/cpuuse.h,

diff -u rtems/cpukit/sapi/Makefile.am:1.42 rtems/cpukit/sapi/Makefile.am:1.43
--- rtems/cpukit/sapi/Makefile.am:1.42	Wed May 18 00:16:23 2011
+++ rtems/cpukit/sapi/Makefile.am	Thu Sep 15 10:49:31 2011
@@ -15,6 +15,7 @@
 include_rtems_HEADERS += include/rtems/init.h
 include_rtems_HEADERS += include/rtems/io.h
 include_rtems_HEADERS += include/rtems/mptables.h
+include_rtems_HEADERS += include/rtems/cbs.h
 include_rtems_HEADERS += include/rtems/rbtree.h
 include_rtems_HEADERS += include/rtems/sptables.h
 
@@ -22,6 +23,7 @@
 
 include_rtems_HEADERS += inline/rtems/chain.inl
 include_rtems_HEADERS += inline/rtems/extension.inl
+include_rtems_HEADERS += inline/rtems/cbs.inl
 include_rtems_HEADERS += inline/rtems/rbtree.inl
 
 ## src

diff -u rtems/cpukit/sapi/include/confdefs.h:1.172 rtems/cpukit/sapi/include/confdefs.h:1.173
--- rtems/cpukit/sapi/include/confdefs.h:1.172	Sun Sep 11 15:52:36 2011
+++ rtems/cpukit/sapi/include/confdefs.h	Thu Sep 15 10:49:31 2011
@@ -574,6 +574,7 @@
  *  CONFIGURE_SCHEDULER_SIMPLE     - Light-weight Priority Scheduler
  *  CONFIGURE_SCHEDULER_SIMPLE_SMP - Simple SMP Priority Scheduler
  *  CONFIGURE_SCHEDULER_EDF        - EDF Scheduler
+ *  CONFIGURE_SCHEDULER_CBS        - CBS Scheduler
  * 
  * If no configuration is specified by the application, then 
  * CONFIGURE_SCHEDULER_PRIORITY is assumed to be the default.
@@ -600,7 +601,8 @@
     !defined(CONFIGURE_SCHEDULER_PRIORITY) && \
     !defined(CONFIGURE_SCHEDULER_SIMPLE) && \
     !defined(CONFIGURE_SCHEDULER_SIMPLE_SMP) && \
-    !defined(CONFIGURE_SCHEDULER_EDF)
+    !defined(CONFIGURE_SCHEDULER_EDF) && \
+    !defined(CONFIGURE_SCHEDULER_CBS)
   #if defined(RTEMS_SMP) && defined(CONFIGURE_SMP_APPLICATION)
     #define CONFIGURE_SCHEDULER_SIMPLE_SMP
   #else
@@ -676,6 +678,31 @@
     _Configure_From_workspace(sizeof(Scheduler_EDF_Per_thread)))
 #endif
 
+/*
+ * If the CBS Scheduler is selected, then configure for it.
+ */
+#if defined(CONFIGURE_SCHEDULER_CBS)
+  #include <rtems/score/schedulercbs.h>
+  #define CONFIGURE_SCHEDULER_ENTRY_POINTS SCHEDULER_CBS_ENTRY_POINTS
+
+  #ifndef CONFIGURE_CBS_MAXIMUM_SERVERS
+    #define CONFIGURE_CBS_MAXIMUM_SERVERS CONFIGURE_MAXIMUM_TASKS
+  #endif
+
+  #ifdef CONFIGURE_INIT
+    uint32_t _Scheduler_CBS_Maximum_servers = CONFIGURE_CBS_MAXIMUM_SERVERS;
+  #endif
+
+  /**
+   * define the memory used by the CBS scheduler
+   */
+  #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
+    _Configure_From_workspace((sizeof(Scheduler_CBS_Server) + \
+        sizeof(Scheduler_CBS_Server*)) * CONFIGURE_CBS_MAXIMUM_SERVERS))
+  #define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER ( \
+    _Configure_From_workspace(sizeof(Scheduler_CBS_Per_thread)))
+#endif
+
 #if defined(CONFIGURE_SCHEDULER_USER)
   #define CONFIGURE_SCHEDULER_ENTRY_POINTS \
           CONFIGURE_SCHEDULER_USER_ENTRY_POINTS

diff -u /dev/null rtems/cpukit/sapi/include/rtems/cbs.h:1.1
--- /dev/null	Thu Sep 15 11:10:20 2011
+++ rtems/cpukit/sapi/include/rtems/cbs.h	Thu Sep 15 10:49:31 2011
@@ -0,0 +1,65 @@
+/**
+ * @file rtems/cbs.h
+ *
+ *  This include file contains all the constants and structures associated
+ *  with the CBS library in RTEMS.
+ */
+
+/*
+ *  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$
+ */
+
+#ifndef CONFIGURE_SCHEDULER_CBS
+  #error "cbs.h available only with CONFIGURE_SCHEDULER_CBS"
+#endif
+
+#ifndef _RTEMS_CBS_H
+#define _RTEMS_CBS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <rtems/score/schedulercbs.h>
+
+/* Return codes. */
+#define RTEMS_CBS_OK                       SCHEDULER_CBS_OK
+#define RTEMS_CBS_ERROR_GENERIC            SCHEDULER_CBS_ERROR_GENERIC
+#define RTEMS_CBS_ERROR_NO_MEMORY          SCHEDULER_CBS_ERROR_NO_MEMORY
+#define RTEMS_CBS_ERROR_INVALID_PARAMETER  SCHEDULER_CBS_ERROR_INVALID_PARAM
+#define RTEMS_CBS_ERROR_UNAUTHORIZED       SCHEDULER_CBS_ERROR_UNAUTHORIZED
+#define RTEMS_CBS_ERROR_UNIMPLEMENTED      SCHEDULER_CBS_ERROR_UNIMPLEMENTED
+#define RTEMS_CBS_ERROR_MISSING_COMPONENT  SCHEDULER_CBS_ERROR_MISSING_COMPONENT
+#define RTEMS_CBS_ERROR_INCONSISTENT_STATE SCHEDULER_CBS_ERROR_INCONSISTENT_STATE
+#define RTEMS_CBS_ERROR_SYSTEM_OVERLOAD    SCHEDULER_CBS_ERROR_SYSTEM_OVERLOAD
+#define RTEMS_CBS_ERROR_INTERNAL_ERROR     SCHEDULER_CBS_ERROR_INTERNAL_ERROR
+#define RTEMS_CBS_ERROR_NOT_FOUND          SCHEDULER_CBS_ERROR_NOT_FOUND
+#define RTEMS_CBS_ERROR_FULL               SCHEDULER_CBS_ERROR_FULL
+#define RTEMS_CBS_ERROR_EMPTY              SCHEDULER_CBS_ERROR_EMPTY
+#define RTEMS_CBS_ERROR_NOSERVER           SCHEDULER_CBS_ERROR_NOSERVER
+
+/** Callback function invoked when a budget overrun of a task occurs. */
+typedef Scheduler_CBS_Budget_overrun rtems_cbs_budget_overrun;
+
+/** Server id. */
+typedef Scheduler_CBS_Server_id rtems_cbs_server_id;
+
+/** Server parameters. */
+typedef Scheduler_CBS_Parameters rtems_cbs_parameters;
+
+#include <rtems/cbs.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */

diff -u /dev/null rtems/cpukit/sapi/inline/rtems/cbs.inl:1.1
--- /dev/null	Thu Sep 15 11:10:20 2011
+++ rtems/cpukit/sapi/inline/rtems/cbs.inl	Thu Sep 15 10:49:31 2011
@@ -0,0 +1,205 @@
+/**
+ * @file cbs.inl
+ *
+ *  This include file contains all the constants and structures associated
+ *  with the CBS library.
+ *
+ */
+
+/*
+ *  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$
+ */
+
+#ifndef _RTEMS_CBS_H
+# error "Never use <rtems/cbs.inl> directly; include <rtems/cbs.h> instead."
+#endif
+
+#include <rtems/score/schedulercbs.h>
+
+/**
+ *  @brief rtems cbs init
+ *
+ *  Initializes the CBS library.
+ *
+ *  @return status code.
+ */
+RTEMS_INLINE_ROUTINE int rtems_cbs_initialize ( void )
+{
+  return _Scheduler_CBS_Initialize();
+}
+
+/**
+ *  @brief rtems cbs cleanup
+ *
+ *  Cleanup resources associated to the CBS Library.
+ *
+ *  @return status code.
+ */
+RTEMS_INLINE_ROUTINE int rtems_cbs_cleanup ( void )
+{
+  return _Scheduler_CBS_Cleanup();
+}
+
+/**
+ *  @brief rtems cbs create server
+ *
+ *  Create a new server with specified parameters.
+ *
+ *  @return status code.
+ */
+RTEMS_INLINE_ROUTINE int rtems_cbs_create_server (
+  rtems_cbs_parameters     *params,
+  rtems_cbs_budget_overrun  budget_overrun_callback,
+  rtems_cbs_server_id      *server_id
+)
+{
+  return _Scheduler_CBS_Create_server(
+             params,
+             budget_overrun_callback,
+             server_id
+         );
+}
+
+/**
+ *  @brief rtems cbs attach thread
+ *
+ *  Attach a task to an already existing server.
+ *
+ *  @return status code.
+ */
+RTEMS_INLINE_ROUTINE int rtems_cbs_attach_thread (
+  rtems_cbs_server_id server_id,
+  rtems_id            task_id
+)
+{
+  return _Scheduler_CBS_Attach_thread( server_id, task_id );
+}
+
+/**
+ *  @brief rtems cbs detach thread
+ *
+ *  Detach from the CBS Server.
+ *
+ *  @return status code.
+ */
+RTEMS_INLINE_ROUTINE int rtems_cbs_detach_thread (
+  rtems_cbs_server_id server_id,
+  rtems_id            task_id
+)
+{
+  return _Scheduler_CBS_Detach_thread( server_id, task_id );
+}
+
+/**
+ *  @brief rtems cbs destroy server
+ *
+ *  Detach all tasks from a server and destroy it.
+ *
+ *  @return status code.
+ */
+RTEMS_INLINE_ROUTINE int rtems_cbs_destroy_server (
+  rtems_cbs_server_id server_id
+)
+{
+  return _Scheduler_CBS_Destroy_server( server_id );
+}
+
+/**
+ *  @brief rtems cbs get server id
+ *
+ *  Get a thread server id, or RTEMS_CBS_E_NOT_FOUND if it is not
+ *  attached to any server.
+ *
+ *  @return status code.
+ */
+RTEMS_INLINE_ROUTINE int rtems_cbs_get_server_id (
+  rtems_id             task_id,
+  rtems_cbs_server_id *server_id
+)
+{
+  return _Scheduler_CBS_Get_server_id( task_id, server_id );
+}
+
+/**
+ *  @brief rtems cbs get parameters
+ *
+ *  Retrieve CBS scheduling parameters.
+ *
+ *  @return status code.
+ */
+RTEMS_INLINE_ROUTINE int rtems_cbs_get_parameters (
+  rtems_cbs_server_id   server_id,
+  rtems_cbs_parameters *params
+)
+{
+  return _Scheduler_CBS_Get_parameters( server_id, params );
+}
+
+/**
+ *  @brief rtems cbs set parameters
+ *
+ *  Change CBS scheduling parameters.
+ *
+ *  @return status code.
+ */
+RTEMS_INLINE_ROUTINE int rtems_cbs_set_parameters (
+  rtems_cbs_server_id   server_id,
+  rtems_cbs_parameters *params
+)
+{
+  return _Scheduler_CBS_Set_parameters( server_id, params );
+}
+
+/**
+ *  @brief rtems cbs get execution time
+ *
+ *  Retrieve time info relative to the current server.
+ *
+ *  @return status code.
+ */
+RTEMS_INLINE_ROUTINE int rtems_cbs_get_execution_time (
+  rtems_cbs_server_id    server_id,
+  time_t                *exec_time,
+  time_t                *abs_time
+)
+{
+  return _Scheduler_CBS_Get_execution_time( server_id, exec_time, abs_time );
+}
+
+/**
+ *  @brief rtems cbs get remaining budget
+ *
+ *  Retrieve remaining budget for the current server instance.
+ *
+ *  @return status code.
+ */
+RTEMS_INLINE_ROUTINE int rtems_cbs_get_remaining_budget (
+  rtems_cbs_server_id  server_id,
+  time_t              *remaining_budget
+)
+{
+  return _Scheduler_CBS_Get_remaining_budget( server_id, remaining_budget );
+}
+
+/**
+ *  @brief rtems cbs get approved budget
+ *
+ *  Retrieve the budget that has been approved for the subsequent
+ *  server instances.
+ *
+ *  @return status code.
+ */
+RTEMS_INLINE_ROUTINE int rtems_cbs_get_approved_budget (
+  rtems_cbs_server_id  server_id,
+  time_t              *appr_budget
+)
+{
+  return _Scheduler_CBS_Get_approved_budget( server_id, appr_budget );
+}

diff -u rtems/cpukit/sapi/preinstall.am:1.12 rtems/cpukit/sapi/preinstall.am:1.13
--- rtems/cpukit/sapi/preinstall.am:1.12	Mon Apr  4 13:44:16 2011
+++ rtems/cpukit/sapi/preinstall.am	Thu Sep 15 10:49:31 2011
@@ -60,6 +60,10 @@
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/mptables.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/mptables.h
 
+$(PROJECT_INCLUDE)/rtems/cbs.h: include/rtems/cbs.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/cbs.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/cbs.h
+
 $(PROJECT_INCLUDE)/rtems/rbtree.h: include/rtems/rbtree.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rbtree.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rbtree.h
@@ -76,6 +80,10 @@
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/extension.inl
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/extension.inl
 
+$(PROJECT_INCLUDE)/rtems/cbs.inl: inline/rtems/cbs.inl $(PROJECT_INCLUDE)/rtems/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/cbs.inl
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/cbs.inl
+
 $(PROJECT_INCLUDE)/rtems/rbtree.inl: inline/rtems/rbtree.inl $(PROJECT_INCLUDE)/rtems/$(dirstamp)
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rbtree.inl
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rbtree.inl

diff -u rtems/cpukit/score/Makefile.am:1.109 rtems/cpukit/score/Makefile.am:1.110
--- rtems/cpukit/score/Makefile.am:1.109	Sun Sep 11 15:52:36 2011
+++ rtems/cpukit/score/Makefile.am	Thu Sep 15 10:49:31 2011
@@ -40,6 +40,7 @@
 include_rtems_score_HEADERS += include/rtems/score/prioritybitmap.h
 include_rtems_score_HEADERS += include/rtems/score/rbtree.h
 include_rtems_score_HEADERS += include/rtems/score/scheduler.h
+include_rtems_score_HEADERS += include/rtems/score/schedulercbs.h
 include_rtems_score_HEADERS += include/rtems/score/scheduleredf.h
 include_rtems_score_HEADERS += include/rtems/score/schedulerpriority.h
 include_rtems_score_HEADERS += include/rtems/score/schedulersimple.h
@@ -238,6 +239,22 @@
     src/scheduleredfupdate.c \
     src/scheduleredfyield.c
 
+## SCHEDULERCBS_C_FILES
+libscore_a_SOURCES += src/schedulercbs.c \
+    src/schedulercbsattachthread.c \
+    src/schedulercbscleanup.c \
+    src/schedulercbscreateserver.c \
+    src/schedulercbsdestroyserver.c \
+    src/schedulercbsdetachthread.c \
+    src/schedulercbsgetapprovedbudget.c \
+    src/schedulercbsgetexecutiontime.c \
+    src/schedulercbsgetparameters.c \
+    src/schedulercbsgetremainingbudget.c \
+    src/schedulercbsgetserverid.c \
+    src/schedulercbssetparameters.c \
+    src/schedulercbsreleasejob.c \
+    src/schedulercbsunblock.c
+
 ## PROTECTED_HEAP_C_FILES
 libscore_a_SOURCES += src/pheapallocate.c \
     src/pheapextend.c src/pheapfree.c src/pheapgetsize.c \

diff -u /dev/null rtems/cpukit/score/include/rtems/score/schedulercbs.h:1.1
--- /dev/null	Thu Sep 15 11:10:20 2011
+++ rtems/cpukit/score/include/rtems/score/schedulercbs.h	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,327 @@
+/**
+ *  @file  rtems/score/schedulercbs.h
+ *
+ *  This include file contains all the constants and structures associated
+ *  with the manipulation of threads for the CBS scheduler.
+ */
+
+/*
+ *  Copryight (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$
+ */
+
+#ifndef _RTEMS_SCORE_SCHEDULERCBS_H
+#define _RTEMS_SCORE_SCHEDULERCBS_H
+
+#include <rtems/score/chain.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/scheduler.h>
+#include <rtems/score/rbtree.h>
+#include <rtems/score/scheduleredf.h>
+#include <rtems/rtems/signal.h>
+#include <rtems/rtems/timer.h>
+#include <rtems/score/thread.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ *  @addtogroup ScoreScheduler
+ *
+ */
+/**@{*/
+
+/**
+ *  Entry points for the Constant Bandwidth Server Scheduler.
+ *
+ *  @note: The CBS scheduler is an enhancement of EDF scheduler,
+ *         therefor some routines are similar.
+ */
+#define SCHEDULER_CBS_ENTRY_POINTS \
+  { \
+    _Scheduler_EDF_Initialize,       /* initialize entry point */ \
+    _Scheduler_EDF_Schedule,         /* schedule entry point */ \
+    _Scheduler_EDF_Yield,            /* yield entry point */ \
+    _Scheduler_EDF_Block,            /* block entry point */ \
+    _Scheduler_CBS_Unblock,          /* unblock entry point */ \
+    _Scheduler_EDF_Allocate,         /* allocate entry point */ \
+    _Scheduler_EDF_Free,             /* free entry point */ \
+    _Scheduler_EDF_Update,           /* update entry point */ \
+    _Scheduler_EDF_Enqueue,          /* enqueue entry point */ \
+    _Scheduler_EDF_Enqueue_first,    /* enqueue_first entry point */ \
+    _Scheduler_EDF_Extract,          /* extract entry point */ \
+    _Scheduler_EDF_Priority_compare, /* compares two priorities */ \
+    _Scheduler_CBS_Release_job,      /* new period of task */ \
+    _Scheduler_priority_Tick         /* tick entry point */ \
+  }
+
+/* Return values for CBS server. */
+#define SCHEDULER_CBS_OK                        0
+#define SCHEDULER_CBS_ERROR_GENERIC            -16
+#define SCHEDULER_CBS_ERROR_NO_MEMORY          -17
+#define SCHEDULER_CBS_ERROR_INVALID_PARAMETER  -18
+#define SCHEDULER_CBS_ERROR_UNAUTHORIZED       -19
+#define SCHEDULER_CBS_ERROR_UNIMPLEMENTED      -20
+#define SCHEDULER_CBS_ERROR_MISSING_COMPONENT  -21
+#define SCHEDULER_CBS_ERROR_INCONSISTENT_STATE -22
+#define SCHEDULER_CBS_ERROR_SYSTEM_OVERLOAD    -23
+#define SCHEDULER_CBS_ERROR_INTERNAL_ERROR     -24
+#define SCHEDULER_CBS_ERROR_NOT_FOUND          -25
+#define SCHEDULER_CBS_ERROR_FULL               -26
+#define SCHEDULER_CBS_ERROR_EMPTY              -27
+#define SCHEDULER_CBS_ERROR_NOSERVER           SCHEDULER_CBS_ERROR_NOT_FOUND
+
+/** Maximum number of simultaneous servers. */
+extern uint32_t _Scheduler_CBS_Maximum_servers;
+
+/** Server id. */
+typedef uint32_t Scheduler_CBS_Server_id;
+
+/** Callback function invoked when a budget overrun of a task occurs. */
+typedef void (*Scheduler_CBS_Budget_overrun)(
+    Scheduler_CBS_Server_id server_id
+);
+
+/**
+ * This structure handles server parameters.
+ */
+typedef struct {
+  /** Relative deadline of the server. */
+  time_t deadline;
+  /** Budget (computation time) of the server. */
+  time_t budget;
+} Scheduler_CBS_Parameters;
+
+/**
+ * This structure represents a time server.
+ */
+typedef struct {
+  /**
+   * Task id.
+   *
+   * @note: The current implementation of CBS handles only one task per server.
+   */
+  rtems_id                 task_id;
+  /** Server paramenters. */
+  Scheduler_CBS_Parameters parameters;
+  /** Callback function invoked when a budget overrun occurs. */
+  Scheduler_CBS_Budget_overrun  cbs_budget_overrun;
+} Scheduler_CBS_Server;
+
+/**
+ * This structure handles CBS specific data of a thread.
+ */
+typedef struct {
+  /** EDF scheduler specific data of a task. */
+  Scheduler_EDF_Per_thread      edf_per_thread;
+  /** CBS server specific data of a task. */
+  Scheduler_CBS_Server         *cbs_server;
+} Scheduler_CBS_Per_thread;
+
+
+/**
+ * List of servers. The @a Scheduler_CBS_Server is the index to the array
+ * of pointers to @a _Scheduler_CBS_Server_list.
+ */
+Scheduler_CBS_Server **_Scheduler_CBS_Server_list;
+
+/**
+ *  @brief Scheduler CBS Unblock
+ *
+ *  This routine adds @a the_thread to the scheduling decision, that is,
+ *  adds it to the ready queue and updates any appropriate scheduling
+ *  variables, for example the heir thread.
+ *
+ *  It is checked whether the remaining budget is sufficient. If not, the
+ *  thread continues as a new job in order to protect concurrent threads.
+ *
+ *  @note This has to be asessed as missed deadline of the current job.
+ *
+ *  @param[in] the_thread will be unblocked.
+ */
+void _Scheduler_CBS_Unblock(
+  Thread_Control    *the_thread
+);
+
+/**
+ *  @brief Scheduler CBS Release job
+ *
+ *  This routine is called when a new job of task is released.
+ *  It is called only from Rate Monotonic manager in the beginning
+ *  of new period. Deadline has to be shifted and budget replenished.
+ *
+ *  @param[in] the_thread is the owner of the job.
+ *  @param[in] length of the new job from now. If equal to 0,
+ *             the job was cancelled or deleted.
+ */
+
+void _Scheduler_CBS_Release_job (
+  Thread_Control  *the_thread,
+  uint32_t         length
+);
+
+/**
+ *  @brief _Scheduler_CBS_Initialize
+ *
+ *  Initializes the CBS library.
+ *
+ *  @return status code.
+ */
+int _Scheduler_CBS_Initialize(void);
+
+/**
+ *  @brief _Scheduler_CBS_Attach_thread
+ *
+ *  Attach a task to an already existing server.
+ *
+ *  @return status code.
+ */
+int _Scheduler_CBS_Attach_thread (
+  Scheduler_CBS_Server_id server_id,
+  rtems_id                task_id
+);
+
+/**
+ *  @brief _Scheduler_CBS_Detach_thread
+ *
+ *  Detach from the CBS Server.
+ *
+ *  @return status code.
+ */
+int _Scheduler_CBS_Detach_thread (
+  Scheduler_CBS_Server_id server_id,
+  rtems_id                task_id
+);
+
+/**
+ *  @brief _Scheduler_CBS_Cleanup
+ *
+ *  Cleanup resources associated to the CBS Library.
+ *
+ *  @return status code.
+ */
+int _Scheduler_CBS_Cleanup (void);
+
+/**
+ *  @brief _Scheduler_CBS_Create_server
+ *
+ *  Create a new server with specified parameters.
+ *
+ *  @return status code.
+ */
+int _Scheduler_CBS_Create_server (
+  Scheduler_CBS_Parameters     *params,
+  Scheduler_CBS_Budget_overrun  budget_overrun_callback,
+  rtems_id                     *server_id
+);
+
+/**
+ *  @brief _Scheduler_CBS_Destroy_server
+ *
+ *  Detach all tasks from a server and destroy it.
+ *
+ *  @return status code.
+ */
+int _Scheduler_CBS_Destroy_server (
+  Scheduler_CBS_Server_id server_id
+);
+
+/**
+ *  @brief _Scheduler_CBS_Get_approved_budget
+ *
+ *  Retrieve the budget that has been approved for the subsequent
+ *  server instances.
+ *
+ *  @return status code.
+ */
+int _Scheduler_CBS_Get_approved_budget (
+  Scheduler_CBS_Server_id  server_id,
+  time_t                  *approved_budget
+);
+
+/**
+ *  @brief _Scheduler_CBS_Get_remaining_budget
+ *
+ *  Retrieve remaining budget for the current server instance.
+ *
+ *  @return status code.
+ */
+int _Scheduler_CBS_Get_remaining_budget (
+  Scheduler_CBS_Server_id  server_id,
+  time_t                  *remaining_budget
+);
+
+/**
+ *  @brief _Scheduler_CBS_Get_execution_time
+ *
+ *  Retrieve time info relative to the current server.
+ *
+ *  @return status code.
+ */
+int _Scheduler_CBS_Get_execution_time (
+  Scheduler_CBS_Server_id   server_id,
+  time_t                   *exec_time,
+  time_t                   *abs_time
+);
+
+/**
+ *  @brief _Scheduler_CBS_Get_parameters
+ *
+ *  Retrieve CBS scheduling parameters.
+ *
+ *  @return status code.
+ */
+int _Scheduler_CBS_Get_parameters (
+  Scheduler_CBS_Server_id   server_id,
+  Scheduler_CBS_Parameters *params
+);
+
+/**
+ *  @brief _Scheduler_CBS_Get_server_id
+ *
+ *  Get a thread server id, or SCHEDULER_CBS_ERROR_NOT_FOUND if it is not
+ *  attached to any server.
+ *
+ *  @return status code.
+ */
+int _Scheduler_CBS_Get_server_id (
+  rtems_id                 task_id,
+  Scheduler_CBS_Server_id *server_id
+);
+
+/**
+ *  @brief _Scheduler_CBS_Set_parameters
+ *
+ *  Change CBS scheduling parameters.
+ *
+ *  @return status code.
+ */
+int _Scheduler_CBS_Set_parameters (
+  Scheduler_CBS_Server_id   server_id,
+  Scheduler_CBS_Parameters *parameters
+);
+
+/**
+ *  @brief Scheduler CBS Budget overrun
+ *
+ *  This routine is invoked when a limited time quantum is exceeded.
+ */
+void _Scheduler_CBS_Budget_callout(
+  Thread_Control *the_thread
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif
+/* end of include file */

diff -u rtems/cpukit/score/preinstall.am:1.34 rtems/cpukit/score/preinstall.am:1.35
--- rtems/cpukit/score/preinstall.am:1.34	Sun Sep 11 15:52:36 2011
+++ rtems/cpukit/score/preinstall.am	Thu Sep 15 10:49:32 2011
@@ -127,6 +127,10 @@
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/scheduler.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/scheduler.h
 
+$(PROJECT_INCLUDE)/rtems/score/schedulercbs.h: include/rtems/score/schedulercbs.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/schedulercbs.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/schedulercbs.h
+
 $(PROJECT_INCLUDE)/rtems/score/scheduleredf.h: include/rtems/score/scheduleredf.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/scheduleredf.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/scheduleredf.h

diff -u /dev/null rtems/cpukit/score/src/schedulercbs.c:1.1
--- /dev/null	Thu Sep 15 11:10:20 2011
+++ rtems/cpukit/score/src/schedulercbs.c	Thu Sep 15 10:49:32 2011
@@ -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;
+}

diff -u /dev/null rtems/cpukit/score/src/schedulercbsattachthread.c:1.1
--- /dev/null	Thu Sep 15 11:10:20 2011
+++ rtems/cpukit/score/src/schedulercbsattachthread.c	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,63 @@
+/*
+ *  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/object.h>
+
+int _Scheduler_CBS_Attach_thread (
+  Scheduler_CBS_Server_id server_id,
+  rtems_id                task_id
+)
+{
+  Objects_Locations location;
+  Thread_Control *the_thread;
+  Scheduler_CBS_Per_thread *sched_info;
+
+  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+  the_thread = _Thread_Get(task_id, &location);
+  /* The routine _Thread_Get may disable dispatch and not enable again. */
+  if ( the_thread )
+    _Thread_Enable_dispatch();
+  if ( !the_thread )
+    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+  sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
+
+  /* Thread is already attached to a server. */
+  if ( sched_info->cbs_server )
+    return SCHEDULER_CBS_ERROR_FULL;
+
+  /* Server is not valid. */
+  if ( !_Scheduler_CBS_Server_list[server_id] )
+    return SCHEDULER_CBS_ERROR_NOSERVER;
+
+  /* Server is already attached to a thread. */
+  if ( _Scheduler_CBS_Server_list[server_id]->task_id != -1 )
+    return SCHEDULER_CBS_ERROR_FULL;
+
+  _Scheduler_CBS_Server_list[server_id]->task_id = task_id;
+  sched_info->cbs_server = (void *) _Scheduler_CBS_Server_list[server_id];
+
+  the_thread->budget_callout   = _Scheduler_CBS_Budget_callout;
+  the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
+  the_thread->is_preemptible   = true;
+
+  return SCHEDULER_CBS_OK;
+}

diff -u /dev/null rtems/cpukit/score/src/schedulercbscleanup.c:1.1
--- /dev/null	Thu Sep 15 11:10:20 2011
+++ rtems/cpukit/score/src/schedulercbscleanup.c	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,31 @@
+/*
+ *  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>
+
+int _Scheduler_CBS_Cleanup (void)
+{
+  unsigned int i;
+
+  for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
+    if ( _Scheduler_CBS_Server_list[ i ] )
+      _Scheduler_CBS_Destroy_server( i );
+  }
+  _Workspace_Free( _Scheduler_CBS_Server_list );
+  return SCHEDULER_CBS_OK;
+}

diff -u /dev/null rtems/cpukit/score/src/schedulercbscreateserver.c:1.1
--- /dev/null	Thu Sep 15 11:10:20 2011
+++ rtems/cpukit/score/src/schedulercbscreateserver.c	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,55 @@
+/*
+ *  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>
+
+int _Scheduler_CBS_Create_server (
+  Scheduler_CBS_Parameters     *params,
+  Scheduler_CBS_Budget_overrun  budget_overrun_callback,
+  rtems_id                     *server_id
+)
+{
+  unsigned int i;
+  Scheduler_CBS_Server *the_server;
+
+  if ( params->budget <= 0 ||
+       params->deadline <= 0 ||
+       params->budget >= SCHEDULER_EDF_PRIO_MSB ||
+       params->deadline >= SCHEDULER_EDF_PRIO_MSB )
+    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+  for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
+    if ( !_Scheduler_CBS_Server_list[i] )
+      break;
+  }
+
+  if ( i == _Scheduler_CBS_Maximum_servers )
+    return SCHEDULER_CBS_ERROR_FULL;
+
+  *server_id = i;
+  _Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
+    _Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
+  the_server = _Scheduler_CBS_Server_list[*server_id];
+  if ( !the_server )
+    return SCHEDULER_CBS_ERROR_NO_MEMORY;
+
+  the_server->parameters = *params;
+  the_server->task_id = -1;
+  the_server->cbs_budget_overrun = budget_overrun_callback;
+  return SCHEDULER_CBS_OK;
+}

diff -u /dev/null rtems/cpukit/score/src/schedulercbsdestroyserver.c:1.1
--- /dev/null	Thu Sep 15 11:10:20 2011
+++ rtems/cpukit/score/src/schedulercbsdestroyserver.c	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,40 @@
+/*
+ *  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>
+
+int _Scheduler_CBS_Destroy_server (
+  Scheduler_CBS_Server_id server_id
+)
+{
+  int ret = SCHEDULER_CBS_OK;
+  rtems_id tid;
+
+  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+  if ( !_Scheduler_CBS_Server_list[server_id] )
+    return SCHEDULER_CBS_ERROR_NOSERVER;
+
+  if ( (tid = _Scheduler_CBS_Server_list[server_id]->task_id) != -1 )
+    ret = _Scheduler_CBS_Detach_thread ( server_id, tid );
+
+  _Workspace_Free( _Scheduler_CBS_Server_list[server_id] );
+  _Scheduler_CBS_Server_list[server_id] = NULL;
+  return ret;
+}

diff -u /dev/null rtems/cpukit/score/src/schedulercbsdetachthread.c:1.1
--- /dev/null	Thu Sep 15 11:10:20 2011
+++ rtems/cpukit/score/src/schedulercbsdetachthread.c	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,56 @@
+/*
+ *  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>
+
+int _Scheduler_CBS_Detach_thread (
+  Scheduler_CBS_Server_id server_id,
+  rtems_id                task_id
+)
+{
+  Objects_Locations location;
+  Thread_Control *the_thread;
+  Scheduler_CBS_Per_thread *sched_info;
+
+  the_thread = _Thread_Get(task_id, &location);
+  /* The routine _Thread_Get may disable dispatch and not enable again. */
+  if ( the_thread ) {
+    _Thread_Enable_dispatch();
+    sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
+  }
+
+  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+  if ( !the_thread )
+    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+  /* Server is not valid. */
+  if ( !_Scheduler_CBS_Server_list[server_id] )
+    return SCHEDULER_CBS_ERROR_NOSERVER;
+  /* Thread and server are not attached. */
+  if ( _Scheduler_CBS_Server_list[server_id]->task_id != task_id )
+    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+  _Scheduler_CBS_Server_list[server_id]->task_id = -1;
+  sched_info->cbs_server = NULL;
+
+  the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
+  the_thread->budget_callout   = the_thread->Start.budget_callout;
+  the_thread->is_preemptible   = the_thread->Start.is_preemptible;
+
+  return SCHEDULER_CBS_OK;
+}

diff -u /dev/null rtems/cpukit/score/src/schedulercbsgetapprovedbudget.c:1.1
--- /dev/null	Thu Sep 15 11:10:21 2011
+++ rtems/cpukit/score/src/schedulercbsgetapprovedbudget.c	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,33 @@
+/*
+ *  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>
+
+int _Scheduler_CBS_Get_approved_budget (
+  Scheduler_CBS_Server_id  server_id,
+  time_t                  *approved_budget
+)
+{
+  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+  if ( !_Scheduler_CBS_Server_list[server_id] )
+    return SCHEDULER_CBS_ERROR_NOSERVER;
+
+  *approved_budget = _Scheduler_CBS_Server_list[server_id]->parameters.budget;
+  return SCHEDULER_CBS_OK;
+}

diff -u /dev/null rtems/cpukit/score/src/schedulercbsgetexecutiontime.c:1.1
--- /dev/null	Thu Sep 15 11:10:21 2011
+++ rtems/cpukit/score/src/schedulercbsgetexecutiontime.c	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,53 @@
+/*
+ *  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>
+
+int _Scheduler_CBS_Get_execution_time (
+  Scheduler_CBS_Server_id   server_id,
+  time_t                   *exec_time,
+  time_t                   *abs_time
+)
+{
+  Objects_Locations location;
+  Thread_Control *the_thread;
+
+  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+  if ( !_Scheduler_CBS_Server_list[server_id] )
+    return SCHEDULER_CBS_ERROR_NOSERVER;
+  if ( !_Scheduler_CBS_Server_list[server_id]->task_id ) {
+    *exec_time = 0;
+    return SCHEDULER_CBS_OK;
+  }
+
+  the_thread = _Thread_Get(
+                 _Scheduler_CBS_Server_list[server_id]->task_id,
+                 &location
+               );
+  /* The routine _Thread_Get may disable dispatch and not enable again. */
+  if ( the_thread ) {
+    _Thread_Enable_dispatch();
+    *exec_time = _Scheduler_CBS_Server_list[server_id]->parameters.budget -
+      the_thread->cpu_time_budget;
+  }
+  else {
+    *exec_time = _Scheduler_CBS_Server_list[server_id]->parameters.budget;
+  }
+  return SCHEDULER_CBS_OK;
+}

diff -u /dev/null rtems/cpukit/score/src/schedulercbsgetparameters.c:1.1
--- /dev/null	Thu Sep 15 11:10:21 2011
+++ rtems/cpukit/score/src/schedulercbsgetparameters.c	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,33 @@
+/*
+ *  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>
+
+int _Scheduler_CBS_Get_parameters (
+  Scheduler_CBS_Server_id   server_id,
+  Scheduler_CBS_Parameters *params
+)
+{
+  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+  if ( !_Scheduler_CBS_Server_list[server_id] )
+    return SCHEDULER_CBS_ERROR_NOSERVER;
+
+  *params = _Scheduler_CBS_Server_list[server_id]->parameters;
+  return SCHEDULER_CBS_OK;
+}

diff -u /dev/null rtems/cpukit/score/src/schedulercbsgetremainingbudget.c:1.1
--- /dev/null	Thu Sep 15 11:10:21 2011
+++ rtems/cpukit/score/src/schedulercbsgetremainingbudget.c	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,52 @@
+/*
+ *  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>
+
+int _Scheduler_CBS_Get_remaining_budget (
+  Scheduler_CBS_Server_id  server_id,
+  time_t                  *remaining_budget
+)
+{
+  Objects_Locations location;
+  Thread_Control *the_thread;
+
+  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+  if ( !_Scheduler_CBS_Server_list[server_id] )
+    return SCHEDULER_CBS_ERROR_NOSERVER;
+  if ( _Scheduler_CBS_Server_list[server_id]->task_id == -1 ) {
+    *remaining_budget = _Scheduler_CBS_Server_list[server_id]->parameters.budget;
+    return SCHEDULER_CBS_OK;
+  }
+
+  the_thread = _Thread_Get(
+                 _Scheduler_CBS_Server_list[server_id]->task_id,
+                 &location
+               );
+  /* The routine _Thread_Get may disable dispatch and not enable again. */
+  if ( the_thread ) {
+    _Thread_Enable_dispatch();
+    *remaining_budget = the_thread->cpu_time_budget;
+  }
+  else {
+    *remaining_budget = 0;
+  }
+
+  return SCHEDULER_CBS_OK;
+}

diff -u /dev/null rtems/cpukit/score/src/schedulercbsgetserverid.c:1.1
--- /dev/null	Thu Sep 15 11:10:21 2011
+++ rtems/cpukit/score/src/schedulercbsgetserverid.c	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,35 @@
+/*
+ *  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>
+
+int _Scheduler_CBS_Get_server_id (
+  rtems_id                 task_id,
+  Scheduler_CBS_Server_id *server_id
+)
+{
+  unsigned int i;
+  for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
+    if ( _Scheduler_CBS_Server_list[i] &&
+         _Scheduler_CBS_Server_list[i]->task_id == task_id ) {
+      *server_id = i;
+      return SCHEDULER_CBS_OK;
+    }
+  }
+  return SCHEDULER_CBS_ERROR_NOSERVER;
+}

diff -u /dev/null rtems/cpukit/score/src/schedulercbsreleasejob.c:1.1
--- /dev/null	Thu Sep 15 11:10:21 2011
+++ rtems/cpukit/score/src/schedulercbsreleasejob.c	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,52 @@
+/*
+ *  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>
+
+void _Scheduler_CBS_Release_job(
+  Thread_Control    *the_thread,
+  uint32_t           deadline
+)
+{
+  Priority_Control new_priority;
+  Scheduler_CBS_Per_thread *sched_info =
+    (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
+  Scheduler_CBS_Server *serv_info =
+    (Scheduler_CBS_Server *) sched_info->cbs_server;
+
+  if (deadline) {
+    /* Initializing or shifting deadline. */
+    if (serv_info && serv_info->parameters.budget)
+      new_priority = (_Watchdog_Ticks_since_boot + serv_info->parameters.deadline)
+        & ~SCHEDULER_EDF_PRIO_MSB;
+    else
+      new_priority = (_Watchdog_Ticks_since_boot + deadline)
+        & ~SCHEDULER_EDF_PRIO_MSB;
+  }
+  else {
+    /* Switch back to background priority. */
+    new_priority = the_thread->Start.initial_priority;
+  }
+
+  /* Budget replenishment for the next job. */
+  if (serv_info && serv_info->parameters.budget)
+    the_thread->cpu_time_budget = serv_info->parameters.budget;
+
+  the_thread->real_priority = new_priority;
+  _Thread_Change_priority(the_thread, new_priority, true);
+}

diff -u /dev/null rtems/cpukit/score/src/schedulercbssetparameters.c:1.1
--- /dev/null	Thu Sep 15 11:10:21 2011
+++ rtems/cpukit/score/src/schedulercbssetparameters.c	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,40 @@
+/*
+ *  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>
+
+int _Scheduler_CBS_Set_parameters (
+  Scheduler_CBS_Server_id   server_id,
+  Scheduler_CBS_Parameters *params
+)
+{
+  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+  if ( params->budget <= 0 ||
+       params->deadline <= 0 ||
+       params->budget >= SCHEDULER_EDF_PRIO_MSB ||
+       params->deadline >= SCHEDULER_EDF_PRIO_MSB )
+    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+  if ( !_Scheduler_CBS_Server_list[server_id] )
+    return SCHEDULER_CBS_ERROR_NOSERVER;
+
+  _Scheduler_CBS_Server_list[server_id]->parameters = *params;
+  return SCHEDULER_CBS_OK;
+}

diff -u /dev/null rtems/cpukit/score/src/schedulercbsunblock.c:1.1
--- /dev/null	Thu Sep 15 11:10:21 2011
+++ rtems/cpukit/score/src/schedulercbsunblock.c	Thu Sep 15 10:49:32 2011
@@ -0,0 +1,76 @@
+/*
+ *  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/score/scheduler.h>
+#include <rtems/score/schedulercbs.h>
+
+void _Scheduler_CBS_Unblock(
+  Thread_Control    *the_thread
+)
+{
+  Scheduler_CBS_Per_thread *sched_info;
+  Scheduler_CBS_Server *serv_info;
+  Priority_Control new_priority;
+
+  _Scheduler_EDF_Enqueue(the_thread);
+  /* TODO: flash critical section? */
+
+  sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
+  serv_info = (Scheduler_CBS_Server *) sched_info->cbs_server;
+
+  /*
+   * Late unblock rule for deadline-driven tasks. The remaining time to
+   * deadline must be sufficient to serve the remaining computation time
+   * without increased utilization of this task. It might cause a deadline
+   * miss of another task.
+   */
+  if (serv_info) {
+    time_t deadline = serv_info->parameters.deadline;
+    time_t budget = serv_info->parameters.budget;
+    time_t deadline_left = the_thread->cpu_time_budget;
+    time_t budget_left = the_thread->real_priority -
+                           _Watchdog_Ticks_since_boot;
+
+    if ( deadline*budget_left > budget*deadline_left ) {
+      /* Put late unblocked 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);
+    }
+  }
+
+  /*
+   *  If the thread that was unblocked is more important than the heir,
+   *  then we have a new heir.  This may or may not result in a
+   *  context switch.
+   *
+   *  Normal case:
+   *    If the current thread is preemptible, then we need to do
+   *    a context switch.
+   *  Pseudo-ISR case:
+   *    Even if the thread isn't preemptible, if the new heir is
+   *    a pseudo-ISR system task, we need to do a context switch.
+   */
+  if ( _Scheduler_Is_priority_higher_than( 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;
+  }
+}


 *joel*:
2011-09-15	Petr Benes <benesp16 at fel.cvut.cz>

	PR 1907/testing
	* Makefile.am, configure.ac: Add tests for the CBS (Constant Bandwidth
	Server) scheduler.
	* spcbssched01/.cvsignore, spcbssched01/Makefile.am,
	spcbssched01/init.c, spcbssched01/spcbssched01.doc,
	spcbssched01/spcbssched01.scn, spcbssched01/system.h,
	spcbssched01/task1.c, spcbssched02/.cvsignore,
	spcbssched02/Makefile.am, spcbssched02/init.c,
	spcbssched02/spcbssched02.doc, spcbssched02/spcbssched02.scn,
	spcbssched02/system.h, spcbssched02/task_periodic.c,
	spcbssched03/.cvsignore, spcbssched03/Makefile.am,
	spcbssched03/cbsparams.h, spcbssched03/init.c,
	spcbssched03/spcbssched03.doc, spcbssched03/spcbssched03.scn,
	spcbssched03/system.h, spcbssched03/tasks_aperiodic.c,
	spcbssched03/tasks_periodic.c: New files.

M  1.485  testsuites/sptests/ChangeLog
M  1.116  testsuites/sptests/Makefile.am
M  1.122  testsuites/sptests/configure.ac
A    1.1  testsuites/sptests/spcbssched01/.cvsignore
A    1.1  testsuites/sptests/spcbssched01/Makefile.am
A    1.1  testsuites/sptests/spcbssched01/init.c
A    1.1  testsuites/sptests/spcbssched01/spcbssched01.doc
A    1.1  testsuites/sptests/spcbssched01/spcbssched01.scn
A    1.1  testsuites/sptests/spcbssched01/system.h
A    1.1  testsuites/sptests/spcbssched01/task1.c
A    1.1  testsuites/sptests/spcbssched02/.cvsignore
A    1.1  testsuites/sptests/spcbssched02/Makefile.am
A    1.1  testsuites/sptests/spcbssched02/init.c
A    1.1  testsuites/sptests/spcbssched02/spcbssched02.doc
A    1.1  testsuites/sptests/spcbssched02/spcbssched02.scn
A    1.1  testsuites/sptests/spcbssched02/system.h
A    1.1  testsuites/sptests/spcbssched02/task_periodic.c
A    1.1  testsuites/sptests/spcbssched03/.cvsignore
A    1.1  testsuites/sptests/spcbssched03/Makefile.am
A    1.1  testsuites/sptests/spcbssched03/cbsparams.h
A    1.1  testsuites/sptests/spcbssched03/init.c
A    1.1  testsuites/sptests/spcbssched03/spcbssched03.doc
A    1.1  testsuites/sptests/spcbssched03/spcbssched03.scn
A    1.1  testsuites/sptests/spcbssched03/system.h
A    1.1  testsuites/sptests/spcbssched03/tasks_aperiodic.c
A    1.1  testsuites/sptests/spcbssched03/tasks_periodic.c

diff -u rtems/testsuites/sptests/ChangeLog:1.484 rtems/testsuites/sptests/ChangeLog:1.485
--- rtems/testsuites/sptests/ChangeLog:1.484	Wed Sep 14 08:02:33 2011
+++ rtems/testsuites/sptests/ChangeLog	Thu Sep 15 10:56:00 2011
@@ -1,3 +1,21 @@
+2011-09-15	Petr Benes <benesp16 at fel.cvut.cz>
+
+	PR 1907/testing
+	* Makefile.am, configure.ac: Add tests for the CBS (Constant Bandwidth
+	Server) scheduler.
+	* spcbssched01/.cvsignore, spcbssched01/Makefile.am,
+	spcbssched01/init.c, spcbssched01/spcbssched01.doc,
+	spcbssched01/spcbssched01.scn, spcbssched01/system.h,
+	spcbssched01/task1.c, spcbssched02/.cvsignore,
+	spcbssched02/Makefile.am, spcbssched02/init.c,
+	spcbssched02/spcbssched02.doc, spcbssched02/spcbssched02.scn,
+	spcbssched02/system.h, spcbssched02/task_periodic.c,
+	spcbssched03/.cvsignore, spcbssched03/Makefile.am,
+	spcbssched03/cbsparams.h, spcbssched03/init.c,
+	spcbssched03/spcbssched03.doc, spcbssched03/spcbssched03.scn,
+	spcbssched03/system.h, spcbssched03/tasks_aperiodic.c,
+	spcbssched03/tasks_periodic.c: New files.
+
 2011-09-14	Sebastian Huber <sebastian.huber at embedded-brains.de>
 
 	* spnsext01/init.c: Use correct API.

diff -u rtems/testsuites/sptests/Makefile.am:1.115 rtems/testsuites/sptests/Makefile.am:1.116
--- rtems/testsuites/sptests/Makefile.am:1.115	Sun Sep 11 15:56:44 2011
+++ rtems/testsuites/sptests/Makefile.am	Thu Sep 15 10:56:01 2011
@@ -30,7 +30,8 @@
     spintrcritical13 spintrcritical14 spintrcritical15 spintrcritical16 \
     spintrcritical17 spmkdir spmountmgr01 spheapprot \
     spsimplesched01 spsimplesched02 spsimplesched03 spnsext01 \
-    spedfsched01 spedfsched02 spedfsched03
+    spedfsched01 spedfsched02 spedfsched03 \
+    spcbssched01 spcbssched02 spcbssched03
 
 include $(top_srcdir)/../automake/subdirs.am
 include $(top_srcdir)/../automake/local.am

diff -u rtems/testsuites/sptests/configure.ac:1.121 rtems/testsuites/sptests/configure.ac:1.122
--- rtems/testsuites/sptests/configure.ac:1.121	Sun Sep 11 15:56:44 2011
+++ rtems/testsuites/sptests/configure.ac	Thu Sep 15 10:56:01 2011
@@ -103,6 +103,9 @@
 sp75/Makefile
 sp76/Makefile
 spassoc01/Makefile
+spcbssched01/Makefile
+spcbssched02/Makefile
+spcbssched03/Makefile
 spchain/Makefile
 spclockget/Makefile
 spcoverage/Makefile

diff -u /dev/null rtems/testsuites/sptests/spcbssched01/.cvsignore:1.1
--- /dev/null	Thu Sep 15 11:10:22 2011
+++ rtems/testsuites/sptests/spcbssched01/.cvsignore	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in

diff -u /dev/null rtems/testsuites/sptests/spcbssched01/Makefile.am:1.1
--- /dev/null	Thu Sep 15 11:10:22 2011
+++ rtems/testsuites/sptests/spcbssched01/Makefile.am	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,28 @@
+##
+## $Id$
+##
+
+MANAGERS = io semaphore clock
+
+rtems_tests_PROGRAMS = spcbssched01
+spcbssched01_SOURCES = init.c task1.c system.h
+
+dist_rtems_tests_DATA = spcbssched01.scn
+dist_rtems_tests_DATA += spcbssched01.doc
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
+include $(top_srcdir)/../automake/compile.am
+include $(top_srcdir)/../automake/leaf.am
+
+spcbssched01_LDADD = $(MANAGERS_NOT_WANTED:%=$(PROJECT_LIB)/no-%.rel)
+
+AM_CPPFLAGS += -I$(top_srcdir)/../support/include
+
+LINK_OBJS = $(spcbssched01_OBJECTS) $(spcbssched01_LDADD)
+LINK_LIBS = $(spcbssched01_LDLIBS)
+
+spcbssched01$(EXEEXT): $(spcbssched01_OBJECTS) $(spcbssched01_DEPENDENCIES)
+	@rm -f spcbssched01$(EXEEXT)
+	$(make-exe)
+
+include $(top_srcdir)/../automake/local.am

diff -u /dev/null rtems/testsuites/sptests/spcbssched01/init.c:1.1
--- /dev/null	Thu Sep 15 11:10:22 2011
+++ rtems/testsuites/sptests/spcbssched01/init.c	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,85 @@
+/*  Init
+ *
+ *  This routine is the initialization task for this test program.
+ *  It is a user initialization task and has the responsibility for creating
+ *  and starting the tasks that make up the test.  If the time of day
+ *  clock is required for the test, it should also be set to a known
+ *  value by this function.
+ *
+ *  Input parameters:
+ *    argument - task argument
+ *
+ *  Output parameters:  NONE
+ *
+ *  COPYRIGHT (c) 1989-1999.
+ *  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$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+
+rtems_task Init(
+  rtems_task_argument argument
+)
+{
+  rtems_time_of_day time;
+  rtems_status_code status;
+
+  puts( "\n\n*** CBS SCHEDULER TEST 1 ***" );
+
+  build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+  status = rtems_clock_set( &time );
+  directive_failed( status, "rtems_clock_set" );
+
+  Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+  Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+  Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+  status = rtems_task_create(
+     Task_name[ 1 ],
+     1,
+     RTEMS_MINIMUM_STACK_SIZE * 2,
+     RTEMS_INTERRUPT_LEVEL(31),
+     RTEMS_DEFAULT_ATTRIBUTES,
+     &Task_id[ 1 ]
+  );
+  directive_failed( status, "rtems_task_create of TA1" );
+
+  status = rtems_task_create(
+     Task_name[ 2 ],
+     1,
+     RTEMS_MINIMUM_STACK_SIZE * 2,
+     RTEMS_DEFAULT_MODES,
+     RTEMS_DEFAULT_ATTRIBUTES,
+     &Task_id[ 2 ]
+  );
+  directive_failed( status, "rtems_task_create of TA2" );
+
+  status = rtems_task_create(
+     Task_name[ 3 ],
+     1,
+     RTEMS_MINIMUM_STACK_SIZE * 3,
+     RTEMS_DEFAULT_MODES,
+     RTEMS_DEFAULT_ATTRIBUTES,
+     &Task_id[ 3 ]
+  );
+  directive_failed( status, "rtems_task_create of TA3" );
+
+  status = rtems_task_start( Task_id[ 1 ], Task_1_through_3, 0 );
+  directive_failed( status, "rtems_task_start of TA1" );
+
+  status = rtems_task_start( Task_id[ 2 ], Task_1_through_3, 0 );
+  directive_failed( status, "rtems_task_start of TA2" );
+
+  status = rtems_task_start( Task_id[ 3 ], Task_1_through_3, 0 );
+  directive_failed( status, "rtems_task_start of TA3" );
+
+  status = rtems_task_delete( RTEMS_SELF );
+  directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}

diff -u /dev/null rtems/testsuites/sptests/spcbssched01/spcbssched01.doc:1.1
--- /dev/null	Thu Sep 15 11:10:22 2011
+++ rtems/testsuites/sptests/spcbssched01/spcbssched01.doc	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,47 @@
+#
+#  $Id$
+#
+#  COPYRIGHT (c) 1989-1999.
+#  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.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name:  spcbssched01
+
+directives:
+  ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+  tm_set, tm_get, tm_wkafter
+
+concepts:
+
+This test is identical to sp01 but for CBS-based scheduling:
+
+  a.  Verifies system can create and start both the executive's system
+      initialization and idle task.
+
+  b.  Verifies executive can swap between three application tasks at the
+      same priority and the executive's internal idle task.
+
+  c.  Verifies can print strings to the CRT on port 2 of the mvme136 board
+      using Print and Println in the board support package.
+
+  d.  Verifies interrupt handler can handle a task switch from an interrupt
+      as specified with the i_return directive.
+
+  e.  Verifies executive initialization performed correctly.
+
+  f.  Verifies the executive trap handler except for the halt function.
+
+  g.  Verifies that a task can get the task identification number of itself.
+
+  h.  Verifies implementation of SuperCore TOD_MILLISECONDS_TO_TICKS.  Normal
+      computation in applications is via a macro at the Classic API level.
+
+output:
+ "TA1" is printed once every 5 seconds.  "TA2" is printed once
+ every 10 seconds.  "TA3" is printed once every 15 seconds.

diff -u /dev/null rtems/testsuites/sptests/spcbssched01/spcbssched01.scn:1.1
--- /dev/null	Thu Sep 15 11:10:22 2011
+++ rtems/testsuites/sptests/spcbssched01/spcbssched01.scn	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,16 @@
+*** CBS SCHEDULER TEST 1 ***
+TA1  - rtems_clock_get_tod - 09:00:00   12/31/1988
+TA2  - rtems_clock_get_tod - 09:00:00   12/31/1988
+TA3  - rtems_clock_get_tod - 09:00:00   12/31/1988
+TA1  - rtems_clock_get_tod - 09:00:05   12/31/1988
+TA1  - rtems_clock_get_tod - 09:00:10   12/31/1988
+TA2  - rtems_clock_get_tod - 09:00:10   12/31/1988
+TA1  - rtems_clock_get_tod - 09:00:15   12/31/1988
+TA3  - rtems_clock_get_tod - 09:00:15   12/31/1988
+TA1  - rtems_clock_get_tod - 09:00:20   12/31/1988
+TA2  - rtems_clock_get_tod - 09:00:20   12/31/1988
+TA1  - rtems_clock_get_tod - 09:00:25   12/31/1988
+TA1  - rtems_clock_get_tod - 09:00:30   12/31/1988
+TA3  - rtems_clock_get_tod - 09:00:30   12/31/1988
+TA2  - rtems_clock_get_tod - 09:00:30   12/31/1988
+*** END OF CBS SCHEDULER TEST 1 ***

diff -u /dev/null rtems/testsuites/sptests/spcbssched01/system.h:1.1
--- /dev/null	Thu Sep 15 11:10:22 2011
+++ rtems/testsuites/sptests/spcbssched01/system.h	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,47 @@
+/*  system.h
+ *
+ *  This include file contains information that is included in every
+ *  function in the test set.
+ *
+ *  COPYRIGHT (c) 1989-1999.
+ *  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$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+  rtems_task_argument argument
+);
+
+rtems_task Task_1_through_3(
+  rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SCHEDULER_CBS
+
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_EXTRA_TASK_STACKS         (4 * RTEMS_MINIMUM_STACK_SIZE)
+#define CONFIGURE_MAXIMUM_TASKS             4
+
+#include <rtems/confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id   Task_id[ 4 ];         /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ];       /* array of task names */
+
+/* end of include file */

diff -u /dev/null rtems/testsuites/sptests/spcbssched01/task1.c:1.1
--- /dev/null	Thu Sep 15 11:10:22 2011
+++ rtems/testsuites/sptests/spcbssched01/task1.c	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,57 @@
+/*  Task_1_through_3
+ *
+ *  This routine serves as a test task.  It verifies the basic task
+ *  switching capabilities of the executive.
+ *
+ *  Input parameters:
+ *    argument - task argument
+ *
+ *  Output parameters:  NONE
+ *
+ *  COPYRIGHT (c) 1989-1999.
+ *  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$
+ */
+
+#include "system.h"
+
+rtems_task Task_1_through_3(
+  rtems_task_argument argument
+)
+{
+  rtems_id          tid;
+  rtems_time_of_day time;
+  rtems_status_code status;
+  rtems_interval    ticks;
+
+  status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+  directive_failed( status, "rtems_task_ident" );
+
+  /*
+   * Use TOD_MILLISECONDS_TO_TICKS not RTEMS_MILLISECONDS_TO_TICKS to
+   * test C implementation in SuperCore -- not macro version used
+   * everywhere else.
+   */
+  ticks = TOD_MILLISECONDS_TO_TICKS( task_number( tid ) * 5 * 1000 );
+
+  while( FOREVER ) {
+    status = rtems_clock_get_tod( &time );
+    directive_failed( status, "rtems_clock_get_tod" );
+
+    if ( time.second >= 35 ) {
+      puts( "*** END OF CBS SCHEDULER TEST 1 ***" );
+      rtems_test_exit( 0 );
+    }
+
+    put_name( Task_name[ task_number( tid ) ], FALSE );
+    print_time( " - rtems_clock_get_tod - ", &time, "\n" );
+
+    status = rtems_task_wake_after( ticks );
+    directive_failed( status, "rtems_task_wake_after" );
+  }
+}

diff -u /dev/null rtems/testsuites/sptests/spcbssched02/.cvsignore:1.1
--- /dev/null	Thu Sep 15 11:10:22 2011
+++ rtems/testsuites/sptests/spcbssched02/.cvsignore	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in

diff -u /dev/null rtems/testsuites/sptests/spcbssched02/Makefile.am:1.1
--- /dev/null	Thu Sep 15 11:10:22 2011
+++ rtems/testsuites/sptests/spcbssched02/Makefile.am	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,28 @@
+##
+## $Id$
+##
+
+MANAGERS = io rate_monotonic semaphore clock
+
+rtems_tests_PROGRAMS = spcbssched02
+spcbssched02_SOURCES = init.c task_periodic.c system.h
+
+dist_rtems_tests_DATA = spcbssched02.scn
+dist_rtems_tests_DATA += spcbssched02.doc
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
+include $(top_srcdir)/../automake/compile.am
+include $(top_srcdir)/../automake/leaf.am
+
+spcbssched02_LDADD = $(MANAGERS_NOT_WANTED:%=$(PROJECT_LIB)/no-%.rel)
+
+AM_CPPFLAGS += -I$(top_srcdir)/../support/include
+
+LINK_OBJS = $(spcbssched02_OBJECTS) $(spcbssched02_LDADD)
+LINK_LIBS = $(spcbssched02_LDLIBS)
+
+spcbssched02$(EXEEXT): $(spcbssched02_OBJECTS) $(spcbssched02_DEPENDENCIES)
+	@rm -f spcbssched02$(EXEEXT)
+	$(make-exe)
+
+include $(top_srcdir)/../automake/local.am

diff -u /dev/null rtems/testsuites/sptests/spcbssched02/init.c:1.1
--- /dev/null	Thu Sep 15 11:10:22 2011
+++ rtems/testsuites/sptests/spcbssched02/init.c	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,227 @@
+/*  Init
+ *
+ *  This routine is the initialization task for this test program.
+ *  It is a user initialization task and has the responsibility for creating
+ *  and starting the tasks that make up the test.  If the time of day
+ *  clock is required for the test, it should also be set to a known
+ *  value by this function.
+ *
+ *  Input parameters:
+ *    argument - task argument
+ *
+ *  Output parameters:  NONE
+ *
+ *  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$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+
+rtems_task Init(
+  rtems_task_argument argument
+)
+{
+  rtems_status_code status;
+  rtems_cbs_server_id server_id, server_id2;
+  time_t approved_budget, exec_time, abs_time, remaining_budget;
+  rtems_cbs_parameters params, params1, params2, params3, params4;
+
+  Priority = 30;
+  Period    = 30;
+  Execution = 10;
+  Phase = 0;
+
+  params.deadline = 1;
+  params.budget = 1;
+
+  params1 = params2 = params3 = params4 = params;
+  params1.budget = -1;
+  params2.budget = SCHEDULER_EDF_PRIO_MSB + 1;
+  params3.deadline = -1;
+  params4.deadline = SCHEDULER_EDF_PRIO_MSB + 1;
+
+  puts( "\n\n*** TEST CBS SCHEDULER 2 ***" );
+
+  Task_name = rtems_build_name( 'P', 'T', '1', ' ' );
+
+  status = rtems_task_create(
+    Task_name,
+    Priority,
+    RTEMS_MINIMUM_STACK_SIZE * 4,
+    RTEMS_DEFAULT_MODES,
+    RTEMS_DEFAULT_ATTRIBUTES,
+    &Task_id
+  );
+  directive_failed( status, "rtems_task_create loop" );
+
+  printf( "Init: Initializing the CBS\n" );
+  if ( rtems_cbs_initialize() )
+    printf( "ERROR: CBS INITIALIZATION FAILED\n" );
+
+  /* Error checks for Create server and Destroy server  */
+  printf( "Init: Create server and Destroy server\n" );
+  if ( rtems_cbs_destroy_server( -5 ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: DESTROY SERVER PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_destroy_server( 5 ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: DESTROY SERVER PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_destroy_server( 0 ) != SCHEDULER_CBS_ERROR_NOSERVER )
+    printf( "ERROR: DESTROY SERVER PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_create_server( &params1, NULL, &server_id ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_create_server( &params2, NULL, &server_id ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_create_server( &params3, NULL, &server_id ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_create_server( &params4, NULL, &server_id ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_create_server( &params, NULL, &server_id2 ) )
+    printf( "ERROR: CREATE SERVER FAILED\n" );
+  if ( rtems_cbs_create_server( &params, NULL, &server_id ) )
+    printf( "ERROR: CREATE SERVER FAILED\n" );
+  if ( rtems_cbs_create_server( &params, NULL, &server_id ) !=
+       SCHEDULER_CBS_ERROR_FULL )
+    printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );
+
+  /* Error checks for Attach thread and Detach thread */
+  printf( "Init: Attach thread\n" );
+  if ( rtems_cbs_attach_thread( -5, RTEMS_SELF ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: ATTACH THREAD PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_attach_thread( 5, RTEMS_SELF ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: ATTACH THREAD PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_attach_thread( server_id, 1234 ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: ATTACH THREAD PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_attach_thread( server_id, RTEMS_SELF ) )
+    printf( "ERROR: ATTACH THREAD FAILED\n" );
+  if ( rtems_cbs_attach_thread( server_id, RTEMS_SELF ) !=
+       SCHEDULER_CBS_ERROR_FULL )
+    printf( "ERROR: ATTACH THREAD AGAIN PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_attach_thread( server_id, Task_id ) !=
+       SCHEDULER_CBS_ERROR_FULL )
+    printf( "ERROR: ATTACH THREAD TO FULL SERVER PASSED UNEXPECTEDLY \n" );
+  if ( rtems_cbs_destroy_server( server_id ) )
+    printf( "ERROR: DESTROY SERVER WITH THREAD ATTACHED FAILED\n" );
+  if ( rtems_cbs_attach_thread( server_id, RTEMS_SELF ) !=
+       SCHEDULER_CBS_ERROR_NOSERVER )
+    printf( "ERROR: ATTACH THREAD PASSED UNEXPECTEDLY\n" );
+
+  printf( "Init: Detach thread\n" );
+  if ( rtems_cbs_detach_thread( -5, RTEMS_SELF ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: DETACH THREAD PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_detach_thread( 5, RTEMS_SELF ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: DETACH THREAD PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_detach_thread( server_id2, 1234 ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: DETACH THREAD PASSED UNEXPECTEDLY \n" );
+  if ( rtems_cbs_detach_thread( server_id, RTEMS_SELF ) !=
+       SCHEDULER_CBS_ERROR_NOSERVER )
+    printf( "ERROR: DETACH THREAD PASSED UNEXPECTEDLY4\n" );
+  rtems_cbs_destroy_server( server_id2 );
+
+  /* Error checks for Set parameters and Get parameters */
+  printf( "Init: Set parameters and Get parameters\n" );
+  if ( rtems_cbs_set_parameters( -5, &params ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_set_parameters( 5, &params ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_set_parameters( server_id, &params ) !=
+       SCHEDULER_CBS_ERROR_NOSERVER )
+    printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" );
+
+  if ( rtems_cbs_get_parameters( -5, &params ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: GET PARAMETERS PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_get_parameters( 5, &params ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: GET PARAMETERS PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_get_parameters( server_id, &params ) !=
+       SCHEDULER_CBS_ERROR_NOSERVER )
+    printf( "ERROR: GET PARAMETERS PASSED UNEXPECTEDLY\n" );
+
+  if ( rtems_cbs_set_parameters( server_id, &params1 ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_set_parameters( server_id, &params2 ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_set_parameters( server_id, &params3 ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_set_parameters( server_id, &params4 ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" );
+
+  /* Error checks for Get server id */
+  printf( "Init: Get server id\n" );
+  if ( rtems_cbs_get_server_id( RTEMS_SELF, &server_id ) !=
+       SCHEDULER_CBS_ERROR_NOSERVER )
+    printf( "ERROR: GET SERVER ID PASSED UNEXPECTEDLY\n" );
+
+  /* Error checks for Get approved budget */
+  printf( "Init: Get approved budget\n" );
+  if ( rtems_cbs_get_approved_budget( -5, &approved_budget ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: GET APPROVED BUDGET PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_get_approved_budget( 5, &approved_budget ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: GET APPROVED BUDGET PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_get_approved_budget( server_id, &approved_budget ) !=
+       SCHEDULER_CBS_ERROR_NOSERVER )
+    printf( "ERROR: GET APPROVED BUDGET PASSED UNEXPECTEDLY\n" );
+
+  /* Error checks for Get remaining budget */
+  printf( "Init: Get remaining budget\n" );
+  if ( rtems_cbs_get_remaining_budget( -5, &remaining_budget ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: GET REMAINING BUDGET PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_get_remaining_budget( 5, &remaining_budget ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: GET REMAINING BUDGET PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_get_remaining_budget( server_id, &remaining_budget ) !=
+       SCHEDULER_CBS_ERROR_NOSERVER )
+    printf( "ERROR: GET REMAINING BUDGET PASSED UNEXPECTEDLY\n" );
+
+  /* Error checks for Get execution time */
+  printf( "Init: Get execution time\n" );
+  if ( rtems_cbs_get_execution_time( -5, &exec_time, &abs_time ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: GET EXECUTION TIME PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_get_execution_time( 5, &exec_time, &abs_time ) !=
+       SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
+    printf( "ERROR: GET EXECUTION TIME PASSED UNEXPECTEDLY\n" );
+  if ( rtems_cbs_get_execution_time( server_id, &exec_time, &abs_time ) !=
+       SCHEDULER_CBS_ERROR_NOSERVER )
+    printf( "ERROR: GET EXECUTION TIME PASSED UNEXPECTEDLY\n" );
+
+  /* Restart CBS library */
+  printf( "Init: Cleaning up CBS\n" );
+  if ( rtems_cbs_cleanup() )
+    printf( "ERROR: CBS CLEANUP FAILED\n" );
+  printf( "Init: Initializing the CBS\n" );
+  if ( rtems_cbs_initialize() )
+    printf( "ERROR: CBS INITIALIZATION FAILED\n" );
+
+  /* Start periodic task */
+  printf( "Init: Starting periodic task\n" );
+  status = rtems_task_start( Task_id, Task_Periodic, 1 );
+  directive_failed( status, "rtems_task_start periodic" );
+
+  status = rtems_task_delete( RTEMS_SELF );
+  directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}

diff -u /dev/null rtems/testsuites/sptests/spcbssched02/spcbssched02.doc:1.1
--- /dev/null	Thu Sep 15 11:10:22 2011
+++ rtems/testsuites/sptests/spcbssched02/spcbssched02.doc	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,22 @@
+#
+#  $Id$
+#
+#  COPYRIGHT (c) 1989-1999.
+#  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.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name:  spcbssched02
+
+directives:
+
+
+concepts:
+
+  a.  Verifies CBS library functionality.

diff -u /dev/null rtems/testsuites/sptests/spcbssched02/spcbssched02.scn:1.1
--- /dev/null	Thu Sep 15 11:10:23 2011
+++ rtems/testsuites/sptests/spcbssched02/spcbssched02.scn	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,30 @@
+*** TEST CBS SCHEDULER 2 ***
+Init: Initializing the CBS
+Init: Create server and Destroy server
+Init: Attach thread
+Init: Detach thread
+Init: Set parameters and Get parameters
+Init: Get server id
+Init: Get approved budget
+Init: Get remaining budget
+Init: Get execution time
+Init: Cleaning up CBS
+Init: Initializing the CBS
+Init: Starting periodic task
+Periodic task: Create server and Attach thread
+Periodic task: ID and Get parameters
+Periodic task: Detach thread and Destroy server
+Periodic task: Remaining budget and Execution time
+Periodic task: Set parameters
+Periodic task: Approved budget
+Periodic task: Starting periodic behavior
+P1-S ticks:1
+P1-F ticks:11
+P1-S ticks:31
+P1-F ticks:41
+P1-S ticks:61
+P1-F ticks:71
+P1-S ticks:91
+P1-F ticks:101
+P1-S ticks:121
+*** END OF TEST CBS SCHEDULER 2 ***

diff -u /dev/null rtems/testsuites/sptests/spcbssched02/system.h:1.1
--- /dev/null	Thu Sep 15 11:10:23 2011
+++ rtems/testsuites/sptests/spcbssched02/system.h	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,62 @@
+/*  system.h
+ *
+ *  This include file contains information that is included in every
+ *  function in the test set.
+ *
+ *  COPYRIGHT (c) 1989-1999.
+ *  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$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+  rtems_task_argument argument
+);
+
+rtems_task Task_Periodic(
+  rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MICROSECONDS_PER_TICK 100000
+
+#define CONFIGURE_MAXIMUM_TASKS               2
+#define CONFIGURE_MAXIMUM_PERIODS             10
+
+#define CONFIGURE_INIT_TASK_PRIORITY          100
+#define CONFIGURE_INIT_TASK_INITIAL_MODES     RTEMS_DEFAULT_MODES
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_EXTRA_TASK_STACKS         (6 * 4 * RTEMS_MINIMUM_STACK_SIZE)
+
+#define CONFIGURE_SCHEDULER_CBS
+
+#include <rtems/confdefs.h>
+
+#include <rtems/rtems/clock.h>
+#include <rtems/score/isr.h>
+#include <rtems/rtems/intr.h>
+#include <rtems/cbs.h>
+
+/* global variables */
+
+rtems_id   Task_id;
+rtems_name Task_name;
+rtems_task_priority Priority;
+time_t  Period;
+time_t  Execution;
+time_t  Phase;
+
+/* end of include file */

diff -u /dev/null rtems/testsuites/sptests/spcbssched02/task_periodic.c:1.1
--- /dev/null	Thu Sep 15 11:10:23 2011
+++ rtems/testsuites/sptests/spcbssched02/task_periodic.c	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,138 @@
+/*  Tasks_Periodic
+ *
+ *  This routine serves as a test task for the CBS scheduler
+ *  implementation.
+ *
+ *  Input parameters:
+ *    argument - task argument
+ *
+ *  Output parameters:  NONE
+ *
+ *  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$
+ */
+
+#include "system.h"
+
+rtems_task Task_Periodic(
+  rtems_task_argument argument
+)
+{
+  rtems_id          rmid;
+  rtems_status_code status;
+
+  time_t approved_budget, exec_time, abs_time, remaining_budget;
+
+  int start, stop, now;
+
+  rtems_cbs_server_id server_id, tsid;
+  rtems_cbs_parameters params, tparams;
+
+  params.deadline = Period;
+  params.budget = Execution+1;
+
+  printf( "Periodic task: Create server and Attach thread\n" );
+  if ( rtems_cbs_create_server( &params, NULL, &server_id ) )
+    printf( "ERROR: CREATE SERVER FAILED\n" );
+  if ( rtems_cbs_attach_thread( server_id, Task_id ) )
+    printf( "ERROR: ATTACH THREAD FAILED\n" );
+
+  printf( "Periodic task: ID and Get parameters\n" );
+  if ( rtems_cbs_get_server_id( Task_id, &tsid ) )
+    printf( "ERROR: GET SERVER ID FAILED\n" );
+  if ( tsid != server_id )
+    printf( "ERROR: SERVER ID MISMATCH\n" );
+  if ( rtems_cbs_get_parameters( server_id, &tparams ) )
+    printf( "ERROR: GET PARAMETERS FAILED\n" );
+  if ( params.deadline != tparams.deadline ||
+       params.budget != tparams.budget )
+    printf( "ERROR: PARAMETERS MISMATCH\n" );
+
+  printf( "Periodic task: Detach thread and Destroy server\n" );
+  if ( rtems_cbs_detach_thread( server_id, Task_id ) )
+    printf( "ERROR: DETACH THREAD FAILED\n" );
+  if ( rtems_cbs_destroy_server( server_id ) )
+    printf( "ERROR: DESTROY SERVER FAILED\n" );
+  if ( rtems_cbs_create_server( &params, NULL, &server_id ) )
+    printf( "ERROR: CREATE SERVER FAILED\n" );
+
+  printf( "Periodic task: Remaining budget and Execution time\n" );
+  if ( rtems_cbs_get_remaining_budget( server_id, &remaining_budget ) )
+    printf( "ERROR: GET REMAINING BUDGET FAILED\n" );
+  if ( remaining_budget != params.budget )
+    printf( "ERROR: REMAINING BUDGET MISMATCH\n" );
+  if ( rtems_cbs_get_execution_time( server_id, &exec_time, &abs_time ) )
+    printf( "ERROR: GET EXECUTION TIME FAILED\n" );
+
+  printf( "Periodic task: Set parameters\n" );
+  if ( rtems_cbs_attach_thread( server_id, Task_id ) )
+    printf( "ERROR: ATTACH THREAD FAILED\n" );
+  params.deadline = Period * 2;
+  params.budget = Execution * 2 +1;
+  if ( rtems_cbs_set_parameters( server_id, &params ) )
+    printf( "ERROR: SET PARAMS FAILED\n" );
+  if ( rtems_cbs_get_parameters( server_id, &tparams ) )
+    printf( "ERROR: GET PARAMS FAILED\n" );
+  if ( params.deadline != tparams.deadline ||
+       params.budget != tparams.budget )
+    printf( "ERROR: PARAMS MISMATCH\n" );
+  params.deadline = Period;
+  params.budget = Execution+1;
+  if ( rtems_cbs_set_parameters( server_id, &params ) )
+    printf( "ERROR: SET PARAMS FAILED\n" );
+  if ( rtems_cbs_get_approved_budget( server_id, &approved_budget ) )
+    printf( "ERROR: GET APPROVED BUDGET FAILED\n" );
+
+  printf( "Periodic task: Approved budget\n" );
+  if ( approved_budget != params.budget )
+    printf( "ERROR: APPROVED BUDGET MISMATCH\n" );
+
+  status = rtems_rate_monotonic_create( argument, &rmid );
+  directive_failed( status, "rtems_rate_monotonic_create" );
+
+  /* Starting periodic behavior of the task */
+  printf( "Periodic task: Starting periodic behavior\n" );
+  status = rtems_task_wake_after( 1 + Phase );
+  directive_failed( status, "rtems_task_wake_after" );
+
+  while ( FOREVER ) {
+    if ( rtems_rate_monotonic_period(rmid, Period) == RTEMS_TIMEOUT )
+      printf( "P%" PRIdPTR " - Deadline miss\n", argument );
+
+    rtems_clock_get( RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &start );
+    printf( "P%" PRIdPTR "-S ticks:%d\n", argument, start );
+    if ( start > 4*Period+Phase ) break; /* stop */
+    /* active computing */
+    while(FOREVER) {
+      rtems_clock_get( RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &now );
+      if ( now >= start + Execution ) break;
+
+      if ( rtems_cbs_get_execution_time( server_id, &exec_time, &abs_time ) )
+        printf( "ERROR: GET EXECUTION TIME FAILED\n" );
+      if ( rtems_cbs_get_remaining_budget( server_id, &remaining_budget) )
+        printf( "ERROR: GET REMAINING BUDGET FAILED\n" );
+      if ( (remaining_budget + exec_time) > (Execution + 1) ) {
+        printf( "ERROR: REMAINING BUDGET AND EXECUTION TIME MISMATCH\n" );
+        rtems_test_exit( 0 );
+      }
+    }
+    rtems_clock_get( RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &stop );
+    printf( "P%" PRIdPTR "-F ticks:%d\n", argument, stop );
+  }
+
+  /* delete period and SELF */
+  status = rtems_rate_monotonic_delete( rmid );
+  if ( status != RTEMS_SUCCESSFUL ) {
+    printf("rtems_rate_monotonic_delete failed with status of %d.\n", status);
+    rtems_test_exit( 0 );
+  }
+  if ( rtems_cbs_cleanup() )
+    printf( "ERROR: CBS CLEANUP\n" );
+
+  fflush(stdout);
+  puts( "*** END OF TEST CBS SCHEDULER 2 ***" );
+  rtems_test_exit( 0 );
+}

diff -u /dev/null rtems/testsuites/sptests/spcbssched03/.cvsignore:1.1
--- /dev/null	Thu Sep 15 11:10:23 2011
+++ rtems/testsuites/sptests/spcbssched03/.cvsignore	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in

diff -u /dev/null rtems/testsuites/sptests/spcbssched03/Makefile.am:1.1
--- /dev/null	Thu Sep 15 11:10:23 2011
+++ rtems/testsuites/sptests/spcbssched03/Makefile.am	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,28 @@
+##
+## $Id$
+##
+
+MANAGERS = io rate_monotonic semaphore clock
+
+rtems_tests_PROGRAMS = spcbssched03
+spcbssched03_SOURCES = init.c tasks_periodic.c tasks_aperiodic.c system.h cbsparams.h
+
+dist_rtems_tests_DATA = spcbssched03.scn
+dist_rtems_tests_DATA += spcbssched03.doc
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
+include $(top_srcdir)/../automake/compile.am
+include $(top_srcdir)/../automake/leaf.am
+
+spcbssched03_LDADD = $(MANAGERS_NOT_WANTED:%=$(PROJECT_LIB)/no-%.rel)
+
+AM_CPPFLAGS += -I$(top_srcdir)/../support/include
+
+LINK_OBJS = $(spcbssched03_OBJECTS) $(spcbssched03_LDADD)
+LINK_LIBS = $(spcbssched03_LDLIBS)
+
+spcbssched03$(EXEEXT): $(spcbssched03_OBJECTS) $(spcbssched03_DEPENDENCIES)
+	@rm -f spcbssched03$(EXEEXT)
+	$(make-exe)
+
+include $(top_srcdir)/../automake/local.am

diff -u /dev/null rtems/testsuites/sptests/spcbssched03/cbsparams.h:1.1
--- /dev/null	Thu Sep 15 11:10:23 2011
+++ rtems/testsuites/sptests/spcbssched03/cbsparams.h	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,42 @@
+/*  cbsparams.h
+ *
+ *  This include file contains information that is included in every
+ *  function in the test set.
+ *
+ *  COPYRIGHT (c) 1989-1999.
+ *  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$
+ */
+
+/* This file was generated with the following parameters:
+-T 30,10,0 -T 40,10,0 -T 50,10,0 -T 70,10,0 -A 1,100,7 -A 100,5,4
+*/
+
+#ifndef __CBSPARAMS_H_
+#define __CBSPARAMS_H_
+
+#include "system.h"
+
+rtems_task_priority Priorities[1+NUM_TASKS]= { 0, 30, 40, 50, 70, 254, 254 };
+
+uint32_t  Periods[1+NUM_PERIODIC_TASKS]    = { 0, 30, 40, 50, 70 };
+
+uint32_t  Execution[1+NUM_TASKS]           = { 0, 10, 10, 10, 10, 100, 5 };
+
+uint32_t  Phases[1+NUM_TASKS]              = { 0, 0, 0, 0, 0, 7, 4 };
+
+#define build_task_name() do { \
+Task_name[ 1 ] =  rtems_build_name( 'P', 'T', '1', ' ' );\
+Task_name[ 2 ] =  rtems_build_name( 'P', 'T', '2', ' ' );\
+Task_name[ 3 ] =  rtems_build_name( 'P', 'T', '3', ' ' );\
+Task_name[ 4 ] =  rtems_build_name( 'P', 'T', '4', ' ' );\
+Task_name[ 5 ] =  rtems_build_name( 'A', 'T', '5', ' ' );\
+Task_name[ 6 ] =  rtems_build_name( 'A', 'T', '6', ' ' );\
+} while(0)
+
+#endif

diff -u /dev/null rtems/testsuites/sptests/spcbssched03/init.c:1.1
--- /dev/null	Thu Sep 15 11:10:23 2011
+++ rtems/testsuites/sptests/spcbssched03/init.c	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,63 @@
+/*  Init
+ *
+ *  This routine is the initialization task for this test program.
+ *  It is a user initialization task and has the responsibility for creating
+ *  and starting the tasks that make up the test.  If the time of day
+ *  clock is required for the test, it should also be set to a known
+ *  value by this function.
+ *
+ *  Input parameters:
+ *    argument - task argument
+ *
+ *  Output parameters:  NONE
+ *
+ *  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$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+
+#include "cbsparams.h"
+
+rtems_task Init(
+  rtems_task_argument argument
+)
+{
+  uint32_t    index;
+  rtems_status_code status;
+
+  puts( "\n\n*** TEST CBS SCHEDULER 3 ***" );
+
+  build_task_name();
+
+  for ( index = 1 ; index <= NUM_TASKS ; index++ ) {
+    status = rtems_task_create(
+      Task_name[ index ],
+      Priorities[ index ],
+      RTEMS_MINIMUM_STACK_SIZE * 4,
+      RTEMS_DEFAULT_MODES,
+      RTEMS_DEFAULT_ATTRIBUTES,
+      &Task_id[ index ]
+    );
+    directive_failed( status, "rtems_task_create loop" );
+  }
+
+  rtems_cbs_initialize();
+
+  for ( index = 1 ; index <= NUM_PERIODIC_TASKS ; index++ ) {
+    status = rtems_task_start( Task_id[ index ], Tasks_Periodic, index );
+    directive_failed( status, "rtems_task_start loop" );
+  }
+
+  for ( index = NUM_PERIODIC_TASKS+1 ; index <= NUM_TASKS ; index++ ) {
+    status = rtems_task_start( Task_id[ index ], Tasks_Aperiodic, index );
+    directive_failed( status, "rtems_task_start loop" );
+  }
+
+  status = rtems_task_delete( RTEMS_SELF );
+  directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}

diff -u /dev/null rtems/testsuites/sptests/spcbssched03/spcbssched03.doc:1.1
--- /dev/null	Thu Sep 15 11:10:23 2011
+++ rtems/testsuites/sptests/spcbssched03/spcbssched03.doc	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,22 @@
+#
+#  $Id$
+#
+#  COPYRIGHT (c) 1989-1999.
+#  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.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name:  spcbssched03
+
+directives:
+
+
+concepts:
+
+  a.  Verifies CBS Scheduling behavior.

diff -u /dev/null rtems/testsuites/sptests/spcbssched03/spcbssched03.scn:1.1
--- /dev/null	Thu Sep 15 11:10:23 2011
+++ rtems/testsuites/sptests/spcbssched03/spcbssched03.scn	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,170 @@
+*** TEST CBS SCHEDULER 3 ***
+PT1 - rtems_rate_monotonic_create id = 0x42010001
+PT1 - rtems_rate_monotonic_ident id = 0x42010001
+PT1 - (0x42010001) period 30
+PT2 - rtems_rate_monotonic_create id = 0x42010002
+PT2 - rtems_rate_monotonic_ident id = 0x42010002
+PT2 - (0x42010002) period 40
+PT3 - rtems_rate_monotonic_create id = 0x42010003
+PT3 - rtems_rate_monotonic_ident id = 0x42010003
+PT3 - (0x42010003) period 50
+PT4 - rtems_rate_monotonic_create id = 0x42010004
+PT4 - rtems_rate_monotonic_ident id = 0x42010004
+PT4 - (0x42010004) period 70
+AT5 AT6 P1-S ticks:2
+P1-F ticks:12
+P2-S ticks:12
+P2-F ticks:22
+P3-S ticks:22
+P1-S ticks:32
+P1-F ticks:42
+P3-F ticks:42
+P4-S ticks:42
+P2-S ticks:52
+P2-F ticks:62
+P1-S ticks:62
+P1-F ticks:72
+P4-F ticks:72
+P3-S ticks:72
+P3-F ticks:82
+AT6-S ticks:82
+P6-F ticks:87
+Killing task 6
+AT5-S ticks:87
+P1-S ticks:92
+P1-F ticks:102
+P2-S ticks:102
+P2-F ticks:112
+P4-S ticks:112
+P1-S ticks:122
+P1-F ticks:132
+P3-S ticks:132
+P3-F ticks:142
+P2-S ticks:142
+P2-F ticks:152
+P4-F ticks:152
+P1-S ticks:152
+P1-F ticks:162
+P2-S ticks:172
+P2-F ticks:182
+P1-S ticks:182
+P1-F ticks:192
+P3-S ticks:192
+P3-F ticks:202
+P4-S ticks:202
+P1-S ticks:212
+P1-F ticks:222
+P4-F ticks:222
+P2-S ticks:222
+P2-F ticks:232
+P3-S ticks:232
+P3-F ticks:242
+P1-S ticks:242
+P1-F ticks:252
+P2-S ticks:252
+P2-F ticks:262
+P4-S ticks:262
+P1-S ticks:272
+P1-F ticks:282
+P3-S ticks:283
+P3-F ticks:293
+P2-S ticks:293
+P2-F ticks:303
+P1-S ticks:303
+P1-F ticks:313
+Signal overrun, fixing the task
+P4-F ticks:313
+P5-F ticks:313
+Killing task 5
+P3-S ticks:322
+P1-S ticks:332
+P1-F ticks:342
+P3-F ticks:342
+P2-S ticks:342
+P2-F ticks:352
+P4-S ticks:352
+P4-F ticks:362
+P1-S ticks:362
+P1-F ticks:372
+P2-S ticks:372
+P2-F ticks:382
+P3-S ticks:382
+P1-S ticks:392
+P1-F ticks:402
+P4-S ticks:402
+P2-S ticks:412
+P2-F ticks:422
+P1-S ticks:422
+P1-F ticks:432
+P4-F ticks:432
+P3-F ticks:432
+P1-S ticks:452
+P1-F ticks:462
+P2-S ticks:462
+P2-F ticks:472
+P4-S ticks:472
+P1-S ticks:482
+P1-F ticks:492
+P4-F ticks:492
+P2-S ticks:492
+P2-F ticks:502
+P3-S ticks:502
+P1-S ticks:512
+P1-F ticks:522
+P3-F ticks:522
+P2-S ticks:532
+P4-S ticks:532
+P1-S ticks:542
+P1-F ticks:552
+P4-F ticks:552
+P2-F ticks:552
+P1-S ticks:572
+P1-F ticks:582
+P2-S ticks:582
+P3-S ticks:582
+P1-S ticks:602
+P1-F ticks:612
+P3-F ticks:612
+P4-S ticks:612
+P4-F ticks:622
+P2-F ticks:622
+P2 - Deadline miss
+P2-S ticks:622
+P1-S ticks:632
+P1-F ticks:642
+P2-F ticks:642
+P1-S ticks:662
+P1-F ticks:672
+P2-S ticks:672
+P4-S ticks:672
+P4-F ticks:682
+P3-S ticks:682
+P1-S ticks:692
+P1-F ticks:702
+P3-F ticks:702
+P2-F ticks:702
+P2 - Deadline miss
+P2-S ticks:702
+P2-F ticks:712
+P1-S ticks:722
+P1-F ticks:732
+P2-S ticks:742
+P4-S ticks:742
+P1-S ticks:752
+P1-F ticks:762
+P4-F ticks:762
+P2-F ticks:762
+P3-S ticks:772
+P1-S ticks:782
+P1-F ticks:792
+P2-S ticks:792
+P3-F ticks:792
+P2-F ticks:802
+P1-S ticks:812
+P1-F ticks:822
+P2-S ticks:822
+P4-S ticks:822
+P4-F ticks:832
+P2-F ticks:832
+P1-S ticks:842
+*** END OF TEST CBS SCHEDULER 3 ***

diff -u /dev/null rtems/testsuites/sptests/spcbssched03/system.h:1.1
--- /dev/null	Thu Sep 15 11:10:23 2011
+++ rtems/testsuites/sptests/spcbssched03/system.h	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,73 @@
+/*  system.h
+ *
+ *  This include file contains information that is included in every
+ *  function in the test set.
+ *
+ *  COPYRIGHT (c) 1989-1999.
+ *  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$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+  rtems_task_argument argument
+);
+
+rtems_task Tasks_Periodic(
+  rtems_task_argument argument
+);
+
+rtems_task Tasks_Aperiodic(
+  rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MICROSECONDS_PER_TICK 100000
+
+#define CONFIGURE_MAXIMUM_TASKS               7
+#define CONFIGURE_MAXIMUM_PERIODS             10
+
+#define CONFIGURE_INIT_TASK_PRIORITY          100
+#define CONFIGURE_INIT_TASK_INITIAL_MODES     RTEMS_DEFAULT_MODES
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_EXTRA_TASK_STACKS         (6 * 4 * RTEMS_MINIMUM_STACK_SIZE)
+
+#define CONFIGURE_SCHEDULER_CBS
+
+#include <rtems/confdefs.h>
+
+#include <rtems/rtems/clock.h>
+#include <rtems/score/isr.h>
+#include <rtems/rtems/intr.h>
+#include <rtems/cbs.h>
+
+#define  JOBS_PER_HP              (389)
+#define  HP_LENGTH                (420)
+#define  NUM_PERIODIC_TASKS       (4)
+#define  NUM_APERIODIC_TASKS      (2)
+#define  NUM_TASKS                ( NUM_PERIODIC_TASKS + NUM_APERIODIC_TASKS )
+
+/* global variables */
+
+TEST_EXTERN rtems_id   Task_id[ 1+NUM_TASKS ];     /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 1+NUM_TASKS ];   /* array of task names */
+extern rtems_task_priority Priorities[ 1+NUM_TASKS ];
+extern uint32_t  Periods[ 1 + NUM_PERIODIC_TASKS ];
+extern uint32_t  Phases[1 + NUM_TASKS];
+extern uint32_t  Execution[1 + NUM_TASKS];
+bool Violating_task[1 + NUM_PERIODIC_TASKS];
+
+/* end of include file */

diff -u /dev/null rtems/testsuites/sptests/spcbssched03/tasks_aperiodic.c:1.1
--- /dev/null	Thu Sep 15 11:10:23 2011
+++ rtems/testsuites/sptests/spcbssched03/tasks_aperiodic.c	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,48 @@
+/*  Tasks_Aperiodic
+ *
+ *  This routine serves as a test task for the CBS scheduler
+ *  implementation. This is for aperiodic task execution.
+ *
+ *  Input parameters:
+ *    argument - task argument
+ *
+ *  Output parameters:  NONE
+ *
+ *  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$
+ */
+
+#include "system.h"
+
+rtems_task Tasks_Aperiodic(
+  rtems_task_argument argument
+)
+{
+  rtems_status_code status;
+  int start, stop, now;
+
+  put_name( Task_name[ argument ], FALSE );
+
+  status = rtems_task_wake_after( 2 + Phases[argument] );
+  directive_failed( status, "rtems_task_wake_after" );
+
+  rtems_clock_get(RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &start);
+  printf("AT%" PRIdPTR "-S ticks:%d\n", argument, start);
+  /* active computing */
+
+  while(FOREVER) {
+    rtems_clock_get(RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &now);
+    if (now >= start + Execution[argument]) break;
+  }
+  rtems_clock_get(RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &stop);
+  printf("P%" PRIdPTR "-F ticks:%d\n", argument, stop);
+
+  /* delete SELF */
+  fflush(stdout);
+  printf( "Killing task %" PRIdPTR "\n", argument);
+  status = rtems_task_delete(RTEMS_SELF);
+  directive_failed(status, "rtems_task_delete of RTEMS_SELF");
+}

diff -u /dev/null rtems/testsuites/sptests/spcbssched03/tasks_periodic.c:1.1
--- /dev/null	Thu Sep 15 11:10:24 2011
+++ rtems/testsuites/sptests/spcbssched03/tasks_periodic.c	Thu Sep 15 10:56:01 2011
@@ -0,0 +1,154 @@
+/*  Tasks_Periodic
+ *
+ *  This routine serves as a test task for the CBS scheduler
+ *  implementation.
+ *
+ *  Input parameters:
+ *    argument - task argument
+ *
+ *  Output parameters:  NONE
+ *
+ *  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$
+ */
+
+#include "system.h"
+
+void overrun_handler_task_4 (
+  rtems_cbs_server_id server_id
+)
+{
+  printk( "Signal overrun, fixing the task\n" );
+  Violating_task[ 4 ] = 0;
+  /* rtems_task_restart( RTEMS_SELF, 4 ); might be also possible*/
+  return;
+}
+
+rtems_task Tasks_Periodic(
+  rtems_task_argument argument
+)
+{
+  rtems_id          rmid;
+  rtems_id          test_rmid;
+  rtems_status_code status;
+  bool              scenario_done = 0;
+
+  int start, stop, now;
+
+  rtems_cbs_server_id server_id, tsid;
+  rtems_cbs_parameters params, tparams;
+
+  params.deadline = Periods[ argument ];
+  params.budget = Execution[ argument ]+1;
+
+  if ( argument == 4 ) {
+    if ( rtems_cbs_create_server( &params, &overrun_handler_task_4, &server_id ))
+      printf( "ERROR: CREATE SERVER FAILED\n" );
+  }
+  else {
+    if ( rtems_cbs_create_server( &params, NULL, &server_id ) )
+      printf( "ERROR: CREATE SERVER FAILED\n" );
+  }
+  if ( rtems_cbs_attach_thread( server_id, Task_id[ argument ] ) )
+    printf( "ERROR: ATTACH THREAD FAILED\n" );
+  if ( rtems_cbs_get_server_id( Task_id[ argument ], &tsid ) )
+    printf( "ERROR: GET SERVER ID FAILED\n" );
+  if ( tsid != server_id )
+    printf( "ERROR: SERVER ID MISMATCH\n" );
+  if ( rtems_cbs_get_parameters( server_id, &tparams ) )
+    printf( "ERROR: GET PARAMETERS FAILED\n" );
+  if ( params.deadline != tparams.deadline ||
+       params.budget != tparams.budget )
+    printf( "ERROR: PARAMETERS MISMATCH\n" );
+
+  status = rtems_rate_monotonic_create( argument, &rmid );
+  directive_failed( status, "rtems_rate_monotonic_create" );
+  put_name( Task_name[ argument ], FALSE );
+  printf( "- rtems_rate_monotonic_create id = 0x%08" PRIxrtems_id "\n",
+          rmid );
+
+  status = rtems_rate_monotonic_ident( argument, &test_rmid );
+  directive_failed( status, "rtems_rate_monotonic_ident" );
+  put_name( Task_name[ argument ], FALSE );
+  printf( "- rtems_rate_monotonic_ident id = 0x%08" PRIxrtems_id "\n",
+          test_rmid );
+
+  if ( rmid != test_rmid ) {
+     printf( "RMID's DO NOT MATCH (0x%" PRIxrtems_id " and 0x%"
+             PRIxrtems_id ")\n", rmid, test_rmid );
+     rtems_test_exit( 0 );
+  }
+
+  put_name( Task_name[ argument ], FALSE );
+  printf( "- (0x%08" PRIxrtems_id ") period %" PRIu32 "\n",
+          rmid, Periods[ argument ] );
+
+  status = rtems_task_wake_after( 2 + Phases[argument] );
+  directive_failed( status, "rtems_task_wake_after" );
+
+  while (FOREVER) {
+    if (rtems_rate_monotonic_period(rmid, Periods[argument])==RTEMS_TIMEOUT)
+      printf("P%" PRIdPTR " - Deadline miss\n", argument);
+
+    rtems_clock_get(RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &start);
+    printf("P%" PRIdPTR "-S ticks:%d\n", argument, start);
+    if ( start >= 2*HP_LENGTH ) break; /* stop */
+
+    /* Specific scenario for task 4: tries to exceed announced budget,
+       the task priority has to be pulled down to background. */
+    if ( !scenario_done && argument == 4 && now >= 200 ) {
+      Violating_task[ argument ] = 1;
+      scenario_done = 1;
+    }
+    /* Specific scenario for task 3: changes scheduling parameters. */
+    if ( !scenario_done && argument == 3 && now >= 250 ) {
+      Periods[ argument ]   = Periods[ argument ] * 2;
+      Execution[ argument ] = Execution[ argument ] * 2;
+      params.deadline = Periods[ argument ];
+      params.budget   = Execution[ argument ]+1;
+      if ( rtems_cbs_set_parameters( server_id, &params) )
+        printf( "ERROR: SET PARAMETERS FAILED\n" );
+      if ( rtems_cbs_get_parameters( server_id, &tparams ) )
+        printf( "ERROR: GET PARAMETERS FAILED\n" );
+      if ( params.deadline != tparams.deadline ||
+           params.budget != tparams.budget )
+        printf( "ERROR: PARAMETERS MISMATCH\n" );
+      scenario_done = 1;
+    }
+    /* Specific scenario for task 2: late unblock after being blocked by
+       itself, the task priority has to be pulled down to background. */
+    if ( !scenario_done && argument == 2 && now >= 500 ) {
+      Violating_task[ argument ] = 1;
+      scenario_done = 1;
+    }
+    if (argument == 2 && Violating_task[ argument ])
+      rtems_task_wake_after( 10 );
+
+    /* active computing */
+    while(FOREVER) {
+      rtems_clock_get(RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &now);
+      if ( argument == 4 && !Violating_task[ argument ] &&
+          (now >= start + Execution[argument]))
+        break;
+      if ( argument != 4 && (now >= start + Execution[argument]) )
+        break;
+    }
+    rtems_clock_get(RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &stop);
+    printf("P%" PRIdPTR "-F ticks:%d\n", argument, stop);
+  }
+
+  /* delete period and SELF */
+  status = rtems_rate_monotonic_delete( rmid );
+  if ( status != RTEMS_SUCCESSFUL ) {
+    printf("rtems_rate_monotonic_delete failed with status of %d.\n",status);
+    rtems_test_exit( 0 );
+  }
+  if ( rtems_cbs_cleanup() )
+    printf( "ERROR: CBS CLEANUP\n" );
+  fflush(stdout);
+  puts( "*** END OF TEST CBS SCHEDULER 3 ***" );
+  rtems_test_exit( 0 );
+}


 *joel*:
2011-09-15	Joel Sherrill <joel.sherrill at oarcorp.com>

	* spcbssched01/Makefile.am, spcbssched02/Makefile.am,
	spcbssched03/Makefile.am: Formatting.

M  1.486  testsuites/sptests/ChangeLog
M    1.2  testsuites/sptests/spcbssched01/Makefile.am
M    1.2  testsuites/sptests/spcbssched02/Makefile.am
M    1.2  testsuites/sptests/spcbssched03/Makefile.am

diff -u rtems/testsuites/sptests/ChangeLog:1.485 rtems/testsuites/sptests/ChangeLog:1.486
--- rtems/testsuites/sptests/ChangeLog:1.485	Thu Sep 15 10:56:00 2011
+++ rtems/testsuites/sptests/ChangeLog	Thu Sep 15 10:58:46 2011
@@ -1,3 +1,8 @@
+2011-09-15	Joel Sherrill <joel.sherrill at oarcorp.com>
+
+	* spcbssched01/Makefile.am, spcbssched02/Makefile.am,
+	spcbssched03/Makefile.am: Formatting.
+
 2011-09-15	Petr Benes <benesp16 at fel.cvut.cz>
 
 	PR 1907/testing

diff -u rtems/testsuites/sptests/spcbssched01/Makefile.am:1.1 rtems/testsuites/sptests/spcbssched01/Makefile.am:1.2
--- rtems/testsuites/sptests/spcbssched01/Makefile.am:1.1	Thu Sep 15 10:56:01 2011
+++ rtems/testsuites/sptests/spcbssched01/Makefile.am	Thu Sep 15 10:58:46 2011
@@ -2,7 +2,7 @@
 ## $Id$
 ##
 
-MANAGERS = io semaphore clock
+MANAGERS = all
 
 rtems_tests_PROGRAMS = spcbssched01
 spcbssched01_SOURCES = init.c task1.c system.h

diff -u rtems/testsuites/sptests/spcbssched02/Makefile.am:1.1 rtems/testsuites/sptests/spcbssched02/Makefile.am:1.2
--- rtems/testsuites/sptests/spcbssched02/Makefile.am:1.1	Thu Sep 15 10:56:01 2011
+++ rtems/testsuites/sptests/spcbssched02/Makefile.am	Thu Sep 15 10:58:46 2011
@@ -2,7 +2,7 @@
 ## $Id$
 ##
 
-MANAGERS = io rate_monotonic semaphore clock
+MANAGERS = all
 
 rtems_tests_PROGRAMS = spcbssched02
 spcbssched02_SOURCES = init.c task_periodic.c system.h

diff -u rtems/testsuites/sptests/spcbssched03/Makefile.am:1.1 rtems/testsuites/sptests/spcbssched03/Makefile.am:1.2
--- rtems/testsuites/sptests/spcbssched03/Makefile.am:1.1	Thu Sep 15 10:56:01 2011
+++ rtems/testsuites/sptests/spcbssched03/Makefile.am	Thu Sep 15 10:58:46 2011
@@ -2,10 +2,11 @@
 ## $Id$
 ##
 
-MANAGERS = io rate_monotonic semaphore clock
+MANAGERS = all
 
 rtems_tests_PROGRAMS = spcbssched03
-spcbssched03_SOURCES = init.c tasks_periodic.c tasks_aperiodic.c system.h cbsparams.h
+spcbssched03_SOURCES = init.c tasks_periodic.c tasks_aperiodic.c system.h \
+    cbsparams.h
 
 dist_rtems_tests_DATA = spcbssched03.scn
 dist_rtems_tests_DATA += spcbssched03.doc



--

Generated by Deluxe Loginfo [http://www.codewiz.org/projects/index.html#loginfo] 2.122 by Bernardo Innocenti <bernie at develer.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/vc/attachments/20110915/862f90a0/attachment-0001.html>


More information about the vc mailing list