summaryrefslogtreecommitdiffstats
path: root/c-user/initialization.rst
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-04-21 09:19:27 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-04-21 09:35:58 +0200
commitf3262d40745c4109f529e0456e011c85bf134917 (patch)
tree7da3f060070d6ec29616f92ae98ad90c60992445 /c-user/initialization.rst
parentc-user: Document rtems_semaphore_obtain() errors (diff)
downloadrtems-docs-f3262d40745c4109f529e0456e011c85bf134917.tar.bz2
c-user: Split up initialization manager
This makes it easier to automatically generate parts of the module documentation in the future. Update #3993.
Diffstat (limited to 'c-user/initialization.rst')
-rw-r--r--c-user/initialization.rst458
1 files changed, 0 insertions, 458 deletions
diff --git a/c-user/initialization.rst b/c-user/initialization.rst
deleted file mode 100644
index fa7afb5..0000000
--- a/c-user/initialization.rst
+++ /dev/null
@@ -1,458 +0,0 @@
-.. SPDX-License-Identifier: CC-BY-SA-4.0
-
-.. Copyright (C) 1988, 2008 On-Line Applications Research Corporation (OAR)
-
-Initialization Manager
-**********************
-
-Introduction
-============
-
-The Initialization Manager is responsible for initializing the Board Support
-Package, RTEMS, device drivers, the root filesystem and the application. The
-:ref:`Fatal Error Manager <fatal_error_manager>` is responsible for the system
-shutdown.
-
-The Initialization Manager provides only one directive:
-
-- rtems_initialize_executive_ - Initialize RTEMS
-
-Background
-==========
-
-.. index:: initialization tasks
-
-Initialization Tasks
---------------------
-
-Initialization task(s) are the mechanism by which RTEMS transfers initial
-control to the user's application. Initialization tasks differ from other
-application tasks in that they are defined in the User Initialization Tasks
-Table and automatically created and started by RTEMS as part of its
-initialization sequence. Since the initialization tasks are scheduled using
-the same algorithm as all other RTEMS tasks, they must be configured at a
-priority and mode which will ensure that they will complete execution before
-other application tasks execute. Although there is no upper limit on the
-number of initialization tasks, an application is required to define at least
-one.
-
-A typical initialization task will create and start the static set of
-application tasks. It may also create any other objects used by the
-application. Initialization tasks which only perform initialization should
-delete themselves upon completion to free resources for other tasks.
-Initialization tasks may transform themselves into a "normal" application task.
-This transformation typically involves changing priority and execution mode.
-RTEMS does not automatically delete the initialization tasks.
-
-The Idle Task
--------------
-
-The Idle Task is the lowest priority task in a system and executes only when no
-other task is ready to execute. The default implementation of this task
-consists of an infinite loop. RTEMS allows the Idle Task body to be replaced by
-a CPU specific implementation, a BSP specific implementation or an application
-specific implementation.
-
-The Idle Task is preemptible and *WILL* be preempted when any other task is
-made ready to execute. This characteristic is critical to the overall behavior
-of any application.
-
-Initialization Manager Failure
-------------------------------
-
-System initialization errors are fatal. See :ref:`internal_errors`.
-
-Operations
-==========
-
-Initializing RTEMS
-------------------
-
-The Initialization Manager :c:func:`rtems_initialize_executive()` directives is
-called by the :c:func:`boot_card()` routine which is invoked by the Board
-Support Package once a basic C run-time environment is set up. This consists
-of
-
-- a valid and accessible text section, read-only data, read-write data and
- zero-initialized data,
-
-- an initialization stack large enough to initialize the rest of the Board
- Support Package, RTEMS and the device drivers,
-
-- all registers and components mandated by Application Binary Interface, and
-
-- disabled interrupts.
-
-The :c:func:`rtems_initialize_executive()` directive uses a system
-initialization :ref:`linker set <linker_sets>` to initialize only those parts
-of the overall RTEMS feature set that is necessary for a particular
-application. Each RTEMS feature used the application may optionally register
-an initialization handler. The system initialization API is available via
-:samp:`#included <rtems/sysinit.h>`.
-
-A list of all initialization steps follows. Some steps are optional depending
-on the requested feature set of the application. The initialization steps are
-execute in the order presented here.
-
-RTEMS_SYSINIT_RECORD
- Initialization of the event recording is the first initialization step.
- This allows to record the further system initialization. This step is
- optional and depends on the :ref:`CONFIGURE_RECORD_PER_PROCESSOR_ITEMS`
- configuration option.
-
-RTEMS_SYSINIT_BSP_EARLY
- The Board Support Package may perform an early platform initialization in
- this step. This step is optional.
-
-RTEMS_SYSINIT_MEMORY
- The Board Support Package should initialize everything so that calls to
- :c:func:`_Memory_Get()` can be made after this step. This step is optional.
-
-RTEMS_SYSINIT_DIRTY_MEMORY
- The free memory is dirtied in this step. This step is optional and depends
- on the :c:macro:`BSP_DIRTY_MEMORY` BSP option.
-
-RTEMS_SYSINIT_ISR_STACK
- The stack checker initializes the ISR stacks in this step. This step is
- optional and depends on the :ref:`CONFIGURE_STACK_CHECKER_ENABLED`
- configuration option.
-
-RTEMS_SYSINIT_PER_CPU_DATA
- The per-CPU data is initialized in this step. This step is mandatory.
-
-RTEMS_SYSINIT_SBRK
- The Board Support Package may initialize the :c:func:`sbrk()` support in
- this step. This step is optional.
-
-RTEMS_SYSINIT_WORKSPACE
- The workspace is initialized in this step. This step is optional and
- depends on the application configuration.
-
-RTEMS_SYSINIT_MALLOC
- The C program heap is initialized in this step. This step is optional and
- depends on the application configuration.
-
-RTEMS_SYSINIT_BSP_START
- The Board Support Package should perform a general platform initialization
- in this step (e.g. interrupt controller initialization). This step is
- mandatory.
-
-RTEMS_SYSINIT_CPU_COUNTER
- Initialization of the CPU counter hardware and support functions. The CPU
- counter is initialized early to allow its use in the tracing and profiling
- of the system initialization sequence. This step is optional and depends
- on the application configuration.
-
-RTEMS_SYSINIT_INITIAL_EXTENSIONS
- Registers the initial extensions. This step is optional and depends on the
- application configuration.
-
-RTEMS_SYSINIT_MP_EARLY
- In MPCI configurations, an early MPCI initialization is performed in this
- step. This step is mandatory in MPCI configurations.
-
-RTEMS_SYSINIT_DATA_STRUCTURES
- This directive is called when the Board Support Package has completed its
- basic initialization and allows RTEMS to initialize the application
- environment based upon the information in the Configuration Table, User
- Initialization Tasks Table, Device Driver Table, User Extension Table,
- Multiprocessor Configuration Table, and the Multiprocessor Communications
- Interface (MPCI) Table.
-
-RTEMS_SYSINIT_MP
- In MPCI configurations, a general MPCI initialization is performed in this
- step. This step is mandatory in MPCI configurations.
-
-RTEMS_SYSINIT_USER_EXTENSIONS
- Initialization of the User Extensions object class. This step is optional
- and depends on the application configuration.
-
-RTEMS_SYSINIT_CLASSIC_TASKS
- Initialization of the Classic Tasks object class. This step is optional
- and depends on the application configuration.
-
-RTEMS_SYSINIT_CLASSIC_TASKS_MP
- In MPCI configurations, the Classic Tasks MPCI support is initialized in
- this step. This step is optional and depends on the application
- configuration.
-
-RTEMS_SYSINIT_CLASSIC_TIMER
- Initialization of the Classic Timer object class. This step is optional
- and depends on the application configuration.
-
-RTEMS_SYSINIT_CLASSIC_SIGNAL
- Initialization of the Classic Signal support. This step is optional and
- depends on the application configuration.
-
-RTEMS_SYSINIT_CLASSIC_SIGNAL_MP
- In MPCI configurations, the Classic Signal MPCI support is initialized in
- this step. This step is optional and depends on the application
- configuration.
-
-RTEMS_SYSINIT_CLASSIC_EVENT
- Initialization of the Classic Event support. This step is optional and
- depends on the application configuration. This step is only used on MPCI
- configurations.
-
-RTEMS_SYSINIT_CLASSIC_EVENT_MP
- In MPCI configurations, the Classic Event MPCI support is initialized in
- this step. This step is optional and depends on the application
- configuration.
-
-RTEMS_SYSINIT_CLASSIC_MESSAGE_QUEUE
- Initialization of the Classic Message Queue object class. This step is
- optional and depends on the application configuration.
-
-RTEMS_SYSINIT_CLASSIC_SEMAPHORE
- Initialization of the Classic Semaphore object class. This step is
- optional and depends on the application configuration.
-
-RTEMS_SYSINIT_CLASSIC_SEMAPHORE_MP
- In MPCI configurations, the Classic Semaphore MPCI support is initialized
- in this step. This step is optional and depends on the application
- configuration.
-
-RTEMS_SYSINIT_CLASSIC_PARTITION
- Initialization of the Classic Partition object class. This step is
- optional and depends on the application configuration.
-
-RTEMS_SYSINIT_CLASSIC_PARTITION_MP
- In MPCI configurations, the Classic Partition MPCI support is initialized
- in this step. This step is optional and depends on the application
- configuration.
-
-RTEMS_SYSINIT_CLASSIC_REGION
- Initialization of the Classic Region object class. This step is optional
- and depends on the application configuration.
-
-RTEMS_SYSINIT_CLASSIC_DUAL_PORTED_MEMORY
- Initialization of the Classic Dual-Ported Memory object class. This step
- is optional and depends on the application configuration.
-
-RTEMS_SYSINIT_CLASSIC_RATE_MONOTONIC
- Initialization of the Classic Rate-Monotonic object class. This step is
- optional and depends on the application configuration.
-
-RTEMS_SYSINIT_CLASSIC_BARRIER
- Initialization of the Classic Barrier object class. This step is optional
- and depends on the application configuration.
-
-RTEMS_SYSINIT_POSIX_SIGNALS
- Initialization of the POSIX Signals support. This step is optional and
- depends on the application configuration.
-
-RTEMS_SYSINIT_POSIX_THREADS
- Initialization of the POSIX Threads object class. This step is optional
- and depends on the application configuration.
-
-RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE
- Initialization of the POSIX Message Queue object class. This step is
- optional and depends on the application configuration.
-
-RTEMS_SYSINIT_POSIX_SEMAPHORE
- Initialization of the POSIX Semaphore object class. This step is optional
- and depends on the application configuration.
-
-RTEMS_SYSINIT_POSIX_TIMER
- Initialization of the POSIX Timer object class. This step is optional and
- depends on the application configuration.
-
-RTEMS_SYSINIT_POSIX_SHM
- Initialization of the POSIX Shared Memory object class. This step is
- optional and depends on the application configuration.
-
-RTEMS_SYSINIT_POSIX_KEYS
- Initialization of the POSIX Keys object class. This step is optional
- and depends on the application configuration.
-
-RTEMS_SYSINIT_POSIX_CLEANUP
- Initialization of the POSIX Cleanup support. This step is optional and
- depends on the application configuration.
-
-RTEMS_SYSINIT_IDLE_THREADS
- Initialization of idle threads. This step is mandatory.
-
-RTEMS_SYSINIT_LIBIO
- Initialization of IO library. This step is optional and depends on the
- application configuration.
-
-RTEMS_SYSINIT_ROOT_FILESYSTEM
- Initialization of the root filesystem. This step is optional and depends
- on the application configuration.
-
-RTEMS_SYSINIT_DRVMGR
- Driver manager initialization. This step is optional and depends on the
- application configuration. Only available if the driver manager is
- enabled.
-
-RTEMS_SYSINIT_MP_SERVER
- In MPCI configurations, the MPCI server is initialized in this step. This
- step is mandatory in MPCI configurations.
-
-RTEMS_SYSINIT_BSP_PRE_DRIVERS
- Initialization step performed right before device drivers are initialized.
- This step is mandatory.
-
-RTEMS_SYSINIT_DRVMGR_LEVEL_1
- Driver manager level 1 initialization. This step is optional and depends
- on the application configuration. Only available if the driver manager is
- enabled.
-
-RTEMS_SYSINIT_DEVICE_DRIVERS
- This step initializes all statically configured device drivers and performs
- all RTEMS initialization which requires device drivers to be initialized.
- This step is mandatory. In a multiprocessor configuration, this service
- will initialize the Multiprocessor Communications Interface (MPCI) and
- synchronize with the other nodes in the system.
-
-RTEMS_SYSINIT_DRVMGR_LEVEL_2
- Driver manager level 2 initialization. This step is optional and depends
- on the application configuration. Only available if the driver manager is
- enabled.
-
-RTEMS_SYSINIT_DRVMGR_LEVEL_3
- Driver manager level 3 initialization. This step is optional and depends
- on the application configuration. Only available if the driver manager is
- enabled.
-
-RTEMS_SYSINIT_DRVMGR_LEVEL_4
- Driver manager level 4 initialization. This step is optional and depends
- on the application configuration. Only available if the driver manager is
- enabled.
-
-RTEMS_SYSINIT_MP_FINALIZE
- Finalize MPCI initialization. This step is mandatory on MPCI
- configurations.
-
-RTEMS_SYSINIT_CLASSIC_USER_TASKS
- Creates and starts the Classic initialization tasks. This step is optional
- and depends on the application configuration.
-
-RTEMS_SYSINIT_POSIX_USER_THREADS
- Creates POSIX initialization threads. This step is optional and depends on
- the application configuration.
-
-RTEMS_SYSINIT_STD_FILE_DESCRIPTORS
- Open the standard input, output and error file descriptors. This step is
- optional and depends on the application configuration.
-
-The final action of the :c:func:`rtems_initialize_executive()` directive is to
-start multitasking and switch to the highest priority ready thread. RTEMS does
-not return to the initialization context and the initialization stack may be
-re-used for interrupt processing.
-
-Many of RTEMS actions during initialization are based upon the contents of the
-Configuration Table. For more information regarding the format and contents of
-this table, please refer to the chapter :ref:`Configuring a System`.
-
-Global Construction
--------------------
-
-The global construction is carried out by the first Classic API initialization
-task (first is defined by index zero in the Classic API initialization task
-configuration table). If no Classic API initialization task exists, then it is
-carried out by the first POSIX API initialization thread. If no initialization
-task or thread exists, then no global construction is performed, see for
-example :ref:`Specify Idle Task Performs Application Initialization`. The
-Classic API task or POSIX API thread which carries out global construction is
-called the main thread.
-
-Global construction runs before the entry function of the main thread. The
-configuration of the main thread must take the global construction into
-account. In particular, the main thread stack size, priority, attributes and
-initial modes must be set accordingly. Thread-local objects and POSIX key
-values created during global construction are accessible by the main thread.
-If other initialization tasks are configured, and one of them has a higher
-priority than the main thread and the main thread is preemptible, this task
-executes before the global construction. In case the main thread blocks during
-global construction, then other tasks may run. In SMP configurations, other
-initialization tasks may run in parallel with global construction. Tasks
-created during global construction may preempt the main thread or run in
-parallel in SMP configurations. All RTEMS services allowed in task context are
-allowed during global construction.
-
-Global constructors are C++ global object constructors or functions with the
-constructor attribute. For example, the following test program
-
-.. code-block:: c
-
- #include <stdio.h>
- #include <assert.h>
-
- class A {
- public:
- A()
- {
- puts( "A:A()" );
- }
- };
-
- static A a;
-
- static thread_local int i;
-
- static thread_local int j;
-
- static __attribute__(( __constructor__ )) void b( void )
- {
- i = 1;
- puts( "b()" );
- }
-
- static __attribute__(( __constructor__( 1000 ) )) void c( void )
- {
- puts( "c()" );
- }
-
- int main( void )
- {
- assert( i == 1 );
- assert( j == 0 );
- return 0;
- }
-
-should output:
-
-.. code-block:: shell
-
- c()
- b()
- A:A()
-
-Directives
-==========
-
-This section details the Initialization Manager's directives. A subsection is
-dedicated to each of this manager's directives and describes the calling
-sequence, related constants, usage, and status codes.
-
-.. raw:: latex
-
- \clearpage
-
-.. index:: initialize RTEMS
-.. index:: start multitasking
-.. index:: rtems_initialize_executive
-
-.. _rtems_initialize_executive:
-
-INITIALIZE_EXECUTIVE - Initialize RTEMS
----------------------------------------
-
-CALLING SEQUENCE:
- .. code-block:: c
-
- void rtems_initialize_executive(void);
-
-DIRECTIVE STATUS CODES:
- NONE - This function will not return to the caller.
-
-DESCRIPTION:
- Iterates through the system initialization linker set and invokes the
- registered handlers. The final step is to start multitasking.
-
-NOTES:
- This directive should be called by :c:func:`boot_card()` only.
-
- This directive *does not return* to the caller. Errors in the
- initialization sequence are usually fatal and lead to a system termination.