您的位置:首页 > 其它

RTEMS 4.9.4 bootcard.c 中的 boot_card 函数分析

2010-12-30 08:50 225 查看
RTEMS 4.9.4







进入 boot_card 函数即开始全面的初始化。

boot_card函数是~RTEMS~提供的一个通用初始化框架,不论在何种处理器上,都是使用这个框架为系统做初始化的工作。

它最大程度上复用了代码,也保证了所有的初始化动作尽可能用~C~语言撰写。它完成的工作按顺序罗列如下:

初始化执行环境,主要是关闭中断并处理~boot_card~函数的参数;

如果定义宏~BSP_BOOTCARD_HANDLES_RAM_ALLOCATION,则申请工作空间的内存,否则不执行此段代码;

调用~bsp_start~函数;

调用rtems_initialize_data_structures~函数初始化~RTEMS~内核中的数据结构;

如果定义宏~BSP_BOOTCARD_HANDLES_RAM_ALLOCATION,则完成动态内存、文件系统和库代码重入的初始化;

调用~bsp_pretasking_hook~函数。在早期的~RTEMS BSP~中,这个函数可以初始化~C~语言库,使得设备驱动可以使用~malloc~函数申请内存。现在使用通用初始化框架后,这个函数主要完成~C~运行库中的堆的初始化、文件系统的初始化和~newlib~库重入初始化;

如果定义宏~RTEMS_DEBUG,则调用~rtems_debug_enable~函数打开所有~RTEMS~支持的动态调试特性;

调用~rtems_initialize_before_drivers~函数完成一些需要在设备初始化之前完成的初始化动作;

调用~bsp_predriver_hook~函数初始化一些需要先于一般驱动初始化之前的驱动,如总线、空中断服务程序等;

调用~rtems_initialize_device_drivers~函数初始化所有驱动;

调用~bsp_postdriver_hook~函数打开控制台文件~stdin、stdout、stderr;

调用~rtems_initialize_start_multitasking~函数启动多任务,C++~的构造函数在进入第一个任务时被调用,

当用户调用~rtems_shutdown_executive~函数后,该函数才会返回;

调用~bsp_cleanup~函数执行~BSP~的关闭动作;

函数返回调用处,返回值为~0。

步骤~1~首先关闭中断。这个操作与处理器高度相关,系统会在切换第一个任务上下文到处理器上时打开中断。

接着处理~boot_card~函数的参数。通常,引导程序会将参数传递到操作系统中,用以指定与硬件环境相关的参数或其他信息。

通用的初始化框架只是从这个参数中获取应用程序的名称,如果失败,则指定一个默认的名称。

注意:CSB337~的启动代码并没有处理引导程序传递给操作系统的参数,更没有显式地传递参数到~boot_card~中。

步骤~2~需要定义宏~BSP_BOOTCARD_HANDLES_RAM_ALLOCATION~才能执行。

但在~rtems_initialize_data_structures~函数中,已完成了对应的工作,为内核的工作空间申请内存并初始化。

所以没有必要定义这个宏去执行步骤~2。

步骤~3~是调用~bsp_start~函数,这个函数主要完成一些与硬件高度相关的初始化操作。

比如说初始化锁相环~(Phase-Locked Loop,PLL)、实时时钟、获取内存空闲空间起始位置与尺寸等。

衡量是否将初始化放在这里可参考以下几个条件:

初始化动作与硬件相关并且不适合作为设备驱动,如处理器的锁相环初始化;

操作系统初始化内核数据所依赖的初始化操作,如获取内存空闲空间的起始位置以及尺寸、当前的真实时间等;

给硬件一个初始状态,防止单板或处理器发生状态错误,直到操作系统初始化相应的设备驱动,能正确的控制硬件设备。如初始化控制一些外部设备的~IO~口,防止默认电平引起外部设备的误动作;

初始化一些处理器中存在但是整个应用程序中都不会使用的设备,如初始化硬件看门狗。

步骤~4~初始化内核的数据结构,此步骤所做的操作将在后续章节中讨论。初始化内核数据结构之后,即可使用~RTEMS~的非阻塞函数。

因为多任务还没有开始,当前任务被阻塞后,没有一个处于就绪态的任务运行。

使用阻塞调用,只能产生一个严重的错误。

步骤~5,由于没有定义宏~BSP_BOOTCARD_HANDLES_RAM_ALLOCATION,这一步骤是不执行的。

步骤~6~与步骤~5~完成的工作是相同的,所以也没有必要定义这个宏。

步骤~7,如果配置时启用了~RTEMS~的调试功能,即~configure~时指定~--enable-rtems-debug~参数,则打开所有~RTEMS~支持的动态调试特性。

否则,生成的~RTEMS BSP~包不包含调试代码。

步骤~8~至~11~都是完成与驱动相关的操作,直至步骤~12~系统启动多任务,多任务启动成功即标志着操作系统初始化完毕。

如果在多任务中调用~rtems_shutdown_executive~函数或~POSIX~标准下的~exit~函数,都会使~RTEMS~从多任务返回。

步骤~13,执行一些关闭~RTEMS BSP~的动作。通常该函数可以什么都不做。

步骤~14,返回~0~给调用程序,此返回值无任何意义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: