Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:12

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup RTEMSImplApplConfig
0007  *
0008  * @brief This header file evaluates configuration options related to the
0009  *   scheduler configuration.
0010  */
0011 
0012 /*
0013  * Copyright (C) 2020 embedded brains GmbH & Co. KG
0014  *
0015  * Redistribution and use in source and binary forms, with or without
0016  * modification, are permitted provided that the following conditions
0017  * are met:
0018  * 1. Redistributions of source code must retain the above copyright
0019  *    notice, this list of conditions and the following disclaimer.
0020  * 2. Redistributions in binary form must reproduce the above copyright
0021  *    notice, this list of conditions and the following disclaimer in the
0022  *    documentation and/or other materials provided with the distribution.
0023  *
0024  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0025  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0026  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0027  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0028  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0029  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0030  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0031  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0032  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0033  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0034  * POSSIBILITY OF SUCH DAMAGE.
0035  */
0036 
0037 #ifndef _RTEMS_CONFDEFS_SCHEDULER_H
0038 #define _RTEMS_CONFDEFS_SCHEDULER_H
0039 
0040 #ifndef __CONFIGURATION_TEMPLATE_h
0041 #error "Do not include this file directly, use <rtems/confdefs.h> instead"
0042 #endif
0043 
0044 #ifdef CONFIGURE_INIT
0045 
0046 #include <rtems/confdefs/percpu.h>
0047 
0048 #if !defined(CONFIGURE_SCHEDULER_CBS) \
0049   && !defined(CONFIGURE_SCHEDULER_EDF) \
0050   && !defined(CONFIGURE_SCHEDULER_EDF_SMP) \
0051   && !defined(CONFIGURE_SCHEDULER_PRIORITY) \
0052   && !defined(CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP) \
0053   && !defined(CONFIGURE_SCHEDULER_PRIORITY_SMP) \
0054   && !defined(CONFIGURE_SCHEDULER_SIMPLE) \
0055   && !defined(CONFIGURE_SCHEDULER_SIMPLE_SMP) \
0056   && !defined(CONFIGURE_SCHEDULER_STRONG_APA) \
0057   && !defined(CONFIGURE_SCHEDULER_USER)
0058   #if defined(RTEMS_SMP) && _CONFIGURE_MAXIMUM_PROCESSORS > 1
0059     #define CONFIGURE_SCHEDULER_EDF_SMP
0060   #else
0061     #define CONFIGURE_SCHEDULER_PRIORITY
0062   #endif
0063 #endif
0064 
0065 #include <rtems/scheduler.h>
0066 
0067 #ifdef __cplusplus
0068 extern "C" {
0069 #endif
0070 
0071 #ifndef CONFIGURE_MAXIMUM_PRIORITY
0072   #define CONFIGURE_MAXIMUM_PRIORITY PRIORITY_DEFAULT_MAXIMUM
0073 #endif
0074 
0075 #if CONFIGURE_MAXIMUM_PRIORITY != 3 \
0076   && CONFIGURE_MAXIMUM_PRIORITY != 7 \
0077   && CONFIGURE_MAXIMUM_PRIORITY != 15 \
0078   && CONFIGURE_MAXIMUM_PRIORITY != 31 \
0079   && CONFIGURE_MAXIMUM_PRIORITY != 63 \
0080   && CONFIGURE_MAXIMUM_PRIORITY != 127 \
0081   && CONFIGURE_MAXIMUM_PRIORITY != 255
0082   #error "CONFIGURE_MAXIMUM_PRIORITY must be one of 3, 7, 15, 31, 63, 127, and 255"
0083 #endif
0084 
0085 #if CONFIGURE_MAXIMUM_PRIORITY > PRIORITY_DEFAULT_MAXIMUM
0086   #error "CONFIGURE_SCHEDULER_PRIORITY must be less than or equal to the architecture defined maximum priority"
0087 #endif
0088 
0089 #ifdef CONFIGURE_SCHEDULER_PRIORITY
0090   #ifndef CONFIGURE_SCHEDULER_NAME
0091     #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'U', 'P', 'D', ' ' )
0092   #endif
0093 
0094   #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
0095     #define CONFIGURE_SCHEDULER \
0096       RTEMS_SCHEDULER_PRIORITY( \
0097         dflt, \
0098         CONFIGURE_MAXIMUM_PRIORITY + 1 \
0099       )
0100 
0101     #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
0102       RTEMS_SCHEDULER_TABLE_PRIORITY( dflt, CONFIGURE_SCHEDULER_NAME )
0103   #endif
0104 #endif
0105 
0106 #ifdef CONFIGURE_SCHEDULER_PRIORITY_SMP
0107   #ifndef CONFIGURE_SCHEDULER_NAME
0108     #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'M', 'P', 'D', ' ' )
0109   #endif
0110 
0111   #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
0112     #define CONFIGURE_SCHEDULER \
0113       RTEMS_SCHEDULER_PRIORITY_SMP( \
0114         dflt, \
0115         CONFIGURE_MAXIMUM_PRIORITY + 1 \
0116       )
0117 
0118     #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
0119       RTEMS_SCHEDULER_TABLE_PRIORITY_SMP( dflt, CONFIGURE_SCHEDULER_NAME )
0120   #endif
0121 #endif
0122 
0123 #ifdef CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP
0124   #ifndef CONFIGURE_SCHEDULER_NAME
0125     #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'M', 'P', 'A', ' ' )
0126   #endif
0127 
0128   #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
0129     #define CONFIGURE_SCHEDULER \
0130       RTEMS_SCHEDULER_PRIORITY_AFFINITY_SMP( \
0131         dflt, \
0132         CONFIGURE_MAXIMUM_PRIORITY + 1 \
0133       )
0134 
0135     #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
0136       RTEMS_SCHEDULER_TABLE_PRIORITY_AFFINITY_SMP( \
0137         dflt, \
0138         CONFIGURE_SCHEDULER_NAME \
0139       )
0140   #endif
0141 #endif
0142 
0143 #ifdef CONFIGURE_SCHEDULER_STRONG_APA
0144   #ifndef CONFIGURE_SCHEDULER_NAME
0145     #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'M', 'A', 'P', 'A' )
0146   #endif
0147 
0148   #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
0149     #define CONFIGURE_SCHEDULER \
0150       RTEMS_SCHEDULER_STRONG_APA( \
0151         dflt, \
0152         CONFIGURE_MAXIMUM_PRIORITY + 1 \
0153       )
0154 
0155     #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
0156       RTEMS_SCHEDULER_TABLE_STRONG_APA( dflt, CONFIGURE_SCHEDULER_NAME )
0157   #endif
0158 #endif
0159 
0160 #ifdef CONFIGURE_SCHEDULER_SIMPLE
0161   #ifndef CONFIGURE_SCHEDULER_NAME
0162     #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'U', 'P', 'S', ' ' )
0163   #endif
0164 
0165   #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
0166     #define CONFIGURE_SCHEDULER RTEMS_SCHEDULER_SIMPLE( dflt )
0167 
0168     #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
0169       RTEMS_SCHEDULER_TABLE_SIMPLE( dflt, CONFIGURE_SCHEDULER_NAME )
0170   #endif
0171 #endif
0172 
0173 #ifdef CONFIGURE_SCHEDULER_SIMPLE_SMP
0174   #ifndef CONFIGURE_SCHEDULER_NAME
0175     #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'M', 'P', 'S', ' ' )
0176   #endif
0177 
0178   #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
0179     #define CONFIGURE_SCHEDULER \
0180       RTEMS_SCHEDULER_SIMPLE_SMP( dflt )
0181 
0182     #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
0183       RTEMS_SCHEDULER_TABLE_SIMPLE_SMP( dflt, CONFIGURE_SCHEDULER_NAME )
0184   #endif
0185 #endif
0186 
0187 #ifdef CONFIGURE_SCHEDULER_EDF
0188   #ifndef CONFIGURE_SCHEDULER_NAME
0189     #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'U', 'E', 'D', 'F' )
0190   #endif
0191 
0192   #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
0193     #define CONFIGURE_SCHEDULER RTEMS_SCHEDULER_EDF( dflt )
0194 
0195     #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
0196       RTEMS_SCHEDULER_TABLE_EDF( dflt, CONFIGURE_SCHEDULER_NAME )
0197   #endif
0198 #endif
0199 
0200 #ifdef CONFIGURE_SCHEDULER_EDF_SMP
0201   #ifndef CONFIGURE_SCHEDULER_NAME
0202     #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'M', 'E', 'D', 'F' )
0203   #endif
0204 
0205   #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
0206     #define CONFIGURE_SCHEDULER RTEMS_SCHEDULER_EDF_SMP( dflt )
0207 
0208     #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
0209       RTEMS_SCHEDULER_TABLE_EDF_SMP( dflt, CONFIGURE_SCHEDULER_NAME )
0210   #endif
0211 #endif
0212 
0213 #ifdef CONFIGURE_SCHEDULER_CBS
0214   #ifndef CONFIGURE_SCHEDULER_NAME
0215     #define CONFIGURE_SCHEDULER_NAME rtems_build_name( 'U', 'C', 'B', 'S' )
0216   #endif
0217 
0218   #ifndef CONFIGURE_SCHEDULER_TABLE_ENTRIES
0219     #define CONFIGURE_SCHEDULER RTEMS_SCHEDULER_CBS( dflt )
0220 
0221     #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
0222       RTEMS_SCHEDULER_TABLE_CBS( dflt, CONFIGURE_SCHEDULER_NAME )
0223   #endif
0224 
0225   #ifndef CONFIGURE_CBS_MAXIMUM_SERVERS
0226     #define CONFIGURE_CBS_MAXIMUM_SERVERS CONFIGURE_MAXIMUM_TASKS
0227   #endif
0228 
0229   const uint32_t _Scheduler_CBS_Maximum_servers =
0230     CONFIGURE_CBS_MAXIMUM_SERVERS;
0231 
0232   Scheduler_CBS_Server
0233     _Scheduler_CBS_Server_list[ CONFIGURE_CBS_MAXIMUM_SERVERS ];
0234 #endif
0235 
0236 #ifdef CONFIGURE_SCHEDULER
0237   /*
0238    * Ignore these warnings:
0239    *
0240    * - invalid use of structure with flexible array member
0241    *
0242    * - struct has no members
0243    */
0244   #pragma GCC diagnostic push
0245   #pragma GCC diagnostic ignored "-Wpedantic"
0246   CONFIGURE_SCHEDULER;
0247   #pragma GCC diagnostic pop
0248 #endif
0249 
0250 const Scheduler_Control _Scheduler_Table[] = {
0251   CONFIGURE_SCHEDULER_TABLE_ENTRIES
0252 };
0253 
0254 #define _CONFIGURE_SCHEDULER_COUNT RTEMS_ARRAY_SIZE( _Scheduler_Table )
0255 
0256 #ifdef RTEMS_SMP
0257 
0258 const size_t _Scheduler_Count = _CONFIGURE_SCHEDULER_COUNT;
0259 
0260 const Scheduler_Assignment _Scheduler_Initial_assignments[] = {
0261   #ifdef CONFIGURE_SCHEDULER_ASSIGNMENTS
0262     CONFIGURE_SCHEDULER_ASSIGNMENTS
0263   #else
0264     #define _CONFIGURE_SCHEDULER_ASSIGN \
0265       RTEMS_SCHEDULER_ASSIGN( \
0266         0, \
0267         RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL \
0268       )
0269     _CONFIGURE_SCHEDULER_ASSIGN
0270     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 2
0271       , _CONFIGURE_SCHEDULER_ASSIGN
0272     #endif
0273     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 3
0274       , _CONFIGURE_SCHEDULER_ASSIGN
0275     #endif
0276     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 4
0277       , _CONFIGURE_SCHEDULER_ASSIGN
0278     #endif
0279     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 5
0280       , _CONFIGURE_SCHEDULER_ASSIGN
0281     #endif
0282     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 6
0283       , _CONFIGURE_SCHEDULER_ASSIGN
0284     #endif
0285     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 7
0286       , _CONFIGURE_SCHEDULER_ASSIGN
0287     #endif
0288     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 8
0289       , _CONFIGURE_SCHEDULER_ASSIGN
0290     #endif
0291     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 9
0292       , _CONFIGURE_SCHEDULER_ASSIGN
0293     #endif
0294     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 10
0295       , _CONFIGURE_SCHEDULER_ASSIGN
0296     #endif
0297     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 11
0298       , _CONFIGURE_SCHEDULER_ASSIGN
0299     #endif
0300     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 12
0301       , _CONFIGURE_SCHEDULER_ASSIGN
0302     #endif
0303     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 13
0304       , _CONFIGURE_SCHEDULER_ASSIGN
0305     #endif
0306     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 14
0307       , _CONFIGURE_SCHEDULER_ASSIGN
0308     #endif
0309     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 15
0310       , _CONFIGURE_SCHEDULER_ASSIGN
0311     #endif
0312     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 16
0313       , _CONFIGURE_SCHEDULER_ASSIGN
0314     #endif
0315     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 17
0316       , _CONFIGURE_SCHEDULER_ASSIGN
0317     #endif
0318     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 18
0319       , _CONFIGURE_SCHEDULER_ASSIGN
0320     #endif
0321     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 19
0322       , _CONFIGURE_SCHEDULER_ASSIGN
0323     #endif
0324     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 20
0325       , _CONFIGURE_SCHEDULER_ASSIGN
0326     #endif
0327     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 21
0328       , _CONFIGURE_SCHEDULER_ASSIGN
0329     #endif
0330     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 22
0331       , _CONFIGURE_SCHEDULER_ASSIGN
0332     #endif
0333     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 23
0334       , _CONFIGURE_SCHEDULER_ASSIGN
0335     #endif
0336     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 24
0337       , _CONFIGURE_SCHEDULER_ASSIGN
0338     #endif
0339     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 25
0340       , _CONFIGURE_SCHEDULER_ASSIGN
0341     #endif
0342     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 26
0343       , _CONFIGURE_SCHEDULER_ASSIGN
0344     #endif
0345     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 27
0346       , _CONFIGURE_SCHEDULER_ASSIGN
0347     #endif
0348     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 28
0349       , _CONFIGURE_SCHEDULER_ASSIGN
0350     #endif
0351     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 29
0352       , _CONFIGURE_SCHEDULER_ASSIGN
0353     #endif
0354     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 30
0355       , _CONFIGURE_SCHEDULER_ASSIGN
0356     #endif
0357     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 31
0358       , _CONFIGURE_SCHEDULER_ASSIGN
0359     #endif
0360     #if _CONFIGURE_MAXIMUM_PROCESSORS >= 32
0361       , _CONFIGURE_SCHEDULER_ASSIGN
0362     #endif
0363     #undef _CONFIGURE_SCHEDULER_ASSIGN
0364   #endif
0365 };
0366 
0367 RTEMS_STATIC_ASSERT(
0368   _CONFIGURE_MAXIMUM_PROCESSORS
0369     == RTEMS_ARRAY_SIZE( _Scheduler_Initial_assignments ),
0370   _Scheduler_Initial_assignments
0371 );
0372 
0373 #endif /* RTEMS_SMP */
0374 
0375 #ifdef __cplusplus
0376 }
0377 #endif
0378 
0379 #endif /* CONFIGURE_INIT */
0380 
0381 #endif /* _RTEMS_CONFDEFS_SCHEDULER_H */