summaryrefslogtreecommitdiffstats
path: root/cpukit/sapi
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/sapi')
-rw-r--r--cpukit/sapi/Makefile.am1
-rw-r--r--cpukit/sapi/include/confdefs.h129
-rw-r--r--cpukit/sapi/include/rtems/scheduler.h160
-rw-r--r--cpukit/sapi/preinstall.am4
4 files changed, 236 insertions, 58 deletions
diff --git a/cpukit/sapi/Makefile.am b/cpukit/sapi/Makefile.am
index 37a2fa4228..4a2b6caf2e 100644
--- a/cpukit/sapi/Makefile.am
+++ b/cpukit/sapi/Makefile.am
@@ -17,6 +17,7 @@ include_rtems_HEADERS += include/rtems/cbs.h
include_rtems_HEADERS += include/rtems/profiling.h
include_rtems_HEADERS += include/rtems/rbheap.h
include_rtems_HEADERS += include/rtems/rbtree.h
+include_rtems_HEADERS += include/rtems/scheduler.h
include_rtems_HEADERS += include/rtems/sptables.h
include_rtems_HEADERS += include/rtems/test.h
include_rtems_HEADERS += include/rtems/timespec.h
diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h
index 53a8699aa1..959514f850 100644
--- a/cpukit/sapi/include/confdefs.h
+++ b/cpukit/sapi/include/confdefs.h
@@ -639,15 +639,10 @@ const rtems_libio_helper rtems_fs_init_helper =
*
* An application can define its own scheduling policy by defining
* CONFIGURE_SCHEDULER_USER and the following:
- * - CONFIGURE_SCHEDULER_ENTRY_POINTS
- * - CONFIGURE_MEMORY_FOR_SCHEDULER - base memory
+ * - CONFIGURE_SCHEDULER_CONTEXT
+ * - CONFIGURE_SCHEDULER_CONTROLS
* - CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER - per task memory
*/
-#include <rtems/score/scheduler.h>
-
-#if !defined(RTEMS_SMP)
- #undef CONFIGURE_SCHEDULER_SIMPLE_SMP
-#endif
/* If no scheduler is specified, the priority scheduler is default. */
#if !defined(CONFIGURE_SCHEDULER_USER) && \
@@ -665,21 +660,26 @@ const rtems_libio_helper rtems_fs_init_helper =
#endif
#endif
+#include <rtems/scheduler.h>
+
/*
* If the Priority Scheduler is selected, then configure for it.
*/
#if defined(CONFIGURE_SCHEDULER_PRIORITY)
- #include <rtems/score/schedulerpriority.h>
- #define CONFIGURE_SCHEDULER_ENTRY_POINTS SCHEDULER_PRIORITY_ENTRY_POINTS
+ #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
+ #define CONFIGURE_SCHEDULER_CONTEXT \
+ RTEMS_SCHEDULER_CONTEXT_PRIORITY( \
+ dflt, \
+ CONFIGURE_MAXIMUM_PRIORITY + 1 \
+ )
+
+ #define CONFIGURE_SCHEDULER_CONTROLS \
+ RTEMS_SCHEDULER_CONTROL_PRIORITY(dflt)
+ #endif
/**
* This defines the memory used by the priority scheduler.
*/
- #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
- _Configure_From_workspace( \
- sizeof(Scheduler_priority_Control) + \
- ((CONFIGURE_MAXIMUM_PRIORITY) * sizeof(Chain_Control)) ) \
- )
#define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER ( \
_Configure_From_workspace(sizeof(Scheduler_priority_Per_thread)) )
#endif
@@ -689,17 +689,20 @@ const rtems_libio_helper rtems_fs_init_helper =
* it.
*/
#if defined(CONFIGURE_SCHEDULER_PRIORITY_SMP)
- #include <rtems/score/schedulerprioritysmp.h>
- #define CONFIGURE_SCHEDULER_ENTRY_POINTS SCHEDULER_PRIORITY_SMP_ENTRY_POINTS
+ #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
+ #define CONFIGURE_SCHEDULER_CONTEXT \
+ RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP( \
+ dflt, \
+ CONFIGURE_MAXIMUM_PRIORITY + 1 \
+ )
+
+ #define CONFIGURE_SCHEDULER_CONTROLS \
+ RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(dflt)
+ #endif
/**
* This defines the memory used by the priority scheduler.
*/
- #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
- _Configure_From_workspace( \
- sizeof(Scheduler_priority_SMP_Control) + \
- ((CONFIGURE_MAXIMUM_PRIORITY) * sizeof(Chain_Control)) ) \
- )
#define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER ( \
_Configure_From_workspace(sizeof(Scheduler_priority_Per_thread)) )
#endif
@@ -709,17 +712,20 @@ const rtems_libio_helper rtems_fs_init_helper =
* it.
*/
#if defined(CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP)
- #include <rtems/score/schedulerpriorityaffinitysmp.h>
- #define CONFIGURE_SCHEDULER_ENTRY_POINTS SCHEDULER_PRIORITY_AFFINITY_SMP_ENTRY_POINTS
+ #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
+ #define CONFIGURE_SCHEDULER_CONTEXT \
+ RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP( \
+ dflt, \
+ CONFIGURE_MAXIMUM_PRIORITY + 1 \
+ )
+
+ #define CONFIGURE_SCHEDULER_CONTROLS \
+ RTEMS_SCHEDULER_CONTROL_PRIORITY_AFFINITY_SMP(dflt)
+ #endif
/**
* This defines the memory used by the priority scheduler.
*/
- #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
- _Configure_From_workspace( \
- sizeof(Scheduler_SMP_Control) + \
- ((CONFIGURE_MAXIMUM_PRIORITY) * sizeof(Chain_Control)) ) \
- )
#define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER ( \
_Configure_From_workspace(sizeof(Scheduler_priority_Per_thread)) )
#endif
@@ -728,15 +734,15 @@ const rtems_libio_helper rtems_fs_init_helper =
* If the Simple Priority Scheduler is selected, then configure for it.
*/
#if defined(CONFIGURE_SCHEDULER_SIMPLE)
- #include <rtems/score/schedulersimple.h>
- #define CONFIGURE_SCHEDULER_ENTRY_POINTS SCHEDULER_SIMPLE_ENTRY_POINTS
+ #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
+ #define CONFIGURE_SCHEDULER_CONTEXT RTEMS_SCHEDULER_CONTEXT_SIMPLE(dflt)
+
+ #define CONFIGURE_SCHEDULER_CONTROLS RTEMS_SCHEDULER_CONTROL_SIMPLE(dflt)
+ #endif
/**
* define the memory used by the simple scheduler
*/
- #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
- _Configure_From_workspace( sizeof( Scheduler_simple_Control ) ) \
- )
#define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER (0)
#endif
@@ -744,17 +750,19 @@ const rtems_libio_helper rtems_fs_init_helper =
* If the Simple SMP Priority Scheduler is selected, then configure for it.
*/
#if defined(CONFIGURE_SCHEDULER_SIMPLE_SMP)
- #include <rtems/score/schedulersimplesmp.h>
- #define CONFIGURE_SCHEDULER_ENTRY_POINTS SCHEDULER_SIMPLE_SMP_ENTRY_POINTS
+ #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
+ #define CONFIGURE_SCHEDULER_CONTEXT \
+ RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP(dflt)
+
+ #define CONFIGURE_SCHEDULER_CONTROLS \
+ RTEMS_SCHEDULER_CONTROL_SIMPLE_SMP(dflt)
+ #endif
/**
* Define the memory used by the Simple SMP Scheduler
*
* NOTE: This is the same as the Simple Scheduler
*/
- #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
- _Configure_From_workspace( sizeof( Scheduler_simple_SMP_Control ) ) \
- )
#define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER (0)
#endif
@@ -762,14 +770,15 @@ const rtems_libio_helper rtems_fs_init_helper =
* If the EDF Scheduler is selected, then configure for it.
*/
#if defined(CONFIGURE_SCHEDULER_EDF)
- #include <rtems/score/scheduleredf.h>
- #define CONFIGURE_SCHEDULER_ENTRY_POINTS SCHEDULER_EDF_ENTRY_POINTS
+ #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
+ #define CONFIGURE_SCHEDULER_CONTEXT RTEMS_SCHEDULER_CONTEXT_EDF(dflt)
+
+ #define CONFIGURE_SCHEDULER_CONTROLS RTEMS_SCHEDULER_CONTROL_EDF(dflt)
+ #endif
/**
* define the memory used by the EDF scheduler
*/
- #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
- _Configure_From_workspace(sizeof(Scheduler_EDF_Control)))
#define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER ( \
_Configure_From_workspace(sizeof(Scheduler_EDF_Per_thread)))
#endif
@@ -778,26 +787,27 @@ const rtems_libio_helper rtems_fs_init_helper =
* 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
+ #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
+ #define CONFIGURE_SCHEDULER_CONTEXT RTEMS_SCHEDULER_CONTEXT_CBS(dflt)
+
+ #define CONFIGURE_SCHEDULER_CONTROLS RTEMS_SCHEDULER_CONTROL_CBS(dflt)
+ #endif
#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;
+ const uint32_t _Scheduler_CBS_Maximum_servers =
+ CONFIGURE_CBS_MAXIMUM_SERVERS;
+
+ Scheduler_CBS_Server
+ _Scheduler_CBS_Server_list[ CONFIGURE_CBS_MAXIMUM_SERVERS ];
#endif
/**
* define the memory used by the CBS scheduler
*/
- #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
- _Configure_From_workspace(sizeof(Scheduler_EDF_Control)) + \
- _Configure_From_workspace(CONFIGURE_CBS_MAXIMUM_SERVERS * \
- sizeof(Scheduler_CBS_Server *)) + \
- CONFIGURE_CBS_MAXIMUM_SERVERS * \
- _Configure_From_workspace(sizeof(Scheduler_CBS_Server)))
#define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER ( \
_Configure_From_workspace(sizeof(Scheduler_CBS_Per_thread)))
#endif
@@ -807,11 +817,17 @@ const rtems_libio_helper rtems_fs_init_helper =
* this code to know which scheduler is configured by the user.
*/
#ifdef CONFIGURE_INIT
- Scheduler_Control _Scheduler = {
- NULL, /* Scheduler Specific Data Pointer */
- CONFIGURE_SCHEDULER_ENTRY_POINTS /* Scheduler Operations */
+ CONFIGURE_SCHEDULER_CONTEXT;
+
+ const Scheduler_Control _Scheduler_Table[] = {
+ CONFIGURE_SCHEDULER_CONTROLS
};
+ #if defined(RTEMS_SMP)
+ const size_t _Scheduler_Count =
+ RTEMS_ARRAY_SIZE( _Scheduler_Table );
+ #endif
+
#if defined(CONFIGURE_SCHEDULER_EDF)
const bool _Scheduler_FIXME_thread_priority_queues_are_broken = true;
#else
@@ -2207,7 +2223,6 @@ const rtems_libio_helper rtems_fs_init_helper =
*/
#define CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD \
( CONFIGURE_MEMORY_FOR_IDLE_TASK + /* IDLE and stack */ \
- CONFIGURE_MEMORY_FOR_SCHEDULER + /* Scheduler */ \
CONFIGURE_INTERRUPT_VECTOR_TABLE + /* interrupt vectors */ \
CONFIGURE_INTERRUPT_STACK_MEMORY + /* interrupt stack */ \
CONFIGURE_API_MUTEX_MEMORY /* allocation mutex */ \
@@ -2475,7 +2490,7 @@ const rtems_libio_helper rtems_fs_init_helper =
CONFIGURE_MULTIPROCESSING_TABLE, /* pointer to MP config table */
#endif
#ifdef RTEMS_SMP
- CONFIGURE_SMP_MAXIMUM_PROCESSORS
+ CONFIGURE_SMP_MAXIMUM_PROCESSORS,
#endif
};
#endif
@@ -2557,7 +2572,6 @@ const rtems_libio_helper rtems_fs_init_helper =
uint32_t INTERRUPT_VECTOR_TABLE;
uint32_t INTERRUPT_STACK_MEMORY;
uint32_t MEMORY_FOR_IDLE_TASK;
- uint32_t MEMORY_FOR_SCHEDULER;
uint32_t MEMORY_PER_TASK_FOR_SCHEDULER;
/* Classic API Pieces */
@@ -2614,7 +2628,6 @@ const rtems_libio_helper rtems_fs_init_helper =
CONFIGURE_INTERRUPT_VECTOR_TABLE,
CONFIGURE_INTERRUPT_STACK_MEMORY,
CONFIGURE_MEMORY_FOR_IDLE_TASK,
- CONFIGURE_MEMORY_FOR_SCHEDULER,
CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER,
/* Classic API Pieces */
diff --git a/cpukit/sapi/include/rtems/scheduler.h b/cpukit/sapi/include/rtems/scheduler.h
new file mode 100644
index 0000000000..5d6b2eccd2
--- /dev/null
+++ b/cpukit/sapi/include/rtems/scheduler.h
@@ -0,0 +1,160 @@
+/**
+ * @file
+ *
+ * @brief Scheduler Configuration API
+ */
+
+/*
+ * Copyright (c) 2014 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#ifndef _RTEMS_SAPI_SCHEDULER_H
+#define _RTEMS_SAPI_SCHEDULER_H
+
+#include <rtems/score/scheduler.h>
+
+#define RTEMS_SCHEDULER_CONTEXT_NAME( name ) \
+ _Configuration_Scheduler_ ## name
+
+/*
+ * This file should be only included in the context of <rtems/confdefs.h>.
+ * Define the scheduler configuration macros only in case the corresponding
+ * configure symbol is defined. This is necessary to prevent invalid workspace
+ * size estimates since we have to account for the per-thread scheduler
+ * information.
+ */
+
+#ifdef CONFIGURE_SCHEDULER_CBS
+ #include <rtems/score/schedulercbs.h>
+
+ #define RTEMS_SCHEDULER_CONTEXT_CBS_NAME( name ) \
+ RTEMS_SCHEDULER_CONTEXT_NAME( CBS_ ## name )
+
+ #define RTEMS_SCHEDULER_CONTEXT_CBS( name ) \
+ static Scheduler_EDF_Context RTEMS_SCHEDULER_CONTEXT_CBS_NAME( name )
+
+ #define RTEMS_SCHEDULER_CONTROL_CBS( name ) \
+ { \
+ &RTEMS_SCHEDULER_CONTEXT_CBS_NAME( name ).Base, \
+ SCHEDULER_CBS_ENTRY_POINTS \
+ }
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_EDF
+ #include <rtems/score/scheduleredf.h>
+
+ #define RTEMS_SCHEDULER_CONTEXT_EDF_NAME( name ) \
+ RTEMS_SCHEDULER_CONTEXT_NAME( EDF_ ## name )
+
+ #define RTEMS_SCHEDULER_CONTEXT_EDF( name ) \
+ static Scheduler_EDF_Context RTEMS_SCHEDULER_CONTEXT_EDF_NAME( name )
+
+ #define RTEMS_SCHEDULER_CONTROL_EDF( name ) \
+ { \
+ &RTEMS_SCHEDULER_CONTEXT_EDF_NAME( name ).Base, \
+ SCHEDULER_EDF_ENTRY_POINTS \
+ }
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_PRIORITY
+ #include <rtems/score/schedulerpriority.h>
+
+ #define RTEMS_SCHEDULER_CONTEXT_PRIORITY_NAME( name ) \
+ RTEMS_SCHEDULER_CONTEXT_NAME( priority_ ## name )
+
+ #define RTEMS_SCHEDULER_CONTEXT_PRIORITY( name, prio_count ) \
+ static struct { \
+ Scheduler_priority_Context Base; \
+ Chain_Control Ready[ ( prio_count ) ]; \
+ } RTEMS_SCHEDULER_CONTEXT_PRIORITY_NAME( name )
+
+ #define RTEMS_SCHEDULER_CONTROL_PRIORITY( name ) \
+ { \
+ &RTEMS_SCHEDULER_CONTEXT_PRIORITY_NAME( name ).Base.Base, \
+ SCHEDULER_PRIORITY_ENTRY_POINTS \
+ }
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP
+ #include <rtems/score/schedulerpriorityaffinitysmp.h>
+
+ #define RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP_NAME( name ) \
+ RTEMS_SCHEDULER_CONTEXT_NAME( priority_affinity_SMP_ ## name )
+
+ #define RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP( name, prio_count ) \
+ static struct { \
+ Scheduler_priority_SMP_Context Base; \
+ Chain_Control Ready[ ( prio_count ) ]; \
+ } RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP_NAME( name )
+
+ #define RTEMS_SCHEDULER_CONTROL_PRIORITY_AFFINITY_SMP( name ) \
+ { \
+ &RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP_NAME( name ).Base.Base, \
+ SCHEDULER_PRIORITY_AFFINITY_SMP_ENTRY_POINTS \
+ }
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_PRIORITY_SMP
+ #include <rtems/score/schedulerprioritysmp.h>
+
+ #define RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP_NAME( name ) \
+ RTEMS_SCHEDULER_CONTEXT_NAME( priority_SMP_ ## name )
+
+ #define RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP( name, prio_count ) \
+ static struct { \
+ Scheduler_priority_SMP_Context Base; \
+ Chain_Control Ready[ ( prio_count ) ]; \
+ } RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP_NAME( name )
+
+ #define RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP( name ) \
+ { \
+ &RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP_NAME( name ).Base.Base, \
+ SCHEDULER_PRIORITY_SMP_ENTRY_POINTS \
+ }
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_SIMPLE
+ #include <rtems/score/schedulersimple.h>
+
+ #define RTEMS_SCHEDULER_CONTEXT_SIMPLE_NAME( name ) \
+ RTEMS_SCHEDULER_CONTEXT_NAME( simple_ ## name )
+
+ #define RTEMS_SCHEDULER_CONTEXT_SIMPLE( name ) \
+ static Scheduler_simple_Context \
+ RTEMS_SCHEDULER_CONTEXT_SIMPLE_NAME( name )
+
+ #define RTEMS_SCHEDULER_CONTROL_SIMPLE( name ) \
+ { \
+ &RTEMS_SCHEDULER_CONTEXT_SIMPLE_NAME( name ).Base, \
+ SCHEDULER_SIMPLE_ENTRY_POINTS \
+ }
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_SIMPLE_SMP
+ #include <rtems/score/schedulersimplesmp.h>
+
+ #define RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP_NAME( name ) \
+ RTEMS_SCHEDULER_CONTEXT_NAME( simple_SMP_ ## name )
+
+ #define RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP( name ) \
+ static Scheduler_simple_SMP_Context \
+ RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP_NAME( name )
+
+ #define RTEMS_SCHEDULER_CONTROL_SIMPLE_SMP( name ) \
+ { \
+ &RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP_NAME( name ).Base, \
+ SCHEDULER_SIMPLE_SMP_ENTRY_POINTS \
+ }
+#endif
+
+#endif /* _RTEMS_SAPI_SCHEDULER_H */
diff --git a/cpukit/sapi/preinstall.am b/cpukit/sapi/preinstall.am
index 7e18d3ab54..57c5b972b3 100644
--- a/cpukit/sapi/preinstall.am
+++ b/cpukit/sapi/preinstall.am
@@ -84,6 +84,10 @@ $(PROJECT_INCLUDE)/rtems/rbtree.h: include/rtems/rbtree.h $(PROJECT_INCLUDE)/rte
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rbtree.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rbtree.h
+$(PROJECT_INCLUDE)/rtems/scheduler.h: include/rtems/scheduler.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/scheduler.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/scheduler.h
+
$(PROJECT_INCLUDE)/rtems/sptables.h: include/rtems/sptables.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/sptables.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/sptables.h