RTEMS:板支持包BSP概述
22.1: 介绍
%A
%A 板支持包 (BSP) 是一组用户提供的软件用于让RTEMS以及应用程序访问对应的硬件平台。这些软件包括硬件初始化代码,设备驱动程序,用户扩展,多处理器接口等。然而,最小的BSP可以只包括处理器复位,初始化。
%A 22.2: 复位和初始化
%A
%A 当处理器被复位时,基于RTEMS的应用就会重新初始化。初始化代码负责初始化硬件平台的各个器件。虽然在不同的硬件平台上,初始化代码不同,但是这些代码的逻辑功能却是大同小异。
%A
%A 一般来说,初始化被分成两部分完成初始化,调用rtems_initialize_executive(重新设定应用初始化)函数前的工作和 rtems_initialize_executive函数调用后的用户初始化任务(本地和全局应用初始化)。启始过程是按照下面的次序进行的:
%A
%A • 重新进行应用初始化设置
%A
%A • 调用rtems_initialize_executive
%A
%A • 本地和全局应用初始化
%A
%A 处理器复位时,初始化代码就会执行。所有的设备必须在RTEMS初始化前进行必要的设置,这些初始化工作使用BSP的初始化模块完成。
%A
%A 由于RTEMS将会使用处理器的中断向量表,这些向量表必须在使用前初始化。由于中断是在RTEMS调用 rtems_initialize_executive函数时启用的,所以必须在此以前正确的设置中断向量表以确保系统正确工作。此后RTEMS的初始化过程中,会使用rtems_interrupt_catch函数修改向量表。在一些处理器上面,RTEMS将会自动在初始化时设置自己的中断向量表,这样就不需要手工初始化。
%A
%A 在rtems_initialize_executive后的代码需要完成下面的工作。
%A
%A • 初始化完成前不能调用RTEMS系统函数
%A
%A • 如果处理器支持多重优先级,那么必须让处理器运行在最高优先级上(对于ARM来说应该在supervisory态执行)。
%A
%A • 必须为rtems_initialize_executive函数分派空间大于 RTEMS_MINIMUM_STACK_SIZE的栈而且初始化栈指针。
%A
%A • 必须初始化处理器的中断向量表。
%A
%A • 必须屏蔽所有中断。
%A
%A • 如果处理器支持多个中断堆栈,那么必须为每个栈分配空间并且初始化栈顶指针。
%A
%A rtems_initialize_executive 函数不返回到初始化代码,只是启动最高优先级的初始化任务。该任务初始化本地和全局的应用。 一般来说该任务将会创建应用所需要的所有任务。
%A 22.2.1 : 中断栈需求
%A
%A 进行应用设计的时候,为中断ISR分配的栈空间大小应该考虑到最坏的情况。如果对应的处理器允许中断嵌套,栈空间的大小必须与处理器允许的中断嵌套层次成正比。通常来说,栈空间的大小和下面的因素有关:
%A
%A 处理器中断栈帧(stack frame,可以看成堆栈中的小单元)大小
%A
%A 处理器使用栈帧的子例程
%A
%A RTEMS 系统调用
%A
%A 需要在堆栈中保存的寄存器
%A
%A 应用子例程调用
%A
%A 中断栈的大小一定本能小与系统定义的RTEMS_MINIMUM_STACK_SIZE。
%A 22.2.2 : 具有中断栈的处理器
%A
%A 一些处理器为中断提供了专门的堆栈(和应用程序堆栈区分)。当中断以向量形式存在,并且不支持嵌套,那么处理器将最自动从当前堆栈切换到中断堆栈。中断堆栈的大小依赖于中断处理程序使用堆栈的最大值。
%A
%A 共整个应用使用的堆栈在系统复位或者初始化时由BSP负责初始化。由于所有的ISR都会使用该堆栈。由于所有的ISR都会使用该中断堆栈,那么堆栈的大小应该考虑各种中断嵌套组合时使用堆栈的最大值。
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。