From 7dfb4b970cbd22cef170b2f45a41f445406a2ce5 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 19 May 2016 11:20:58 +0200 Subject: [PATCH] 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. --- .../posix/include/rtems/posix/priorityimpl.h | 2 +- cpukit/rtems/include/rtems/rtems/tasks.h | 1 + cpukit/sapi/include/confdefs.h | 13 +------------ cpukit/sapi/include/rtems/scheduler.h | 18 +++++++++++++++++- cpukit/score/include/rtems/score/priority.h | 8 -------- cpukit/score/include/rtems/score/scheduler.h | 14 ++++++++++++++ .../score/include/rtems/score/schedulercbs.h | 2 ++ .../score/include/rtems/score/scheduleredf.h | 2 ++ .../include/rtems/score/schedulersimple.h | 2 ++ .../include/rtems/score/schedulersimplesmp.h | 2 ++ 10 files changed, 42 insertions(+), 22 deletions(-) diff --git a/cpukit/posix/include/rtems/posix/priorityimpl.h b/cpukit/posix/include/rtems/posix/priorityimpl.h index 169254d22f..3835ee90d0 100644 --- a/cpukit/posix/include/rtems/posix/priorityimpl.h +++ b/cpukit/posix/include/rtems/posix/priorityimpl.h @@ -19,7 +19,7 @@ #ifndef _RTEMS_POSIX_PRIORITYIMPL_H #define _RTEMS_POSIX_PRIORITYIMPL_H -#include +#include #ifdef __cplusplus extern "C" { diff --git a/cpukit/rtems/include/rtems/rtems/tasks.h b/cpukit/rtems/include/rtems/rtems/tasks.h index 5f33e0b04b..84ea806f81 100644 --- a/cpukit/rtems/include/rtems/rtems/tasks.h +++ b/cpukit/rtems/include/rtems/rtems/tasks.h @@ -38,6 +38,7 @@ #define _RTEMS_RTEMS_TASKS_H #include +#include #include #include #include diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h index b7c2f44de7..95f29fdfb9 100644 --- a/cpukit/sapi/include/confdefs.h +++ b/cpukit/sapi/include/confdefs.h @@ -883,6 +883,7 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; CONFIGURE_MAXIMUM_PRIORITY + 1 \ ) + /** Configure the controls for this scheduler instance */ #define CONFIGURE_SCHEDULER_CONTROLS \ RTEMS_SCHEDULER_CONTROL_PRIORITY_AFFINITY_SMP( \ dflt, \ @@ -3349,18 +3350,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; uint32_t rtems_minimum_stack_size = CONFIGURE_MINIMUM_TASK_STACK_SIZE; - /** - * This variable specifies the maximum priority value that - * a task may have. This must be a power of 2 between 4 - * and 256 and is specified in terms of Classic API - * priority values. - * - * NOTE: This is left as a simple uint8_t so it can be externed as - * needed without requring being high enough logical to - * include the full configuration table. - */ - uint8_t rtems_maximum_priority = CONFIGURE_MAXIMUM_PRIORITY; - /** * This is the primary Configuration Table for this application. */ diff --git a/cpukit/sapi/include/rtems/scheduler.h b/cpukit/sapi/include/rtems/scheduler.h index 39dff903d4..0b20aab55e 100644 --- a/cpukit/sapi/include/rtems/scheduler.h +++ b/cpukit/sapi/include/rtems/scheduler.h @@ -5,7 +5,7 @@ */ /* - * Copyright (c) 2014 embedded brains GmbH. All rights reserved. + * Copyright (c) 2014, 2016 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Dornierstr. 4 @@ -70,6 +70,7 @@ { \ &RTEMS_SCHEDULER_CONTEXT_CBS_NAME( name ).Base, \ SCHEDULER_CBS_ENTRY_POINTS, \ + SCHEDULER_CBS_MAXIMUM_PRIORITY, \ ( obj_name ) \ } #endif @@ -87,6 +88,7 @@ { \ &RTEMS_SCHEDULER_CONTEXT_EDF_NAME( name ).Base, \ SCHEDULER_EDF_ENTRY_POINTS, \ + SCHEDULER_EDF_MAXIMUM_PRIORITY, \ ( obj_name ) \ } #endif @@ -107,6 +109,9 @@ { \ &RTEMS_SCHEDULER_CONTEXT_PRIORITY_NAME( name ).Base.Base, \ SCHEDULER_PRIORITY_ENTRY_POINTS, \ + RTEMS_ARRAY_SIZE( \ + RTEMS_SCHEDULER_CONTEXT_PRIORITY_NAME( name ).Ready \ + ) - 1, \ ( obj_name ) \ } #endif @@ -127,6 +132,9 @@ { \ &RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP_NAME( name ).Base.Base.Base, \ SCHEDULER_PRIORITY_AFFINITY_SMP_ENTRY_POINTS, \ + RTEMS_ARRAY_SIZE( \ + RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP_NAME( name ).Ready \ + ) - 1, \ ( obj_name ) \ } #endif @@ -147,6 +155,9 @@ { \ &RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP_NAME( name ).Base.Base.Base, \ SCHEDULER_PRIORITY_SMP_ENTRY_POINTS, \ + RTEMS_ARRAY_SIZE( \ + RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP_NAME( name ).Ready \ + ) - 1, \ ( obj_name ) \ } #endif @@ -167,6 +178,9 @@ { \ &RTEMS_SCHEDULER_CONTEXT_STRONG_APA_NAME( name ).Base.Base.Base, \ SCHEDULER_STRONG_APA_ENTRY_POINTS, \ + RTEMS_ARRAY_SIZE( \ + RTEMS_SCHEDULER_CONTEXT_STRONG_APA_NAME( name ).Ready \ + ) - 1, \ ( obj_name ) \ } #endif @@ -185,6 +199,7 @@ { \ &RTEMS_SCHEDULER_CONTEXT_SIMPLE_NAME( name ).Base, \ SCHEDULER_SIMPLE_ENTRY_POINTS, \ + SCHEDULER_SIMPLE_MAXIMUM_PRIORITY, \ ( obj_name ) \ } #endif @@ -203,6 +218,7 @@ { \ &RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP_NAME( name ).Base.Base, \ SCHEDULER_SIMPLE_SMP_ENTRY_POINTS, \ + SCHEDULER_SIMPLE_SMP_MAXIMUM_PRIORITY, \ ( obj_name ) \ } #endif diff --git a/cpukit/score/include/rtems/score/priority.h b/cpukit/score/include/rtems/score/priority.h index 0a772f62a2..38f3995e61 100644 --- a/cpukit/score/include/rtems/score/priority.h +++ b/cpukit/score/include/rtems/score/priority.h @@ -72,14 +72,6 @@ typedef uint32_t Priority_Control; #define PRIORITY_DEFAULT_MAXIMUM 255 #endif -/** This defines the lowest (least important) thread priority. */ -#define PRIORITY_MAXIMUM rtems_maximum_priority - -/** - * This variable contains the configured number of priorities - */ -extern uint8_t rtems_maximum_priority; - #ifdef __cplusplus } #endif diff --git a/cpukit/score/include/rtems/score/scheduler.h b/cpukit/score/include/rtems/score/scheduler.h index 5296644aeb..1e6236fa4d 100644 --- a/cpukit/score/include/rtems/score/scheduler.h +++ b/cpukit/score/include/rtems/score/scheduler.h @@ -200,6 +200,14 @@ struct Scheduler_Control { */ Scheduler_Operations Operations; + /** + * @brief The maximum priority value of this scheduler. + * + * It defines the lowest (least important) thread priority for this + * scheduler. For example the idle threads have this priority. + */ + Priority_Control maximum_priority; + /** * @brief The scheduler name. */ @@ -555,6 +563,12 @@ void _Scheduler_default_Start_idle( #define SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY #endif +/** + * @brief This defines the lowest (least important) thread priority of the + * first scheduler instance. + */ +#define PRIORITY_MAXIMUM ( _Scheduler_Table[ 0 ].maximum_priority ) + /**@}*/ #ifdef __cplusplus diff --git a/cpukit/score/include/rtems/score/schedulercbs.h b/cpukit/score/include/rtems/score/schedulercbs.h index 5558d6e919..e390532343 100644 --- a/cpukit/score/include/rtems/score/schedulercbs.h +++ b/cpukit/score/include/rtems/score/schedulercbs.h @@ -39,6 +39,8 @@ extern "C" { */ /**@{*/ +#define SCHEDULER_CBS_MAXIMUM_PRIORITY SCHEDULER_EDF_MAXIMUM_PRIORITY + /** * Entry points for the Constant Bandwidth Server Scheduler. * diff --git a/cpukit/score/include/rtems/score/scheduleredf.h b/cpukit/score/include/rtems/score/scheduleredf.h index 9b0d1b4099..137ea3abde 100644 --- a/cpukit/score/include/rtems/score/scheduleredf.h +++ b/cpukit/score/include/rtems/score/scheduleredf.h @@ -35,6 +35,8 @@ extern "C" { */ /**@{*/ +#define SCHEDULER_EDF_MAXIMUM_PRIORITY 255 + /** * Entry points for the Earliest Deadline First Scheduler. */ diff --git a/cpukit/score/include/rtems/score/schedulersimple.h b/cpukit/score/include/rtems/score/schedulersimple.h index 201c1b6628..a546ed629f 100644 --- a/cpukit/score/include/rtems/score/schedulersimple.h +++ b/cpukit/score/include/rtems/score/schedulersimple.h @@ -32,6 +32,8 @@ extern "C" { */ /**@{*/ +#define SCHEDULER_SIMPLE_MAXIMUM_PRIORITY 255 + /** * Entry points for Scheduler Simple */ diff --git a/cpukit/score/include/rtems/score/schedulersimplesmp.h b/cpukit/score/include/rtems/score/schedulersimplesmp.h index 11310c6898..342a574174 100644 --- a/cpukit/score/include/rtems/score/schedulersimplesmp.h +++ b/cpukit/score/include/rtems/score/schedulersimplesmp.h @@ -54,6 +54,8 @@ typedef struct { Chain_Control Ready; } Scheduler_simple_SMP_Context; +#define SCHEDULER_SIMPLE_SMP_MAXIMUM_PRIORITY 255 + /** * @brief Entry points for the Simple SMP Scheduler. */