[PATCH v2 28/44] config: Add <rtems/confdefs/scheduler.h>

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Feb 21 10:52:40 UTC 2020


Remove all comments and copyrightable content from the moved content.
Use BSD-2-Clause license for new file.

Update #3053.
Update #3875.
---
 cpukit/headers.am                         |   1 +
 cpukit/include/rtems/confdefs.h           | 453 +-----------------------------
 cpukit/include/rtems/confdefs/scheduler.h | 370 ++++++++++++++++++++++++
 3 files changed, 372 insertions(+), 452 deletions(-)
 create mode 100644 cpukit/include/rtems/confdefs/scheduler.h

diff --git a/cpukit/headers.am b/cpukit/headers.am
index f64e9867ff..2cb59165bf 100644
--- a/cpukit/headers.am
+++ b/cpukit/headers.am
@@ -188,6 +188,7 @@ include_rtems_confdefs_HEADERS += include/rtems/confdefs/libio.h
 include_rtems_confdefs_HEADERS += include/rtems/confdefs/libpci.h
 include_rtems_confdefs_HEADERS += include/rtems/confdefs/obsolete.h
 include_rtems_confdefs_HEADERS += include/rtems/confdefs/percpu.h
+include_rtems_confdefs_HEADERS += include/rtems/confdefs/scheduler.h
 include_rtems_debugger_HEADERS += include/rtems/debugger/rtems-debugger-bsp.h
 include_rtems_debugger_HEADERS += include/rtems/debugger/rtems-debugger-remote.h
 include_rtems_debugger_HEADERS += include/rtems/debugger/rtems-debugger-server.h
diff --git a/cpukit/include/rtems/confdefs.h b/cpukit/include/rtems/confdefs.h
index a51693834b..ba37f0abe7 100644
--- a/cpukit/include/rtems/confdefs.h
+++ b/cpukit/include/rtems/confdefs.h
@@ -53,6 +53,7 @@
 #include <rtems/confdefs/libio.h>
 #include <rtems/confdefs/libpci.h>
 #include <rtems/confdefs/percpu.h>
+#include <rtems/confdefs/scheduler.h>
 
 #include <limits.h>
 
@@ -101,441 +102,6 @@ extern "C" {
   #undef RTEMS_NEWLIB
 #endif
 
-/**
- * @brief Maximum priority configuration.
- *
- * This configures the maximum priority value that
- * a task may have.
- *
- * The following applies to the data space requirements
- * of the Priority Scheduler.
- *
- * By reducing the number of priorities in a system,
- * the amount of RAM required by RTEMS can be significantly
- * reduced.  RTEMS allocates a Chain_Control structure per
- * priority and this structure contains 3 pointers.  So
- * the default is (256 * 12) = 3K on 32-bit architectures.
- *
- * This must be one less than a power of 2 between
- * 4 and 256.  Valid values along with the application
- * priority levels and memory saved when pointers are
- * 32-bits in size are:
- *
- *   + 3,  2 application priorities, 3024 bytes saved
- *   + 7, 5 application priorities, 2976 bytes saved
- *   + 15, 13 application priorities, 2880 bytes saved
- *   + 31, 29 application priorities, 2688 bytes saved
- *   + 63, 61 application priorities, 2304 bytes saved
- *   + 127, 125 application priorities, 1536 bytes saved
- *   + 255, 253 application priorities, 0 bytes saved
- *
- * It is specified in terms of Classic API priority values.
- */
-#ifndef CONFIGURE_MAXIMUM_PRIORITY
-  #define CONFIGURE_MAXIMUM_PRIORITY PRIORITY_DEFAULT_MAXIMUM
-#endif
-
-/**
- *  @defgroup ConfigScheduler Scheduler configuration
- *
- *  @ingroup Configuration
- *
- * The scheduler configuration allows an application to select the
- * scheduling policy to use.  The supported configurations are:
- *
- *  - CONFIGURE_SCHEDULER_PRIORITY - Deterministic Priority Scheduler
- *  - CONFIGURE_SCHEDULER_PRIORITY_SMP - Deterministic Priority SMP Scheduler
- *  - CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP - Deterministic
- *    Priority SMP Affinity Scheduler
- *  - CONFIGURE_SCHEDULER_STRONG_APA - Strong APA Scheduler
- *  - CONFIGURE_SCHEDULER_SIMPLE - Light-weight Priority Scheduler
- *  - CONFIGURE_SCHEDULER_SIMPLE_SMP - Simple SMP Priority Scheduler
- *  - CONFIGURE_SCHEDULER_EDF - EDF Scheduler
- *  - CONFIGURE_SCHEDULER_EDF_SMP - EDF SMP Scheduler
- *  - CONFIGURE_SCHEDULER_CBS - CBS Scheduler
- *  - CONFIGURE_SCHEDULER_USER  - user provided scheduler
- *
- * If no configuration is specified by the application in a uniprocessor
- * configuration, then CONFIGURE_SCHEDULER_PRIORITY is the default.
- *
- * If no configuration is specified by the application in SMP
- * configuration, then CONFIGURE_SCHEDULER_PRIORITY_SMP is the default.
- *
- * An application can define its own scheduling policy by defining
- * CONFIGURE_SCHEDULER_USER and the following:
- *
- *    - CONFIGURE_SCHEDULER
- *    - CONFIGURE_SCHEDULER_TABLE_ENTRIES
- *    - CONFIGURE_SCHEDULER_USER_PER_THREAD
- */
-
-#if !defined(CONFIGURE_SCHEDULER_USER) && \
-    !defined(CONFIGURE_SCHEDULER_PRIORITY) && \
-    !defined(CONFIGURE_SCHEDULER_PRIORITY_SMP) && \
-    !defined(CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP) && \
-    !defined(CONFIGURE_SCHEDULER_STRONG_APA) && \
-    !defined(CONFIGURE_SCHEDULER_SIMPLE) && \
-    !defined(CONFIGURE_SCHEDULER_SIMPLE_SMP) && \
-    !defined(CONFIGURE_SCHEDULER_EDF) && \
-    !defined(CONFIGURE_SCHEDULER_EDF_SMP) && \
-    !defined(CONFIGURE_SCHEDULER_CBS)
-  #if defined(RTEMS_SMP) && _CONFIGURE_MAXIMUM_PROCESSORS > 1
-    /**
-     * If no scheduler is specified in an SMP configuration, the
-     * EDF scheduler is default.
-     */
-    #define CONFIGURE_SCHEDULER_EDF_SMP
-  #else
-    /**
-     * If no scheduler is specified in a uniprocessor configuration, the
-     * priority scheduler is default.
-     */
-    #define CONFIGURE_SCHEDULER_PRIORITY
-  #endif
-#endif
-
-#include <rtems/scheduler.h>
-
-/*
- * If the Priority Scheduler is selected, then configure for it.
- */
-#if defined(CONFIGURE_SCHEDULER_PRIORITY)
-  #if !defined(CONFIGURE_SCHEDULER_NAME)
-    /** Configure the name of the scheduler instance */
-    #define CONFIGURE_SCHEDULER_NAME rtems_build_name('U', 'P', 'D', ' ')
-  #endif
-
-  #if !defined(CONFIGURE_SCHEDULER_TABLE_ENTRIES)
-    /** Configure the context needed by the scheduler instance */
-    #define CONFIGURE_SCHEDULER \
-      RTEMS_SCHEDULER_PRIORITY( \
-        dflt, \
-        CONFIGURE_MAXIMUM_PRIORITY + 1 \
-      )
-
-    /** Configure the controls for this scheduler instance */
-    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
-      RTEMS_SCHEDULER_TABLE_PRIORITY(dflt, CONFIGURE_SCHEDULER_NAME)
-  #endif
-#endif
-
-/*
- * If the Deterministic Priority SMP Scheduler is selected, then configure for
- * it.
- */
-#if defined(CONFIGURE_SCHEDULER_PRIORITY_SMP)
-  #if !defined(CONFIGURE_SCHEDULER_NAME)
-    /** Configure the name of the scheduler instance */
-    #define CONFIGURE_SCHEDULER_NAME rtems_build_name('M', 'P', 'D', ' ')
-  #endif
-
-  #if !defined(CONFIGURE_SCHEDULER_TABLE_ENTRIES)
-    /** Configure the context needed by the scheduler instance */
-    #define CONFIGURE_SCHEDULER \
-      RTEMS_SCHEDULER_PRIORITY_SMP( \
-        dflt, \
-        CONFIGURE_MAXIMUM_PRIORITY + 1 \
-      )
-
-    /** Configure the controls for this scheduler instance */
-    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
-      RTEMS_SCHEDULER_TABLE_PRIORITY_SMP(dflt, CONFIGURE_SCHEDULER_NAME)
-  #endif
-#endif
-
-/*
- * If the Deterministic Priority Affinity SMP Scheduler is selected, then configure for
- * it.
- */
-#if defined(CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP)
-  #if !defined(CONFIGURE_SCHEDULER_NAME)
-    /** Configure the name of the scheduler instance */
-    #define CONFIGURE_SCHEDULER_NAME rtems_build_name('M', 'P', 'A', ' ')
-  #endif
-
-  #if !defined(CONFIGURE_SCHEDULER_TABLE_ENTRIES)
-    /** Configure the context needed by the scheduler instance */
-    #define CONFIGURE_SCHEDULER \
-      RTEMS_SCHEDULER_PRIORITY_AFFINITY_SMP( \
-        dflt, \
-        CONFIGURE_MAXIMUM_PRIORITY + 1 \
-      )
-
-    /** Configure the controls for this scheduler instance */
-    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
-      RTEMS_SCHEDULER_TABLE_PRIORITY_AFFINITY_SMP( \
-        dflt, \
-        CONFIGURE_SCHEDULER_NAME \
-      )
-  #endif
-#endif
-
-/*
- * If the Strong APA Scheduler is selected, then configure for
- * it.
- */
-#if defined(CONFIGURE_SCHEDULER_STRONG_APA)
-  #if !defined(CONFIGURE_SCHEDULER_NAME)
-    /** Configure the name of the scheduler instance */
-    #define CONFIGURE_SCHEDULER_NAME rtems_build_name('M', 'A', 'P', 'A')
-  #endif
-
-  #if !defined(CONFIGURE_SCHEDULER_TABLE_ENTRIES)
-    /** Configure the context needed by the scheduler instance */
-    #define CONFIGURE_SCHEDULER \
-      RTEMS_SCHEDULER_STRONG_APA( \
-        dflt, \
-        CONFIGURE_MAXIMUM_PRIORITY + 1 \
-      )
-
-    /** Configure the controls for this scheduler instance */
-    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
-      RTEMS_SCHEDULER_TABLE_STRONG_APA(dflt, CONFIGURE_SCHEDULER_NAME)
-  #endif
-#endif
-
-/*
- * If the Simple Priority Scheduler is selected, then configure for it.
- */
-#if defined(CONFIGURE_SCHEDULER_SIMPLE)
-  #if !defined(CONFIGURE_SCHEDULER_NAME)
-    /** Configure the name of the scheduler instance */
-    #define CONFIGURE_SCHEDULER_NAME rtems_build_name('U', 'P', 'S', ' ')
-  #endif
-
-  #if !defined(CONFIGURE_SCHEDULER_TABLE_ENTRIES)
-    /** Configure the context needed by the scheduler instance */
-    #define CONFIGURE_SCHEDULER RTEMS_SCHEDULER_SIMPLE(dflt)
-
-    /** Configure the controls for this scheduler instance */
-    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
-      RTEMS_SCHEDULER_TABLE_SIMPLE(dflt, CONFIGURE_SCHEDULER_NAME)
-  #endif
-#endif
-
-/*
- * If the Simple SMP Priority Scheduler is selected, then configure for it.
- */
-#if defined(CONFIGURE_SCHEDULER_SIMPLE_SMP)
-  #if !defined(CONFIGURE_SCHEDULER_NAME)
-    /** Configure the name of the scheduler instance */
-    #define CONFIGURE_SCHEDULER_NAME rtems_build_name('M', 'P', 'S', ' ')
-  #endif
-
-  #if !defined(CONFIGURE_SCHEDULER_TABLE_ENTRIES)
-    /** Configure the context needed by the scheduler instance */
-    #define CONFIGURE_SCHEDULER \
-      RTEMS_SCHEDULER_SIMPLE_SMP(dflt)
-
-    /** Configure the controls for this scheduler instance */
-    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
-      RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(dflt, CONFIGURE_SCHEDULER_NAME)
-  #endif
-#endif
-
-/*
- * If the EDF Scheduler is selected, then configure for it.
- */
-#if defined(CONFIGURE_SCHEDULER_EDF)
-  #if !defined(CONFIGURE_SCHEDULER_NAME)
-    /** Configure the name of the scheduler instance */
-    #define CONFIGURE_SCHEDULER_NAME rtems_build_name('U', 'E', 'D', 'F')
-  #endif
-
-  #if !defined(CONFIGURE_SCHEDULER_TABLE_ENTRIES)
-    /** Configure the context needed by the scheduler instance */
-    #define CONFIGURE_SCHEDULER RTEMS_SCHEDULER_EDF(dflt)
-
-    /** Configure the controls for this scheduler instance */
-    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
-      RTEMS_SCHEDULER_TABLE_EDF(dflt, CONFIGURE_SCHEDULER_NAME)
-  #endif
-#endif
-
-/*
- * If the EDF SMP Scheduler is selected, then configure for it.
- */
-#if defined(CONFIGURE_SCHEDULER_EDF_SMP)
-  #if !defined(CONFIGURE_SCHEDULER_NAME)
-    /** Configure the name of the scheduler instance */
-    #define CONFIGURE_SCHEDULER_NAME rtems_build_name('M', 'E', 'D', 'F')
-  #endif
-
-  #if !defined(CONFIGURE_SCHEDULER_TABLE_ENTRIES)
-    /** Configure the context needed by the scheduler instance */
-    #define CONFIGURE_SCHEDULER RTEMS_SCHEDULER_EDF_SMP(dflt)
-
-    /** Configure the controls for this scheduler instance */
-    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
-      RTEMS_SCHEDULER_TABLE_EDF_SMP(dflt, CONFIGURE_SCHEDULER_NAME)
-  #endif
-#endif
-
-/*
- * If the CBS Scheduler is selected, then configure for it.
- */
-#if defined(CONFIGURE_SCHEDULER_CBS)
-  #if !defined(CONFIGURE_SCHEDULER_NAME)
-    /** Configure the name of the scheduler instance */
-    #define CONFIGURE_SCHEDULER_NAME rtems_build_name('U', 'C', 'B', 'S')
-  #endif
-
-  #if !defined(CONFIGURE_SCHEDULER_TABLE_ENTRIES)
-    /** Configure the context needed by the scheduler instance */
-    #define CONFIGURE_SCHEDULER RTEMS_SCHEDULER_CBS(dflt)
-
-    /** Configure the controls for this scheduler instance */
-    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
-      RTEMS_SCHEDULER_TABLE_CBS(dflt, CONFIGURE_SCHEDULER_NAME)
-  #endif
-
-  #ifndef CONFIGURE_CBS_MAXIMUM_SERVERS
-    #define CONFIGURE_CBS_MAXIMUM_SERVERS CONFIGURE_MAXIMUM_TASKS
-  #endif
-
-  #ifdef CONFIGURE_INIT
-    const uint32_t _Scheduler_CBS_Maximum_servers =
-      CONFIGURE_CBS_MAXIMUM_SERVERS;
-
-    Scheduler_CBS_Server
-      _Scheduler_CBS_Server_list[ CONFIGURE_CBS_MAXIMUM_SERVERS ];
-  #endif
-#endif
-
-/*
- * Set up the scheduler entry points table.  The scheduling code uses
- * this code to know which scheduler is configured by the user.
- */
-#ifdef CONFIGURE_INIT
-  #if defined(CONFIGURE_SCHEDULER)
-    CONFIGURE_SCHEDULER;
-  #endif
-
-  const Scheduler_Control _Scheduler_Table[] = {
-    CONFIGURE_SCHEDULER_TABLE_ENTRIES
-  };
-
-  #define _CONFIGURE_SCHEDULER_COUNT RTEMS_ARRAY_SIZE( _Scheduler_Table )
-
-  #if defined(RTEMS_SMP)
-    const size_t _Scheduler_Count = _CONFIGURE_SCHEDULER_COUNT;
-
-    const Scheduler_Assignment _Scheduler_Initial_assignments[] = {
-      #if defined(CONFIGURE_SCHEDULER_ASSIGNMENTS)
-        CONFIGURE_SCHEDULER_ASSIGNMENTS
-      #else
-        #define _CONFIGURE_SCHEDULER_ASSIGN \
-          RTEMS_SCHEDULER_ASSIGN( \
-            0, \
-            RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL \
-          )
-        _CONFIGURE_SCHEDULER_ASSIGN
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 2
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 3
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 4
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 5
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 6
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 7
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 8
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 9
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 10
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 11
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 12
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 13
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 14
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 15
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 16
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 17
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 18
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 19
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 20
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 21
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 22
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 23
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 24
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 25
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 26
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 27
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 28
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 29
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 30
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 31
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #if _CONFIGURE_MAXIMUM_PROCESSORS >= 32
-          , _CONFIGURE_SCHEDULER_ASSIGN
-        #endif
-        #undef _CONFIGURE_SCHEDULER_ASSIGN
-      #endif
-    };
-
-    RTEMS_STATIC_ASSERT(
-      _CONFIGURE_MAXIMUM_PROCESSORS
-        == RTEMS_ARRAY_SIZE( _Scheduler_Initial_assignments ),
-      _Scheduler_Initial_assignments
-    );
-  #endif
-#endif
-/**@}*/ /* end of Scheduler Configuration */
-
 /**
  * @defgroup ConfigurationMalloc RTEMS Malloc configuration
  *
@@ -2129,23 +1695,6 @@ struct _reent *__getreent(void)
 #endif
 #endif   /* !defined(RTEMS_SCHEDSIM) */
 
-/*
- *  Validate the configured maximum priority
- */
-#if ((CONFIGURE_MAXIMUM_PRIORITY != 3) && \
-     (CONFIGURE_MAXIMUM_PRIORITY != 7) && \
-     (CONFIGURE_MAXIMUM_PRIORITY != 15) && \
-     (CONFIGURE_MAXIMUM_PRIORITY != 31) && \
-     (CONFIGURE_MAXIMUM_PRIORITY != 63) && \
-     (CONFIGURE_MAXIMUM_PRIORITY != 127) && \
-     (CONFIGURE_MAXIMUM_PRIORITY != 255))
-  #error "Maximum priority is not 1 less than a power of 2 between 4 and 256"
-#endif
-
-#if (CONFIGURE_MAXIMUM_PRIORITY > PRIORITY_DEFAULT_MAXIMUM)
-  #error "Maximum priority configured higher than supported by target."
-#endif
-
 /*
  * POSIX Key pair shouldn't be less than POSIX Key, which is highly
  * likely to be error.
diff --git a/cpukit/include/rtems/confdefs/scheduler.h b/cpukit/include/rtems/confdefs/scheduler.h
new file mode 100644
index 0000000000..12f7c631fa
--- /dev/null
+++ b/cpukit/include/rtems/confdefs/scheduler.h
@@ -0,0 +1,370 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSApplicationConfiguration
+ *
+ * @brief Evaluate Scheduler Configuration Options
+ */
+
+#ifndef _RTEMS_CONFDEFS_SCHEDULER_H
+#define _RTEMS_CONFDEFS_SCHEDULER_H
+
+#ifndef __CONFIGURATION_TEMPLATE_h
+#error "Do not include this file directly, use <rtems/confdefs.h> instead"
+#endif
+
+#ifdef CONFIGURE_INIT
+
+#include <rtems/confdefs/percpu.h>
+
+#if !defined(CONFIGURE_SCHEDULER_CBS) \
+  && !defined(CONFIGURE_SCHEDULER_EDF) \
+  && !defined(CONFIGURE_SCHEDULER_EDF_SMP) \
+  && !defined(CONFIGURE_SCHEDULER_PRIORITY) \
+  && !defined(CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP) \
+  && !defined(CONFIGURE_SCHEDULER_PRIORITY_SMP) \
+  && !defined(CONFIGURE_SCHEDULER_SIMPLE) \
+  && !defined(CONFIGURE_SCHEDULER_SIMPLE_SMP) \
+  && !defined(CONFIGURE_SCHEDULER_STRONG_APA) \
+  && !defined(CONFIGURE_SCHEDULER_USER)
+  #if defined(RTEMS_SMP) && _CONFIGURE_MAXIMUM_PROCESSORS > 1
+    #define CONFIGURE_SCHEDULER_EDF_SMP
+  #else
+    #define CONFIGURE_SCHEDULER_PRIORITY
+  #endif
+#endif
+
+#include <rtems/scheduler.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_PRIORITY
+  #define CONFIGURE_MAXIMUM_PRIORITY PRIORITY_DEFAULT_MAXIMUM
+#endif
+
+#if CONFIGURE_MAXIMUM_PRIORITY != 3 \
+  && CONFIGURE_MAXIMUM_PRIORITY != 7 \
+  && CONFIGURE_MAXIMUM_PRIORITY != 15 \
+  && CONFIGURE_MAXIMUM_PRIORITY != 31 \
+  && CONFIGURE_MAXIMUM_PRIORITY != 63 \
+  && CONFIGURE_MAXIMUM_PRIORITY != 127 \
+  && CONFIGURE_MAXIMUM_PRIORITY != 255
+  #error "CONFIGURE_MAXIMUM_PRIORITY must be one of 3, 7, 15, 31, 63, 127, and 255"
+#endif
+
+#if CONFIGURE_MAXIMUM_PRIORITY > PRIORITY_DEFAULT_MAXIMUM
+  #error "CONFIGURE_SCHEDULER_PRIORITY must be less than or equal to the architecture defined maximum priority"
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_PRIORITY
+  #ifndef CONFIGURE_SCHEDULER_NAME
+    #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'U', 'P', 'D', ' ' )
+  #endif
+
+  #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
+    #define CONFIGURE_SCHEDULER \
+      RTEMS_SCHEDULER_PRIORITY( \
+        dflt, \
+        CONFIGURE_MAXIMUM_PRIORITY + 1 \
+      )
+
+    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
+      RTEMS_SCHEDULER_TABLE_PRIORITY( dflt, CONFIGURE_SCHEDULER_NAME )
+  #endif
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_PRIORITY_SMP
+  #ifndef CONFIGURE_SCHEDULER_NAME
+    #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'M', 'P', 'D', ' ' )
+  #endif
+
+  #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
+    #define CONFIGURE_SCHEDULER \
+      RTEMS_SCHEDULER_PRIORITY_SMP( \
+        dflt, \
+        CONFIGURE_MAXIMUM_PRIORITY + 1 \
+      )
+
+    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
+      RTEMS_SCHEDULER_TABLE_PRIORITY_SMP( dflt, CONFIGURE_SCHEDULER_NAME )
+  #endif
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP
+  #ifndef CONFIGURE_SCHEDULER_NAME
+    #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'M', 'P', 'A', ' ' )
+  #endif
+
+  #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
+    #define CONFIGURE_SCHEDULER \
+      RTEMS_SCHEDULER_PRIORITY_AFFINITY_SMP( \
+        dflt, \
+        CONFIGURE_MAXIMUM_PRIORITY + 1 \
+      )
+
+    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
+      RTEMS_SCHEDULER_TABLE_PRIORITY_AFFINITY_SMP( \
+        dflt, \
+        CONFIGURE_SCHEDULER_NAME \
+      )
+  #endif
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_STRONG_APA
+  #ifndef CONFIGURE_SCHEDULER_NAME
+    #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'M', 'A', 'P', 'A' )
+  #endif
+
+  #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
+    #define CONFIGURE_SCHEDULER \
+      RTEMS_SCHEDULER_STRONG_APA( \
+        dflt, \
+        CONFIGURE_MAXIMUM_PRIORITY + 1 \
+      )
+
+    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
+      RTEMS_SCHEDULER_TABLE_STRONG_APA( dflt, CONFIGURE_SCHEDULER_NAME )
+  #endif
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_SIMPLE
+  #ifndef CONFIGURE_SCHEDULER_NAME
+    #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'U', 'P', 'S', ' ' )
+  #endif
+
+  #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
+    #define CONFIGURE_SCHEDULER RTEMS_SCHEDULER_SIMPLE( dflt )
+
+    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
+      RTEMS_SCHEDULER_TABLE_SIMPLE( dflt, CONFIGURE_SCHEDULER_NAME )
+  #endif
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_SIMPLE_SMP
+  #ifndef CONFIGURE_SCHEDULER_NAME
+    #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'M', 'P', 'S', ' ' )
+  #endif
+
+  #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
+    #define CONFIGURE_SCHEDULER \
+      RTEMS_SCHEDULER_SIMPLE_SMP( dflt )
+
+    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
+      RTEMS_SCHEDULER_TABLE_SIMPLE_SMP( dflt, CONFIGURE_SCHEDULER_NAME )
+  #endif
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_EDF
+  #ifndef CONFIGURE_SCHEDULER_NAME
+    #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'U', 'E', 'D', 'F' )
+  #endif
+
+  #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
+    #define CONFIGURE_SCHEDULER RTEMS_SCHEDULER_EDF( dflt )
+
+    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
+      RTEMS_SCHEDULER_TABLE_EDF( dflt, CONFIGURE_SCHEDULER_NAME )
+  #endif
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_EDF_SMP
+  #ifndef CONFIGURE_SCHEDULER_NAME
+    #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'M', 'E', 'D', 'F' )
+  #endif
+
+  #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
+    #define CONFIGURE_SCHEDULER RTEMS_SCHEDULER_EDF_SMP( dflt )
+
+    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
+      RTEMS_SCHEDULER_TABLE_EDF_SMP( dflt, CONFIGURE_SCHEDULER_NAME )
+  #endif
+#endif
+
+#ifdef CONFIGURE_SCHEDULER_CBS
+  #ifndef CONFIGURE_SCHEDULER_NAME
+    #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'U', 'C', 'B', 'S' )
+  #endif
+
+  #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
+    #define CONFIGURE_SCHEDULER RTEMS_SCHEDULER_CBS( dflt )
+
+    #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
+      RTEMS_SCHEDULER_TABLE_CBS( dflt, CONFIGURE_SCHEDULER_NAME )
+  #endif
+
+  #ifndef CONFIGURE_CBS_MAXIMUM_SERVERS
+    #define CONFIGURE_CBS_MAXIMUM_SERVERS CONFIGURE_MAXIMUM_TASKS
+  #endif
+
+  const uint32_t _Scheduler_CBS_Maximum_servers =
+    CONFIGURE_CBS_MAXIMUM_SERVERS;
+
+  Scheduler_CBS_Server
+    _Scheduler_CBS_Server_list[ CONFIGURE_CBS_MAXIMUM_SERVERS ];
+#endif
+
+#ifdef CONFIGURE_SCHEDULER
+  CONFIGURE_SCHEDULER;
+#endif
+
+const Scheduler_Control _Scheduler_Table[] = {
+  CONFIGURE_SCHEDULER_TABLE_ENTRIES
+};
+
+#define _CONFIGURE_SCHEDULER_COUNT RTEMS_ARRAY_SIZE( _Scheduler_Table )
+
+#ifdef RTEMS_SMP
+
+const size_t _Scheduler_Count = _CONFIGURE_SCHEDULER_COUNT;
+
+const Scheduler_Assignment _Scheduler_Initial_assignments[] = {
+  #ifdef CONFIGURE_SCHEDULER_ASSIGNMENTS
+    CONFIGURE_SCHEDULER_ASSIGNMENTS
+  #else
+    #define _CONFIGURE_SCHEDULER_ASSIGN \
+      RTEMS_SCHEDULER_ASSIGN( \
+        0, \
+        RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL \
+      )
+    _CONFIGURE_SCHEDULER_ASSIGN
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 2
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 3
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 4
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 5
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 6
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 7
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 8
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 9
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 10
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 11
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 12
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 13
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 14
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 15
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 16
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 17
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 18
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 19
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 20
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 21
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 22
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 23
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 24
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 25
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 26
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 27
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 28
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 29
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 30
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 31
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #if _CONFIGURE_MAXIMUM_PROCESSORS >= 32
+      , _CONFIGURE_SCHEDULER_ASSIGN
+    #endif
+    #undef _CONFIGURE_SCHEDULER_ASSIGN
+  #endif
+};
+
+RTEMS_STATIC_ASSERT(
+  _CONFIGURE_MAXIMUM_PROCESSORS
+    == RTEMS_ARRAY_SIZE( _Scheduler_Initial_assignments ),
+  _Scheduler_Initial_assignments
+);
+
+#endif /* RTEMS_SMP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CONFIGURE_INIT */
+
+#endif /* _RTEMS_CONFDEFS_SCHEDULER_H */
-- 
2.16.4



More information about the devel mailing list