[PATCH 5/8] rtems: Add scheduler identification
Sebastian Huber
sebastian.huber at embedded-brains.de
Fri Apr 11 15:11:45 UTC 2014
---
cpukit/rtems/Makefile.am | 1 +
cpukit/rtems/include/rtems/rtems/tasks.h | 17 ++++++++
cpukit/rtems/src/schedulerident.c | 46 ++++++++++++++++++++++
cpukit/score/include/rtems/score/object.h | 3 +-
cpukit/score/include/rtems/score/objectimpl.h | 9 ++++
cpukit/score/include/rtems/score/schedulerimpl.h | 10 +++++
testsuites/sptests/spscheduler01/init.c | 30 ++++++++++++++-
7 files changed, 114 insertions(+), 2 deletions(-)
create mode 100644 cpukit/rtems/src/schedulerident.c
diff --git a/cpukit/rtems/Makefile.am b/cpukit/rtems/Makefile.am
index b6a19c4..57b15ca 100644
--- a/cpukit/rtems/Makefile.am
+++ b/cpukit/rtems/Makefile.am
@@ -116,6 +116,7 @@ librtems_a_SOURCES += src/taskvariableget.c
librtems_a_SOURCES += src/taskvariable_invoke_dtor.c
endif
librtems_a_SOURCES += src/taskdata.c
+librtems_a_SOURCES += src/schedulerident.c
## RATEMON_C_FILES
librtems_a_SOURCES += src/ratemon.c
diff --git a/cpukit/rtems/include/rtems/rtems/tasks.h b/cpukit/rtems/include/rtems/rtems/tasks.h
index 4da32c4..cb7d1bb 100644
--- a/cpukit/rtems/include/rtems/rtems/tasks.h
+++ b/cpukit/rtems/include/rtems/rtems/tasks.h
@@ -548,6 +548,23 @@ rtems_status_code rtems_task_set_affinity(
*/
rtems_id rtems_task_self(void);
+/**
+ * @brief Identifies a scheduler by its name.
+ *
+ * The scheduler name is determined by the scheduler configuration.
+ *
+ * @param[in] name The scheduler name.
+ * @param[out] id The scheduler identifier associated with the name.
+ *
+ * @retval RTEMS_SUCCESSFUL Successful operation.
+ * @retval RTEMS_INVALID_ADDRESS The @a id parameter is @c NULL.
+ * @retval RTEMS_INVALID_NAME Invalid scheduler name.
+ */
+rtems_status_code rtems_scheduler_ident(
+ rtems_name name,
+ rtems_id *id
+);
+
/**@}*/
/**
diff --git a/cpukit/rtems/src/schedulerident.c b/cpukit/rtems/src/schedulerident.c
new file mode 100644
index 0000000..d9e913c
--- /dev/null
+++ b/cpukit/rtems/src/schedulerident.c
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2014 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems at 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.
+ */
+
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <rtems/rtems/tasks.h>
+#include <rtems/score/schedulerimpl.h>
+
+rtems_status_code rtems_scheduler_ident(
+ rtems_name name,
+ rtems_id *id
+)
+{
+ rtems_status_code sc;
+
+ if ( id != NULL ) {
+ size_t n = _Scheduler_Count;
+ size_t i;
+
+ sc = RTEMS_INVALID_NAME;
+
+ for ( i = 0 ; i < n && sc == RTEMS_INVALID_NAME ; ++i ) {
+ if ( _Scheduler_Table[ i ].name == name ) {
+ *id = _Scheduler_Build_id( i );
+ sc = RTEMS_SUCCESSFUL;
+ }
+ }
+ } else {
+ sc = RTEMS_INVALID_ADDRESS;
+ }
+
+ return sc;
+}
diff --git a/cpukit/score/include/rtems/score/object.h b/cpukit/score/include/rtems/score/object.h
index 0ccafbf..4eb66ad 100644
--- a/cpukit/score/include/rtems/score/object.h
+++ b/cpukit/score/include/rtems/score/object.h
@@ -217,7 +217,8 @@ typedef enum {
OBJECTS_NO_API = 0,
OBJECTS_INTERNAL_API = 1,
OBJECTS_CLASSIC_API = 2,
- OBJECTS_POSIX_API = 3
+ OBJECTS_POSIX_API = 3,
+ OBJECTS_FAKE_OBJECTS_API = 7
} Objects_APIs;
/** This macro is used to generically specify the last API index. */
diff --git a/cpukit/score/include/rtems/score/objectimpl.h b/cpukit/score/include/rtems/score/objectimpl.h
index 383f0a7..4e626ae 100644
--- a/cpukit/score/include/rtems/score/objectimpl.h
+++ b/cpukit/score/include/rtems/score/objectimpl.h
@@ -100,6 +100,15 @@ typedef enum {
/** This macro is used to generically specify the last API index. */
#define OBJECTS_POSIX_CLASSES_LAST OBJECTS_POSIX_RWLOCKS
+/*
+ * For fake objects, which have an object identifier, but no objects
+ * information block.
+ */
+typedef enum {
+ OBJECTS_FAKE_OBJECTS_NO_CLASS = 0,
+ OBJECTS_FAKE_OBJECTS_SCHEDULERS = 1
+} Objects_Fake_objects_API;
+
/**
* This enumerated type lists the locations which may be returned
* by _Objects_Get. These codes indicate the success of locating
diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h
index abad068..1635fa8 100644
--- a/cpukit/score/include/rtems/score/schedulerimpl.h
+++ b/cpukit/score/include/rtems/score/schedulerimpl.h
@@ -441,6 +441,16 @@ RTEMS_INLINE_ROUTINE const Scheduler_Control *_Scheduler_Get(
return &_Scheduler_Table[ 0 ];
}
+RTEMS_INLINE_ROUTINE Objects_Id _Scheduler_Build_id( uint32_t scheduler_index )
+{
+ return _Objects_Build_id(
+ OBJECTS_FAKE_OBJECTS_API,
+ OBJECTS_FAKE_OBJECTS_SCHEDULERS,
+ _Objects_Local_node,
+ scheduler_index + 1
+ );
+}
+
/** @} */
#ifdef __cplusplus
diff --git a/testsuites/sptests/spscheduler01/init.c b/testsuites/sptests/spscheduler01/init.c
index f8c4bb2..1b1be3c 100644
--- a/testsuites/sptests/spscheduler01/init.c
+++ b/testsuites/sptests/spscheduler01/init.c
@@ -25,7 +25,11 @@
const char rtems_test_name[] = "SPSCHEDULER 1";
-static rtems_id invalid_id = 1;
+#define BLUE rtems_build_name('b', 'l', 'u', 'e')
+
+#define RED rtems_build_name('r', 'e', 'd', ' ')
+
+static const rtems_id invalid_id = 1;
static void test_task_get_set_affinity(void)
{
@@ -98,6 +102,27 @@ static void test_task_get_set_affinity(void)
#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
}
+static void test_scheduler_ident(void)
+{
+ rtems_status_code sc;
+ rtems_id expected_id = rtems_build_id(2, 31, 1, 1);
+ rtems_id scheduler_id;
+ rtems_name name = BLUE;
+ rtems_name invalid_name = RED;
+
+ sc = rtems_scheduler_ident(name, NULL);
+ rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
+
+ sc = rtems_scheduler_ident(invalid_name, &scheduler_id);
+ rtems_test_assert(sc == RTEMS_INVALID_NAME);
+
+ scheduler_id = 0;
+ sc = rtems_scheduler_ident(name, &scheduler_id);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ rtems_test_assert(scheduler_id == expected_id);
+}
+
static void Init(rtems_task_argument arg)
{
rtems_resource_snapshot snapshot;
@@ -107,6 +132,7 @@ static void Init(rtems_task_argument arg)
rtems_resource_snapshot_take(&snapshot);
test_task_get_set_affinity();
+ test_scheduler_ident();
rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
@@ -125,6 +151,8 @@ static void Init(rtems_task_argument arg)
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+#define CONFIGURE_SCHEDULER_NAME BLUE
+
#define CONFIGURE_INIT
#include <rtems/confdefs.h>
--
1.7.7
More information about the devel
mailing list