[PATCH 1/2] score: Macros to declare and define global symbols

Sebastian Huber sebastian.huber at embedded-brains.de
Mon Jun 18 12:42:05 UTC 2018


Add RTEMS_DEFINE_GLOBAL_SYMBOL() and add RTEMS_DECLARE_GLOBAL_SYMBOL().

Update #3459.
---
 cpukit/include/rtems/score/basedefs.h    | 34 +++++++++++++++++++++-
 testsuites/sptests/Makefile.am           |  9 ++++++
 testsuites/sptests/configure.ac          |  1 +
 testsuites/sptests/spmisc01/init.c       | 49 ++++++++++++++++++++++++++++++++
 testsuites/sptests/spmisc01/spmisc01.doc | 13 +++++++++
 testsuites/sptests/spmisc01/spmisc01.scn |  2 ++
 6 files changed, 107 insertions(+), 1 deletion(-)
 create mode 100644 testsuites/sptests/spmisc01/init.c
 create mode 100644 testsuites/sptests/spmisc01/spmisc01.doc
 create mode 100644 testsuites/sptests/spmisc01/spmisc01.scn

diff --git a/cpukit/include/rtems/score/basedefs.h b/cpukit/include/rtems/score/basedefs.h
index 4e48d226e8..8169f6db8c 100644
--- a/cpukit/include/rtems/score/basedefs.h
+++ b/cpukit/include/rtems/score/basedefs.h
@@ -10,7 +10,7 @@
  *  COPYRIGHT (c) 1989-2007.
  *  On-Line Applications Research Corporation (OAR).
  *
- *  Copyright (c) 2010, 2017 embedded brains GmbH.
+ *  Copyright (c) 2010, 2018 embedded brains GmbH.
  *
  *  The license and distribution terms for this file may be
  *  found in the file LICENSE in this distribution or at
@@ -249,6 +249,38 @@
   #define RTEMS_OBFUSCATE_VARIABLE( _var ) (void) (_var)
 #endif
 
+/**
+ * @brief Declares a global symbol with the specified name.
+ *
+ * This macro must be placed at file scope.
+ *
+ * The name must be a valid designator.
+ */
+#define RTEMS_DECLARE_GLOBAL_SYMBOL( _name ) \
+  extern char _name[];
+
+/**
+ * @brief Defines a global symbol with the specified name and value.
+ *
+ * This macro must be placed at file scope.
+ *
+ * The name must be a valid designator.
+ *
+ * On the value parameters macro expansion is performed and afterwards it is
+ * stringified.  It must expand to an integer literal understood by the
+ * assembler.
+ */
+#if defined(__GNUC__)
+  #define RTEMS_DEFINE_GLOBAL_SYMBOL( _name, _value ) \
+    __asm__( \
+      "\t.globl " RTEMS_XSTRING( __USER_LABEL_PREFIX__ ) #_name \
+      "\n\t.set " RTEMS_XSTRING( __USER_LABEL_PREFIX__ ) #_name \
+      ", " RTEMS_STRING( _value ) "\n" \
+    )
+#else
+  #define RTEMS_DEFINE_GLOBAL_SYMBOL( _name, _value )
+#endif
+
 #if __cplusplus >= 201103L
   #define RTEMS_STATIC_ASSERT(cond, msg) \
     static_assert(cond, # msg)
diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am
index 8519702bb1..d3a2e10869 100644
--- a/testsuites/sptests/Makefile.am
+++ b/testsuites/sptests/Makefile.am
@@ -1493,6 +1493,15 @@ spmkdir_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_spmkdir) \
 	$(support_includes)
 endif
 
+if TEST_spmisc01
+sp_tests += spmisc01
+sp_screens += spmisc01/spmisc01.scn
+sp_docs += spmisc01/spmisc01.doc
+spmisc01_SOURCES = spmisc01/init.c
+spmisc01_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_spmisc01) \
+	$(support_includes)
+endif
+
 if TEST_spmountmgr01
 sp_tests += spmountmgr01
 sp_screens += spmountmgr01/spmountmgr01.scn
diff --git a/testsuites/sptests/configure.ac b/testsuites/sptests/configure.ac
index db213b9be5..ffbd7330ce 100644
--- a/testsuites/sptests/configure.ac
+++ b/testsuites/sptests/configure.ac
@@ -194,6 +194,7 @@ RTEMS_TEST_CHECK([spintrcritical23])
 RTEMS_TEST_CHECK([spintrcritical24])
 RTEMS_TEST_CHECK([splinkersets01])
 RTEMS_TEST_CHECK([spmkdir])
+RTEMS_TEST_CHECK([spmisc01])
 RTEMS_TEST_CHECK([spmountmgr01])
 RTEMS_TEST_CHECK([spmrsp01])
 RTEMS_TEST_CHECK([spmsgq_err01])
diff --git a/testsuites/sptests/spmisc01/init.c b/testsuites/sptests/spmisc01/init.c
new file mode 100644
index 0000000000..4ff6365eeb
--- /dev/null
+++ b/testsuites/sptests/spmisc01/init.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2018 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+
+#include <tmacros.h>
+
+const char rtems_test_name[] = "SPMISC 1";
+
+RTEMS_DECLARE_GLOBAL_SYMBOL(a_global_symbol);
+
+RTEMS_DEFINE_GLOBAL_SYMBOL(a_global_symbol, 0xabc);
+
+static void Init(rtems_task_argument arg)
+{
+  TEST_BEGIN();
+  rtems_test_assert((uintptr_t)a_global_symbol == 0xabc);
+  TEST_END();
+  rtems_test_exit(0);
+}
+
+#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
+
+#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 1
+
+#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_INIT
+
+#include <rtems/confdefs.h>
diff --git a/testsuites/sptests/spmisc01/spmisc01.doc b/testsuites/sptests/spmisc01/spmisc01.doc
new file mode 100644
index 0000000000..2654788f02
--- /dev/null
+++ b/testsuites/sptests/spmisc01/spmisc01.doc
@@ -0,0 +1,13 @@
+This file describes the directives and concepts tested by this test set.
+
+test set name: spbasedefs01
+
+directives:
+
+  - RTEMS_DECLARE_GLOBAL_SYMBOL()
+  - RTEMS_DEFINE_GLOBAL_SYMBOL()
+
+concepts:
+
+  - Ensure that RTEMS_* defines and macros defined by <rtems/score/basedefs.h>
+    available via <rtems.h> work as expected.
diff --git a/testsuites/sptests/spmisc01/spmisc01.scn b/testsuites/sptests/spmisc01/spmisc01.scn
new file mode 100644
index 0000000000..6e692dab8f
--- /dev/null
+++ b/testsuites/sptests/spmisc01/spmisc01.scn
@@ -0,0 +1,2 @@
+*** BEGIN OF TEST SPMISC 1 ***
+*** END OF TEST SPMISC 1 ***
-- 
2.13.7



More information about the devel mailing list