/*** @file** @ingroup bsp_bootcard** @brief Standard system startup.** This is the C entry point for ALL RTEMS BSPs. It is invoked* from the assembly language initialization file usually called* start.S. It provides the framework for the BSP initialization* sequence. For the basic flow of initialization see RTEMS C User's Guide,* Initialization Manager.** This style of initialization ensures that the C++ global* constructors are executed after RTEMS is initialized.* Thanks to Chris Johns <cjohns@plessey.com.au> for the idea* to move C++ global constructors into the first task.*//** COPYRIGHT (c) 1989-2014.* 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.org/license/LICENSE.*/#include <bsp/bootcard.h>#include <rtems.h>#include <rtems/sysinit.h>/** At most a single pointer to the cmdline for those target* short on memory and not supporting a command line.*/
const char *bsp_boot_cmdline;RTEMS_SYSINIT_ITEM(bsp_work_area_initialize,RTEMS_SYSINIT_BSP_WORK_AREAS,RTEMS_SYSINIT_ORDER_MIDDLE
);RTEMS_SYSINIT_ITEM(bsp_start,RTEMS_SYSINIT_BSP_START,RTEMS_SYSINIT_ORDER_MIDDLE
);RTEMS_SYSINIT_ITEM(bsp_predriver_hook,RTEMS_SYSINIT_BSP_PRE_DRIVERS,RTEMS_SYSINIT_ORDER_MIDDLE
);/** This is the initialization framework routine that weaves together* calls to RTEMS and the BSP in the proper sequence to initialize* the system while maximizing shared code and keeping BSP code in C* as much as possible.*/
void boot_card(const char *cmdline
)
{rtems_interrupt_level bsp_isr_level;/** Make sure interrupts are disabled.*/(void) bsp_isr_level;rtems_interrupt_local_disable( bsp_isr_level );bsp_boot_cmdline = cmdline;rtems_initialize_executive();/******************************************************************************************************************************* APPLICATION RUNS NOW!!! We will not return to here!!! *******************************************************************************************************************************/
}
/*** @file** @brief Initialization Manager** @ingroup ClassicRTEMS*//** COPYRIGHT (c) 1989-2014.* 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.org/license/LICENSE.*/#if HAVE_CONFIG_H#include "config.h"#endif#include <rtems/system.h>#include <rtems/config.h>#include <rtems/extensionimpl.h>#include <rtems/init.h>#include <rtems/ioimpl.h>#include <rtems/sysinit.h>#include <rtems/score/sysstate.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>#include <rtems/score/priority.h>#include <rtems/score/schedulerimpl.h>#include <rtems/score/smpimpl.h>#include <rtems/score/timecounter.h>#include <rtems/score/threadimpl.h>#include <rtems/score/todimpl.h>#include <rtems/score/wkspace.h>const char _Copyright_Notice[] =
"COPYRIGHT (c) 1989-2008.\n\
On-Line Applications Research Corporation (OAR).\n";static Objects_Information *
_Internal_Objects[ OBJECTS_INTERNAL_CLASSES_LAST + 1 ];static Objects_Information *_RTEMS_Objects[ OBJECTS_RTEMS_CLASSES_LAST + 1 ];static Objects_Information *_POSIX_Objects[ OBJECTS_POSIX_CLASSES_LAST + 1 ];Objects_Information ** const
_Objects_Information_table[ OBJECTS_APIS_LAST + 1 ] = {NULL,&_Internal_Objects[ 0 ],&_RTEMS_Objects[ 0 ],&_POSIX_Objects[ 0 ]
};API_Mutex_Control *_RTEMS_Allocator_Mutex;API_Mutex_Control *_Once_Mutex;static void rtems_initialize_data_structures(void)
{/** Dispatching and interrupts are disabled until the end of the* initialization sequence. This prevents an inadvertent context* switch before the executive is initialized.** WARNING: Interrupts should have been disabled by the BSP and* are disabled by boot_card().*//** Initialize any target architecture specific support as early as possible*/_CPU_Initialize();_Thread_Dispatch_initialization();_ISR_Handler_initialization();_API_Mutex_Initialization( 2 );_API_Mutex_Allocate( &_RTEMS_Allocator_Mutex );_API_Mutex_Allocate( &_Once_Mutex );_Thread_Handler_initialization();_Scheduler_Handler_initialization();_SMP_Handler_initialize();
}RTEMS_LINKER_ROSET( _Sysinit, rtems_sysinit_item );RTEMS_SYSINIT_ITEM(rtems_initialize_data_structures,RTEMS_SYSINIT_DATA_STRUCTURES,RTEMS_SYSINIT_ORDER_MIDDLE
);/** 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.** Scheduling can properly occur afterwards as long as we avoid dispatching.*/
RTEMS_SYSINIT_ITEM(_Thread_Create_idle,RTEMS_SYSINIT_IDLE_THREADS,RTEMS_SYSINIT_ORDER_MIDDLE
);/* Initialize I/O drivers.** Driver Manager note:* All drivers may not be registered yet. Drivers will dynamically* be initialized when registered in level 2,3 and 4.*/
RTEMS_SYSINIT_ITEM(_IO_Initialize_all_drivers,RTEMS_SYSINIT_DEVICE_DRIVERS,RTEMS_SYSINIT_ORDER_MIDDLE
);void rtems_initialize_executive(void)
{const volatile rtems_sysinit_item *cur = RTEMS_LINKER_SET_BEGIN(_Sysinit );const volatile rtems_sysinit_item *end = RTEMS_LINKER_SET_END( _Sysinit );/* Invoke the registered system initialization handlers */while ( cur != end ) {
( *cur->handler )(); ++cur;}_System_state_Set( SYSTEM_STATE_UP );_SMP_Request_start_multitasking();_Thread_Start_multitasking();/*************************************************************************************************************************************************************************************************************** APPLICATION RUNS HERE ************ THE FUNCTION NEVER RETURNS ***************************************************************************************************************************************************************************************************************/
}