[PATCH v2] Use linker set for system initialization

Sebastian Huber sebastian.huber at embedded-brains.de
Mon Dec 7 13:20:07 UTC 2015


Update #2408.
---
v2: Add documentation to user manual.

 c/src/lib/libbsp/shared/bootcard.c   | 84 ++++++++++++------------------------
 cpukit/score/Makefile.am             |  1 +
 cpukit/score/include/rtems/sysinit.h | 51 ++++++++++++++++++++++
 cpukit/score/preinstall.am           |  4 ++
 4 files changed, 83 insertions(+), 57 deletions(-)
 create mode 100644 cpukit/score/include/rtems/sysinit.h

diff --git a/c/src/lib/libbsp/shared/bootcard.c b/c/src/lib/libbsp/shared/bootcard.c
index eeb5746..4bdc0b4 100644
--- a/c/src/lib/libbsp/shared/bootcard.c
+++ b/c/src/lib/libbsp/shared/bootcard.c
@@ -47,6 +47,7 @@
 #include <bsp/bootcard.h>
 
 #include <rtems.h>
+#include <rtems/sysinit.h>
 
 /*
  *  At most a single pointer to the cmdline for those target
@@ -54,6 +55,26 @@
  */
 const char *bsp_boot_cmdline;
 
+RTEMS_LINKER_ROSET(_Sysinit, rtems_sysinit_item);
+
+RTEMS_SYSINIT_ITEM(bsp_start, RTEMS_SYSINIT_BSP_START);
+
+RTEMS_SYSINIT_ITEM(bsp_work_area_initialize, RTEMS_SYSINIT_WORK_AREAS);
+
+RTEMS_SYSINIT_ITEM(rtems_initialize_data_structures, RTEMS_SYSINIT_DATA_STRUCTURES);
+
+RTEMS_SYSINIT_ITEM(bsp_libc_init, RTEMS_SYSINIT_LIBC);
+
+RTEMS_SYSINIT_ITEM(bsp_pretasking_hook, RTEMS_SYSINIT_PRE_TASKING);
+
+RTEMS_SYSINIT_ITEM(rtems_initialize_before_drivers, RTEMS_SYSINIT_EARLY_PRE_DRIVERS);
+
+RTEMS_SYSINIT_ITEM(bsp_predriver_hook, RTEMS_SYSINIT_PRE_DRIVERS);
+
+RTEMS_SYSINIT_ITEM(rtems_initialize_device_drivers, RTEMS_SYSINIT_DRIVERS);
+
+RTEMS_SYSINIT_ITEM(bsp_postdriver_hook, RTEMS_SYSINIT_POST_DRIVERS);
+
 /*
  *  This is the initialization framework routine that weaves together
  *  calls to RTEMS and the BSP in the proper sequence to initialize
@@ -65,6 +86,8 @@ void boot_card(
 )
 {
   rtems_interrupt_level  bsp_isr_level;
+  const volatile rtems_sysinit_item *cur = RTEMS_LINKER_SET_BEGIN(_Sysinit );
+  const volatile rtems_sysinit_item *end = RTEMS_LINKER_SET_END( _Sysinit );
 
   /*
    *  Make sure interrupts are disabled.
@@ -74,63 +97,10 @@ void boot_card(
 
   bsp_boot_cmdline = cmdline;
 
-  /*
-   * Invoke Board Support Package initialization routine written in C.
-   */
-  bsp_start();
-
-  /*
-   *  Initialize the RTEMS Workspace and the C Program Heap.
-   */
-  bsp_work_area_initialize();
-
-  /*
-   *  Initialize RTEMS data structures
-   */
-  rtems_initialize_data_structures();
-
-  /*
-   *  Initialize the C library for those BSPs using the shared
-   *  framework.
-   */
-  bsp_libc_init();
-
-  /*
-   *  Let the BSP do any required initialization now that RTEMS
-   *  data structures are initialized.  In older BSPs or those
-   *  which do not use the shared framework, this is the typical
-   *  time when the C Library is initialized so malloc()
-   *  can be called by device drivers.  For BSPs using the shared
-   *  framework, this routine can be empty.
-   */
-  bsp_pretasking_hook();
-
-  /*
-   *  Let RTEMS perform initialization it requires before drivers
-   *  are allowed to be initialized.
-   */
-  rtems_initialize_before_drivers();
-
-  /*
-   *  Execute BSP specific pre-driver hook. Drivers haven't gotten
-   *  to initialize yet so this is a good chance to initialize
-   *  buses, spurious interrupt handlers, etc..
-   *
-   *  NOTE: Many BSPs do not require this handler and use the
-   *        shared stub.
-   */
-  bsp_predriver_hook();
-
-  /*
-   *  Initialize all device drivers.
-   */
-  rtems_initialize_device_drivers();
-
-  /*
-   *  Invoke the postdriver hook.  This normally opens /dev/console
-   *  for use as stdin, stdout, and stderr.
-   */
-  bsp_postdriver_hook();
+  while ( cur != end ) {
+    ( *cur->handler )();
+    ++cur;
+  }
 
   /*
    *  Complete initialization of RTEMS and switch to the first task.
diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
index c90f4a2..04c5c87 100644
--- a/cpukit/score/Makefile.am
+++ b/cpukit/score/Makefile.am
@@ -18,6 +18,7 @@ include_rtemsdir = $(includedir)/rtems
 
 include_rtems_HEADERS =
 include_rtems_HEADERS += include/rtems/linkersets.h
+include_rtems_HEADERS += include/rtems/sysinit.h
 include_rtems_HEADERS += include/rtems/system.h
 include_rtems_HEADERS += include/rtems/seterr.h
 
diff --git a/cpukit/score/include/rtems/sysinit.h b/cpukit/score/include/rtems/sysinit.h
new file mode 100644
index 0000000..fbe21da
--- /dev/null
+++ b/cpukit/score/include/rtems/sysinit.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2015 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.
+ */
+
+#ifndef _RTEMS_SYSINIT_H
+#define _RTEMS_SYSINIT_H
+
+#include <rtems/linkersets.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define RTEMS_SYSINIT_BSP_START 0x0001000
+#define RTEMS_SYSINIT_WORK_AREAS 0x0002000
+#define RTEMS_SYSINIT_DATA_STRUCTURES 0x0003000
+#define RTEMS_SYSINIT_LIBC 0x0004000
+#define RTEMS_SYSINIT_PRE_TASKING 0x0005000
+#define RTEMS_SYSINIT_EARLY_PRE_DRIVERS 0x0006000
+#define RTEMS_SYSINIT_PRE_DRIVERS 0x0007000
+#define RTEMS_SYSINIT_DRIVERS 0x0008000
+#define RTEMS_SYSINIT_POST_DRIVERS 0x0009000
+
+typedef void ( *rtems_sysinit_handler )( void );
+
+typedef struct {
+  rtems_sysinit_handler handler;
+} rtems_sysinit_item;
+
+#define RTEMS_SYSINIT_ITEM( handler, o ) \
+  enum { _Sysinit_##handler = o - o }; \
+  RTEMS_LINKER_ROSET_ITEM_ORDERED( \
+    _Sysinit, \
+    rtems_sysinit_item, handler, o \
+  ) = { handler }
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _RTEMS_SYSINIT_H */
diff --git a/cpukit/score/preinstall.am b/cpukit/score/preinstall.am
index 4a45e87..1cc44da 100644
--- a/cpukit/score/preinstall.am
+++ b/cpukit/score/preinstall.am
@@ -47,6 +47,10 @@ $(PROJECT_INCLUDE)/rtems/linkersets.h: include/rtems/linkersets.h $(PROJECT_INCL
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/linkersets.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/linkersets.h
 
+$(PROJECT_INCLUDE)/rtems/sysinit.h: include/rtems/sysinit.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/sysinit.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/sysinit.h
+
 $(PROJECT_INCLUDE)/rtems/system.h: include/rtems/system.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/system.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/system.h
-- 
1.8.4.5



More information about the devel mailing list