5. System Initialization¶
5.1. Introduction¶
The system initialization consists of a low-level initialization performed by
the start code in the start file (start.o
) and a high-level
initialization carried out by boot_card()
. The final step of a
successful high-level initialization is to switch to the initialization task
and change into the normal system mode with multi-threading enabled. Errors
during system initialization are fatal and end up in a call to
_Terminate()
.
5.2. Low-Level Initialization via Start Code in the Start File (start.o)¶
The start code in the start file (start.o
) must be provided by the BSP.
It is the first file presented to the linker and starts the process to link an
executable (application image). It should contain the entry symbol of the
executable. It is the responsibility of the linker script in conjunction with
the compiler specifications file or compiler options to put the start code in
the correct location in the executable. The start code is typically written in
assembly language since it will tinker with the stack pointer. The general
rule of thumb is that the start code in assembly language should do the minimum
necessary to allow C code to execute to complete the initialization sequence.
The low-level system initialization may depend on a platform initialization carried out by a boot loader. The low-level system initialization may perform the following steps:
Initialize the initialization stack. The initialization stack should use the ISR stack area. The symbols
_ISR_Stack_area_begin
,_ISR_Stack_area_end
, and_ISR_Stack_size
should be used to do this.Initialize processor registers and modes.
Initialize pins.
Initialize clocks (PLLs).
Initialize memory controllers.
Initialize instruction, data, and unified caches.
Initialize memory management or protection units (MMU).
Initialize processor exceptions.
Copy the data sections from a read-only section to the runtime location.
Set the BSS (
.bss
) section to zero.Initialize the C runtime environment.
Call
boot_card()
to hand over to the high-level initialization.
For examples of start file codes see:
5.3. High-Level Initialization via boot_card()¶
The high-level initialization is carried out by boot_card()
. For the
high-level initialization steps see the Initialization Manager chapter in the
RTEMS Classic API Guide. There are several system initialization steps which
must be implemented by the BSP.
5.3.1. Early BSP Initialization¶
The BSP may provide a system initialization handler (order
RTEMS_SYSINIT_BSP_EARLY
) to perform an early BSP initialization.
This handler is invoked before the memory information and high-level dynamic
memory services (workspace and C program heap) are initialized.
5.3.2. Memory Information¶
The BSP must provide the memory information to the system with an
implementation of the _Memory_Get()
function. The BSP should use the
default implementation in
bsps/shared/shared/start/bspgetworkarea-default.c.
The memory information is used by low-level memory consumers such as the
per-CPU data, the workspace, and the C program heap. The BSP may use a system
initialization handler (order RTEMS_SYSINIT_MEMORY
) to set up the
infrastructure used by _Memory_Get()
.
5.3.3. BSP Initialization¶
The BSP must provide an implementation of the bsp_start()
function.
This function is registered as a system initialization handler (order
RTEMS_SYSINIT_BSP_START
) in the module implementing
boot_card()
. The bsp_start()
function should perform a
general platform initialization. The interrupt controllers are usually
initialized here. The C program heap may be used in this handler. It is not
allowed to create any operating system objects, e.g. RTEMS semaphores or tasks.
The BSP may register additional system initialization handlers in the module
implementing bsp_start()
.
5.4. Error Handling¶
Errors during system initialization are fatal and end up in a call to
_Terminate()
. See also the Fatal Error Manager chapter in the
RTEMS Classic API Guide.
The BSP may use BSP-specific fatal error codes, see <bsp/fatal.h>.
The BSP should provide an initial extension which implements a fatal error
handler. It should use the default implementation provided by
<bsp/default-initial-extension.h> and
bspfatal-default.c.
If the default implementation is used, the BSP must implement a
bsp_reset()
function which should reset the platform.