|
RTEMS的初始化管理器
作者 Ray
RTEMS版权所有,转载请注明来源www.rtems.net,作者Ray
7.1 摘要
初始化管理器负责启动和关闭
RTEMS 。 启动RTEMS包括创建并且启动所有的配置好的初始化任务, 并且初始化RTEMS系统使用到的设备驱动程序。 在多处理器系统中,初始化管理器也设定处理器间通信层的初值。
由初始化管理器提供的指令是:
rtems_initialize_executive- 初始化 RTEMS
rtems_initialize_executive_early- 初始化 RTEMS ,但是和 rtems_initialize_executive
不同的是, 该函数并不启动 RTEMS 的多任务。
rtems_initialize_executive_late- 完成初始化而且启动 多任务
rtems_shutdown_executive- 关闭 RTEMS
7.2 背景知识
7.2.1初始化任务
初始化任务将初始化 RTEMS ,然后将处理器控制移交到用户应用程序。初始化任务和其他应用层任务不同。初始化任务定义在用户初始化任务表中,由
RTEMS 创建并且启动。由于初始化任务和其他任务一样接受 RTEMS 任务管理器的调度,所以为了保证在其它应用任务启动前初始化任务能先启动,必须分配给它一个较高的优先级。虽然系统初始化任务可以是一个,也可以是多个,并且在个数上没有上限,但是至少要有一个。
标准的初始化任务创建并且启动配置好的应用程序,也可以创建应用任务需要的对象。一般来说,对于设计良好的初始化任务代码,在初始化结束的时候,必须将自己删除,并且释放自己占用的资源。初始化任务也可以转换成普通的应用任务。在做这样的转换的时候必须更该任务的优先级。通常来说,
RTEMS 并不会自动删除初始化任务。
7.2.2: 系统初始化任务
系统初始化任务负责初始化所有的设备驱动,在多处理器系统中,系统初始化任务还负责初始化多处理器通信接口层(MPCI)。
为保证直到所有的器件驱动器被正确初始化,其他的应用任务才会运行。 因而,该任务相对于其他任务来说有一个较高的优先级,在单处理器系统中,设备初始化之后,任务将会划除它本身。
系统初始化任务需要有充足的栈空间,否则无法初始化所有的设备驱动。在初始化多处理器系统时,需要初始化处理器配置表,该表包含一个字段,该字段允许动态增加分派给应用或
BSP 的栈空间的尺寸。
在多处理器系统中,系统初始化任务在初始化设备驱动后不删除它本身。 相反,它把它本身转变成多处理服务任务,该任务设定多处理器通信接口层,核查多处理器系统一致性,
而且处理来自远端结点所有的请求。
7.2.3: 空闲任务
只有当没有其他的任务准备好运行的时候,空闲任务是一个优先级最低的任务(该任务本身就是一个消耗CPU时间的无限循环)。 当其他任务就绪时,空闲任务使用处理器的权力就会被剥夺
7.2.4: 初始化管理器失效
出现初始化失效错误时,rtems_initialize_executive 将会调用rtems_ifatal_error_occurred
指令,常见的初始化错误包括:
1 没有被提供处理器配置表格或处理器相关的信息表格。
2 如果处理器配置表格中提供的RTEMS在RAM储存器工作空间中入口地址是空值或者没有按照四字节的格式对齐(也就是说入口地址不是4的整数倍)。
3 如果 RTEMS 系统的RAM 储存器工作空间的大小,不够设定初始化系统。
4 如果被指定的中断栈大小太小。
5 如果是多处理器系统,但是多处理器配置表格的结点数目无效(不在1和 maximum_nodes 之间)。
6 如果配置成多处理器系统,但是没有分配多处理器通信接口层。
7 如果没有配置用户初始化任务。为了正确的将控制权从系统转移到应用任务,必须至少有一个初始化任务。
8 如果用户初始化任务中有一个不能够被成功地创建或启动。
7.3: 操作
7.3.1: 初始化 RTEMS
当板级支持包(BSP)完成初始化的动作后,BSP会调用rtems_initialize_executive
指令。
rtems_initialize_executive 指令通过完成下列的行动实现系统的初始化:
-
初始化RTEMS 内部变量变量;
-
分派系统资源;
-
创建并且开始系统初始化任务;
-
创建并且开始空闲任务;
-
创建并且开始用户初始化任务; 并且且
-
开始多任务处理。
rtems_initialize_executive 指令一定要在其他所有的 RTEMS
指令之前被调用。 因为在初始化函数 rtems_initialize_executive 完成前,任何 RTEMS 系统调用的结果都是不可预知的。
在初始化时所做的动作基本上是以配置表格和处理器相关信息表格为基础。 这两个表的配置后面章节还会有详细说明。
初始化序列的最后步骤是启动多任务管理器。
当调度和分派程序启动,他们会拥有最高的优先级,准备好的任务将会被调度。在任务调度器启动后,程序的控制逻辑将不被回到BSP,除非是调用了rtems_shutdown_executive。
rtems_initialize_executive 指令提供一个概念简单的方法初始化
RTEMS 。 然而,在特定的情况,如果不能使用该机制,RTEMS还提供了一个更为灵活的方案。该方案使用rtems_initialize_executive_early
和 rtems_initialize_executive_late 指令初始化RTEMS。rtems_initialize_executive_early
指令在启动启动多任务处理之前回返。 rtems_initialize_executive_late 指令用于启动多任务。 需要注意的是在RTEMS中只能使用一种方案初始化系统,也就是说不能重复初始化。
7.3.2: 关闭 RTEMS
rtems_shutdown_executive 指令被结束对板的多任务处理和回返控制支持包裹的应用叫唤。 板支持包裹在
[代]码重新开始执行立刻跟随 rtems_initialize_executive 指令的启用。
7.3.2: 关闭 RTEMS
在应用任务结束的时候使用rtems_shutdown_executive函数结束多任务处理和并且将控制权交还给BSP。BSP将执行rtems_initialize_executive
指令调用后的后序指令。
7.4: 指令
初始化管理器 INITIALIZE_EXECUTIVE- 初始化 RTEMS
初始化管理器 INITIALIZE_EXECUTIVE_EARLY- 初始化 RTEMS 但是不启动多任务
INITIALIZE_EXECUTIVE_LATE- 接在INITIALIZE_EXECUTIVE_EARLY后面,完成初始化并且启动多任务管理器
初始化管理器 SHUTDOWN_EXECUTIVE- 关闭 RTEMS
本节将更为深入的介绍初始化管理器的指令使用。包括每一个初始化管理器的指令相关的相关的常量,用法和状态编码。
7.4.1: INITIALIZE_EXECUTIVE- 初始化 RTEMS
指令格式 :
void rtems_initialize_executive(
rtems_configuration_table *configuration_table,
rtems_cpu_table *cpu_table
);
描述 :
当 BSP 的初始化已经完成 , 它允许 RTEMS 初始化 RTOS, 初始化信息参数包括 configuration_table
和 cpu_table 。其中configuration_table的定义如下:
typedef struct {
void *work_space_start;
rtems_unsigned32 work_space_size;
rtems_unsigned32 maximum_extensions;
rtems_unsigned32 microseconds_per_tick;
rtems_unsigned32 ticks_per_timeslice;
rtems_unsigned32 maximum_devices;
rtems_unsigned32 maximum_drivers;
rtems_unsigned32 number_of_device_drivers;
rtems_driver_address_table *Device_driver_table;
rtems_unsigned32 number_of_initial_extensions;
rtems_extensions_table *User_extension_table;
rtems_multiprocessing_table *User_multiprocessing_table;
rtems_api_configuration_table *RTEMS_api_configuration;
posix_api_configuration_table *POSIX_api_configuration;
itron_api_configuration_table *ITRON_api_configuration;
} rtems_configuration_table;
他包含了设备表用户扩展表 ( User_extension_table), 用于配置多处理器和多处理器通信层的多任务的多处理配置表
( User_multiprocessing_table), 用户扩展表 ( User_extension_table), 此外该表的最后三个表项指向上层
API,API 的表项可以不用全部填充 , 不需要的 API 填充 NULL 就可以了。函数的第二个参数rtems_cpu_table定义了多CPU的配置参数。该指令被调用后,该指令启动多任务管理器,然后在后台运行直到调用
rtems_shutdown_executive 指令。
注意:
该指令必须是RTEMS调用的第一个指令,而且它不会返回,而是变成后台线程,直到调用 rtems_shutdown_executive
。
该指令导致系统的所有结点的配置一保持一致性。 如果一个不一致性被发现,然后一个致命的差错被产生。
7.4.2 INITIALIZE_EXECUTIVE_EARLY-初始化 RTEMS但不开启多任务管理器:
rtems_interrupt_level rtems_initialize_executive_early(
rtems_configuration_table*configuration_table,
rtems_cpu_table *cpu_table
);
当BSP已经完成它的初始化,函数的参数和rtems_initialize_executive相同。该指令在完成基本的 RTEMS 初始化之后会返回。
当指令调用结束时,会返回当前的优先级,该优先级将会作为 rtems_initialize_executive_late 的优先级。
7.4.3 INITIALIZE_EXECUTIVE_LATE- 完成初始化并启动多任务处理
void rtems_initialize_executive_late(
rtems_interrupt_level bsp_level
);
描述:
该指令在rtems_initialize_executive_early 指令后调用,参数bsp_level一般采用rtems_initialize_executive_early
指令返回值。反映了BSP任务的当前优先级状况。当rtems_shutdown_executive指令调用后。
注意:
rtems_initialize_executive_late必须和rtems_initialize_executive_early配对使用。该指令执行后会一直在后台运行,直到调用
rtems_shutdown_executive 。
该指令也会同步系统所有结点。如果出现不一致的状况,函数会产生异常。
7.4.4: SHUTDOWN_EXECUTIVE- 关闭 RTEMS
void rtems_shutdown_executive(
rtems_unsigned32 result
);
描述:
当应用程序愿关闭 RTEMS 的系统服务并且将对CPU的控制权交还给BSP板支持包裹时,就会调用该指令。BSP将会执行rtems_initialize_executive指令的后序命令。
|