Files
rtems/cpukit/sapi/src/exinit.c
T
Joel Sherrill d86ae064a0 2008-05-12 Joel Sherrill <joel.sherrill@OARcorp.com>
* sapi/include/rtems/init.h, sapi/src/exinit.c: Refactored and renamed
	initialization routines to rtems_initialize_data_structures,
	rtems_initialize_before_drivers, rtems_initialize_device_drivers, and
	rtems_initialize_start_multitasking. This opened the sequence up so
	that bootcard() could provide a more robust and flexible framework
	which is easier to explain and understand. This also lays the
	groundwork for sharing the division of available memory between the
	RTEMS workspace and heap and the C library initialization across all
	BSPs.
2008-05-12 18:40:59 +00:00

277 lines
6.8 KiB
C

/*
* Initialization Manager
*
* COPYRIGHT (c) 1989-2008.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.com/license/LICENSE.
*
* $Id$
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
/*
* SCORE_INIT and SAPI_INIT are defined so all of the super core and
* super API data will be included in this object file.
*/
#define SAPI_INIT
#define SCORE_INIT
#include <rtems/system.h>
#include <rtems/config.h>
#include <rtems/debug.h>
#include <rtems/extension.h>
#include <rtems/fatal.h>
#include <rtems/init.h>
#include <rtems/io.h>
#include <rtems/score/sysstate.h>
#include <rtems/score/apiext.h>
#include <rtems/score/apimutex.h>
#include <rtems/score/copyrt.h>
#include <rtems/score/heap.h>
#include <rtems/score/interr.h>
#include <rtems/score/isr.h>
#if defined(RTEMS_MULTIPROCESSING)
#include <rtems/score/mpci.h>
#endif
#include <rtems/score/priority.h>
#include <rtems/score/thread.h>
#include <rtems/score/tod.h>
#include <rtems/score/userext.h>
#include <rtems/score/watchdog.h>
#include <rtems/score/wkspace.h>
#include <rtems/sptables.h>
#include <rtems/rtems/rtemsapi.h>
#ifdef RTEMS_POSIX_API
#include <rtems/posix/posixapi.h>
#endif
#ifdef RTEMS_ITRON_API
#include <rtems/itron/itronapi.h>
#endif
Objects_Information *_Internal_Objects[ OBJECTS_INTERNAL_CLASSES_LAST + 1 ];
void rtems_initialize_data_structures(
rtems_configuration_table *configuration_table
)
{
rtems_interrupt_level bsp_level;
/*
* Dispatching and interrupts are disabled until the end of the
* initialization sequence. This prevents an inadvertent context
* switch before the executive is initialized.
*/
_ISR_Disable( bsp_level );
/*
* Make sure the parameters were not NULL.
*/
if ( configuration_table == NULL )
_Internal_error_Occurred(
INTERNAL_ERROR_CORE,
TRUE,
INTERNAL_ERROR_NO_CONFIGURATION_TABLE
);
/*
* Provide pointers just for later convenience.
*/
_Configuration_Table = configuration_table;
/*
* Initialize any target architecture specific support as early as possible
*/
_CPU_Initialize( _Thread_Dispatch );
#if defined(RTEMS_MULTIPROCESSING)
/*
* Initialize the system state based on whether this is an MP system.
* In an MP configuration, internally we view single processor
* systems as a very restricted multiprocessor system.
*/
_Configuration_MP_table = configuration_table->User_multiprocessing_table;
if ( _Configuration_MP_table == NULL ) {
_Configuration_MP_table =
(void *)&_Initialization_Default_multiprocessing_table;
_System_state_Handler_initialization( FALSE );
} else {
_System_state_Handler_initialization( TRUE );
}
#else
_System_state_Handler_initialization( FALSE );
#endif
/*
* Do this as early as possible to insure no debugging output
* is even attempted to be printed.
*/
_Debug_Manager_initialization();
_API_extensions_Initialization();
_Thread_Dispatch_initialization();
/*
* Before this is called, we are not allowed to allocate memory
* from the Workspace because it is not initialized.
*/
_Workspace_Handler_initialization(
(void *)configuration_table->work_space_start,
configuration_table->work_space_size
);
_User_extensions_Handler_initialization(
configuration_table->number_of_initial_extensions,
configuration_table->User_extension_table
);
_ISR_Handler_initialization();
_Objects_Handler_initialization(
#if defined(RTEMS_MULTIPROCESSING)
_Configuration_MP_table->node,
_Configuration_MP_table->maximum_nodes,
_Configuration_MP_table->maximum_global_objects
#endif
);
_Objects_Information_table[OBJECTS_INTERNAL_API] = _Internal_Objects;
/*
* Initialize the internal allocator Mutex
*/
_API_Mutex_Initialization( 1 );
_API_Mutex_Allocate( &_RTEMS_Allocator_Mutex );
_Priority_Handler_initialization();
_Watchdog_Handler_initialization();
_TOD_Handler_initialization( configuration_table->microseconds_per_tick );
_Thread_Handler_initialization(
configuration_table->ticks_per_timeslice,
configuration_table->maximum_extensions
#if defined(RTEMS_MULTIPROCESSING)
,
_Configuration_MP_table->maximum_proxies
#endif
);
#if defined(RTEMS_MULTIPROCESSING)
_MPCI_Handler_initialization(
_Configuration_MP_table->User_mpci_table,
RTEMS_TIMEOUT
);
#endif
/* MANAGERS */
_RTEMS_API_Initialize( configuration_table );
_Extension_Manager_initialization( configuration_table->maximum_extensions );
_IO_Manager_initialization(
configuration_table->Device_driver_table,
configuration_table->number_of_device_drivers,
configuration_table->maximum_drivers
);
#ifdef RTEMS_POSIX_API
_POSIX_API_Initialize( configuration_table );
#endif
#ifdef RTEMS_ITRON_API
_ITRON_API_Initialize( configuration_table );
#endif
_System_state_Set( SYSTEM_STATE_BEFORE_MULTITASKING );
/*
* No threads should be created before this point!!!
* _Thread_Executing and _Thread_Heir are not set.
*
* At this point all API extensions are in place. After the call to
* _Thread_Create_idle() _Thread_Executing and _Thread_Heir will be set.
*/
_Thread_Create_idle();
/*
* Scheduling can properly occur now as long as we avoid dispatching.
*/
}
void rtems_initialize_before_drivers(void)
{
#if defined(RTEMS_MULTIPROCESSING)
_MPCI_Create_server();
#endif
/*
* Run the API and BSPs predriver hook.
*/
_API_extensions_Run_predriver();
}
void rtems_initialize_device_drivers(void)
{
/*
* Initialize all the device drivers and initialize the MPCI layer.
*
* NOTE: The MPCI may be build upon a device driver.
*/
_IO_Initialize_all_drivers();
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing ) {
_MPCI_Initialization();
_MPCI_Internal_packets_Send_process_packet(
MPCI_PACKETS_SYSTEM_VERIFY
);
}
#endif
/*
* Run the APIs and BSPs postdriver hooks.
*
* The API extensions are supposed to create user initialization tasks.
*/
_API_extensions_Run_postdriver();
}
void rtems_initialize_start_multitasking(void)
{
_System_state_Set( SYSTEM_STATE_BEGIN_MULTITASKING );
_Thread_Start_multitasking();
/*******************************************************************
*******************************************************************
*******************************************************************
****** APPLICATION RUNS HERE ******
****** RETURNS WHEN SYSTEM IS SHUT DOWN ******
*******************************************************************
*******************************************************************
*******************************************************************/
}