source: rtems/cpukit/sapi/include/rtems/scheduler.h @ 7dfb4b9

5
Last change on this file since 7dfb4b9 was 7dfb4b9, checked in by Sebastian Huber <sebastian.huber@…>, on 05/19/16 at 09:20:58

score: Add per scheduler instance maximum priority

The priority values are only valid within a scheduler instance. Thus,
the maximum priority value must be defined per scheduler instance. The
first scheduler instance defines PRIORITY_MAXIMUM. This implies that
RTEMS_MAXIMUM_PRIORITY and POSIX_SCHEDULER_MAXIMUM_PRIORITY are only
valid for threads of the first scheduler instance. Further
API/implementation changes are necessary to fix this.

Update #2556.

  • Property mode set to 100644
File size: 7.0 KB
Line 
1/**
2 * @file
3 *
4 * @brief Scheduler Configuration API
5 */
6
7/*
8 * Copyright (c) 2014, 2016 embedded brains GmbH.  All rights reserved.
9 *
10 *  embedded brains GmbH
11 *  Dornierstr. 4
12 *  82178 Puchheim
13 *  Germany
14 *  <rtems@embedded-brains.de>
15 *
16 * The license and distribution terms for this file may be
17 * found in the file LICENSE in this distribution or at
18 * http://www.rtems.org/license/LICENSE.
19 */
20
21#ifndef _RTEMS_SAPI_SCHEDULER_H
22#define _RTEMS_SAPI_SCHEDULER_H
23
24#include <rtems/score/scheduler.h>
25
26#define RTEMS_SCHEDULER_CONTEXT_NAME( name ) \
27  _Configuration_Scheduler_ ## name
28
29#if defined(RTEMS_SMP)
30  /* This object doesn't exist and indicates a configuration error */
31  extern const Scheduler_Control RTEMS_SCHEDULER_INVALID_INDEX;
32
33  #define RTEMS_SCHEDULER_ASSIGN_DEFAULT \
34    SCHEDULER_ASSIGN_DEFAULT
35
36  #define RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL \
37    SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL
38
39  #define RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY \
40    SCHEDULER_ASSIGN_PROCESSOR_MANDATORY
41
42  #define RTEMS_SCHEDULER_ASSIGN( index, attr ) \
43    { \
44      ( index ) < RTEMS_ARRAY_SIZE( _Scheduler_Table ) ? \
45        &_Scheduler_Table[ ( index ) ] : &RTEMS_SCHEDULER_INVALID_INDEX, \
46      ( attr ) \
47    }
48
49  #define RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER { NULL, 0 }
50#endif
51
52/*
53 * This file should be only included in the context of <rtems/confdefs.h>.
54 * Define the scheduler configuration macros only in case the corresponding
55 * configure symbol is defined.  This is necessary to prevent invalid workspace
56 * size estimates since we have to account for the per-thread scheduler
57 * information.
58 */
59
60#ifdef CONFIGURE_SCHEDULER_CBS
61  #include <rtems/score/schedulercbs.h>
62
63  #define RTEMS_SCHEDULER_CONTEXT_CBS_NAME( name ) \
64    RTEMS_SCHEDULER_CONTEXT_NAME( CBS_ ## name )
65
66  #define RTEMS_SCHEDULER_CONTEXT_CBS( name ) \
67    static Scheduler_EDF_Context RTEMS_SCHEDULER_CONTEXT_CBS_NAME( name )
68
69  #define RTEMS_SCHEDULER_CONTROL_CBS( name, obj_name ) \
70    { \
71      &RTEMS_SCHEDULER_CONTEXT_CBS_NAME( name ).Base, \
72      SCHEDULER_CBS_ENTRY_POINTS, \
73      SCHEDULER_CBS_MAXIMUM_PRIORITY, \
74      ( obj_name ) \
75    }
76#endif
77
78#ifdef CONFIGURE_SCHEDULER_EDF
79  #include <rtems/score/scheduleredf.h>
80
81  #define RTEMS_SCHEDULER_CONTEXT_EDF_NAME( name ) \
82    RTEMS_SCHEDULER_CONTEXT_NAME( EDF_ ## name )
83
84  #define RTEMS_SCHEDULER_CONTEXT_EDF( name ) \
85    static Scheduler_EDF_Context RTEMS_SCHEDULER_CONTEXT_EDF_NAME( name )
86
87  #define RTEMS_SCHEDULER_CONTROL_EDF( name, obj_name ) \
88    { \
89      &RTEMS_SCHEDULER_CONTEXT_EDF_NAME( name ).Base, \
90      SCHEDULER_EDF_ENTRY_POINTS, \
91      SCHEDULER_EDF_MAXIMUM_PRIORITY, \
92      ( obj_name ) \
93    }
94#endif
95
96#ifdef CONFIGURE_SCHEDULER_PRIORITY
97  #include <rtems/score/schedulerpriority.h>
98
99  #define RTEMS_SCHEDULER_CONTEXT_PRIORITY_NAME( name ) \
100    RTEMS_SCHEDULER_CONTEXT_NAME( priority_ ## name )
101
102  #define RTEMS_SCHEDULER_CONTEXT_PRIORITY( name, prio_count ) \
103    static struct { \
104      Scheduler_priority_Context Base; \
105      Chain_Control              Ready[ ( prio_count ) ]; \
106    } RTEMS_SCHEDULER_CONTEXT_PRIORITY_NAME( name )
107
108  #define RTEMS_SCHEDULER_CONTROL_PRIORITY( name, obj_name ) \
109    { \
110      &RTEMS_SCHEDULER_CONTEXT_PRIORITY_NAME( name ).Base.Base, \
111      SCHEDULER_PRIORITY_ENTRY_POINTS, \
112      RTEMS_ARRAY_SIZE( \
113        RTEMS_SCHEDULER_CONTEXT_PRIORITY_NAME( name ).Ready \
114      ) - 1, \
115      ( obj_name ) \
116    }
117#endif
118
119#ifdef CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP
120  #include <rtems/score/schedulerpriorityaffinitysmp.h>
121
122  #define RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP_NAME( name ) \
123    RTEMS_SCHEDULER_CONTEXT_NAME( priority_affinity_SMP_ ## name )
124
125  #define RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP( name, prio_count ) \
126    static struct { \
127      Scheduler_priority_SMP_Context Base; \
128      Chain_Control                  Ready[ ( prio_count ) ]; \
129    } RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP_NAME( name )
130
131  #define RTEMS_SCHEDULER_CONTROL_PRIORITY_AFFINITY_SMP( name, obj_name ) \
132    { \
133      &RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP_NAME( name ).Base.Base.Base, \
134      SCHEDULER_PRIORITY_AFFINITY_SMP_ENTRY_POINTS, \
135      RTEMS_ARRAY_SIZE( \
136        RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP_NAME( name ).Ready \
137      ) - 1, \
138      ( obj_name ) \
139    }
140#endif
141
142#ifdef CONFIGURE_SCHEDULER_PRIORITY_SMP
143  #include <rtems/score/schedulerprioritysmp.h>
144
145  #define RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP_NAME( name ) \
146    RTEMS_SCHEDULER_CONTEXT_NAME( priority_SMP_ ## name )
147
148  #define RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP( name, prio_count ) \
149    static struct { \
150      Scheduler_priority_SMP_Context Base; \
151      Chain_Control                  Ready[ ( prio_count ) ]; \
152    } RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP_NAME( name )
153
154  #define RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP( name, obj_name ) \
155    { \
156      &RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP_NAME( name ).Base.Base.Base, \
157      SCHEDULER_PRIORITY_SMP_ENTRY_POINTS, \
158      RTEMS_ARRAY_SIZE( \
159        RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP_NAME( name ).Ready \
160      ) - 1, \
161      ( obj_name ) \
162    }
163#endif
164
165#ifdef CONFIGURE_SCHEDULER_STRONG_APA
166  #include <rtems/score/schedulerstrongapa.h>
167
168  #define RTEMS_SCHEDULER_CONTEXT_STRONG_APA_NAME( name ) \
169    RTEMS_SCHEDULER_CONTEXT_NAME( strong_APA_ ## name )
170
171  #define RTEMS_SCHEDULER_CONTEXT_STRONG_APA( name, prio_count ) \
172    static struct { \
173      Scheduler_strong_APA_Context Base; \
174      Chain_Control                Ready[ ( prio_count ) ]; \
175    } RTEMS_SCHEDULER_CONTEXT_STRONG_APA_NAME( name )
176
177  #define RTEMS_SCHEDULER_CONTROL_STRONG_APA( name, obj_name ) \
178    { \
179      &RTEMS_SCHEDULER_CONTEXT_STRONG_APA_NAME( name ).Base.Base.Base, \
180      SCHEDULER_STRONG_APA_ENTRY_POINTS, \
181      RTEMS_ARRAY_SIZE( \
182        RTEMS_SCHEDULER_CONTEXT_STRONG_APA_NAME( name ).Ready \
183      ) - 1, \
184      ( obj_name ) \
185    }
186#endif
187
188#ifdef CONFIGURE_SCHEDULER_SIMPLE
189  #include <rtems/score/schedulersimple.h>
190
191  #define RTEMS_SCHEDULER_CONTEXT_SIMPLE_NAME( name ) \
192    RTEMS_SCHEDULER_CONTEXT_NAME( simple_ ## name )
193
194  #define RTEMS_SCHEDULER_CONTEXT_SIMPLE( name ) \
195    static Scheduler_simple_Context \
196      RTEMS_SCHEDULER_CONTEXT_SIMPLE_NAME( name )
197
198  #define RTEMS_SCHEDULER_CONTROL_SIMPLE( name, obj_name ) \
199    { \
200      &RTEMS_SCHEDULER_CONTEXT_SIMPLE_NAME( name ).Base, \
201      SCHEDULER_SIMPLE_ENTRY_POINTS, \
202      SCHEDULER_SIMPLE_MAXIMUM_PRIORITY, \
203      ( obj_name ) \
204    }
205#endif
206
207#ifdef CONFIGURE_SCHEDULER_SIMPLE_SMP
208  #include <rtems/score/schedulersimplesmp.h>
209
210  #define RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP_NAME( name ) \
211    RTEMS_SCHEDULER_CONTEXT_NAME( simple_SMP_ ## name )
212
213  #define RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP( name ) \
214    static Scheduler_simple_SMP_Context \
215      RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP_NAME( name )
216
217  #define RTEMS_SCHEDULER_CONTROL_SIMPLE_SMP( name, obj_name ) \
218    { \
219      &RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP_NAME( name ).Base.Base, \
220      SCHEDULER_SIMPLE_SMP_ENTRY_POINTS, \
221      SCHEDULER_SIMPLE_SMP_MAXIMUM_PRIORITY, \
222      ( obj_name ) \
223    }
224#endif
225
226#endif /* _RTEMS_SAPI_SCHEDULER_H */
Note: See TracBrowser for help on using the repository browser.