RTEMS Network Transplantation - rtems system initialization process analysis

RTEMS network-driven migration, we must first know how to put the device initialization function into the initialization process, how to register the network card device to the system. This involves rtems the system initialization, the next specific analysis of the initialization process:

System initialization first stage:

This part of the code is mainly written in the compilation, part of the bsp, and then rtems into the second phase based on the c code initialization, but before entering the second stage, we must have a reliable operating environment, which is the first stage Assembly code work, summarized as follows:
  • 屏蔽中断
  • 初始化cpu工作模式
  • 建立内核堆栈
  • 对bss段清零
  • 建立基本的内存布局
The start code is located in / rtems / c / src / lib / libbsp / pc386 (here select the corresponding processor) /start/start.s The function call is shown in the following figure:



The general implementation process is as follows:

  • 屏蔽中断
  • 读取grub传递的multiboot_info,存放到boot_multiboot_info结构中
  • 跳转到_load_segment处,加载与pc硬件相关的全局描述符和中断描述符
  • 跳转到_establish,建立rtems内核栈空间
  • 清除BSS
  • 调用initvideo函数进行显示初始化
  • 调用checkcputypesetcr0查找cpu类型
  • 设定调用参数,调用第一个c函数boot_card

System initialization second stage:

This stage is mainly to initialize the kernel components and drivers to prepare, and bsp closely linked, the main work is as follows:
  • 初始化rtems_cpu_table结构体的cpu_table全局变量
  • 初始化rtems_configuration_table结构体的configuration全局变量
  • 设置rtems workspace区域
  • 初始化中断和异常管理 初始化pci bios interface


The boot_card function first updates the cpu configuration table and the rtems configuration table, and then calls the bsp_start function, which performs the following tasks:
  • 计算1ms时间指令的loop值
  • 进一步更新rtems的cpu配置表
  • 制定rtems的workspace的起始地址并分配空间
  • 初始化pci bios interface

After executing the bsp_start function, proceed to the third stage and begin executing the rtems_initialize_executive_early function.


System initialization Phase 3:

This phase of the workload relative to the first two stages to be much larger, the ultimate goal is to complete the multi-task switch, and switch to the user to provide the task, this part of the main work is:
  • 初始化rtems核心层和系统服务层的功能组件
  • 初始化驱动程序
  • 进行多任务初始化

Initialize rtems:

The main operation of the initialization manager is embodied in the implementation mechanism of the rtems_initialize_executive function. If you do not use this mechanism, you can also initialize the implementation mechanism of the rtems_initialize_executive_early function and the rtems_initialize_executive_late function. In rtems can only use a method to initialize the system, can not be repeated initialization.

Initialize all drivers:

This is divided into four steps, before the implementation of the initialization driver, the need to implement the hook function (predriver_hook), and then the implementation of IO_initialize_all_drivers () to complete the specific driver initialization process.


The specific code is as follows:
bootcard.c
/** * @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!!! * *************************************************************** ***************************************************************/ }

Which contains three calls to the initialization function:
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 );


The boot_card function contains the rtems_initialize_executive function, which is the initialization management function located in the exinit.c file:
exinit.c
/** * @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 ****** ******************************************************************* ******************************************************************* *******************************************************************/ }
The IO_initialize_all_drivers () function is defined in the io.c file
#if HAVE_CONFIG_H #include "config.h" #endif #include <rtems/ioimpl.h> bool _IO_All_drivers_initialized; void _IO_Initialize_all_drivers( void ) { rtems_device_major_number major; _IO_All_drivers_initialized = true; for ( major=0 ; major < _IO_Number_of_drivers ; major ++ ) (void) rtems_io_initialize( major, 0, NULL ); }

Finally, in the rtems_initialize_executive function, the implementation of _Thread_Start_multitasking (); start multi-task mode, rtems system initialization work is over.

评论

此博客中的热门博文

Developed the I2C driver for Beaglebone Black BSP

Compiling RTEMS for Beaglebone Black BSP

How to generate image file and dd to SD card