RTEMS:系统剪裁与配置
26.1: 介绍
%A
%A RTEMS中,需要对应用进行手工或者自动配置。需要配置的信息包括每个时钟tick的实际时间值,RTEMS上能创建的对象数目,应用初始化任务,和应用的设备驱动。这些信息存放在 RTEMS中的数据结构中。本章介绍了手工配置的要点,也介绍了如何进行简单的自动配置。
%A
%A
%A 26.2: 系统的自动配置
%A
%A RTEMS 提供 confdefs.h C语言头文件,该头文件是自动配置中使用的重要文件。该文件中包含了大量的宏定义,这些宏用来创建系统的配置表。confdefs.h中,程序员可以定义需要设定的配置参数,这样就可以不用手动设置每一个配置表了。下面的例子中,配置了一个使用消息队列并且时间片为50微秒的系统
%A
%A
%A
%A #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
%A
%A #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
%A
%A
%A
%A #define CONFIGURE_MICROSECONDS_PER_TICK 1000 /* 1 millisecond */
%A
%A #define CONFIGURE_TICKS_PER_TIMESLICE 50 /* 50 milliseconds */
%A
%A
%A
%A #define CONFIGURE_MAXIMUM_TASKS 4
%A
%A #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
%A
%A
%A
%A 这个系统将会使用任务 Init 为启动任务。同时配置成有一个控制台设备驱动 ( 为标准的输入/输出) 和一个时钟设备驱动的系统。
%A
%A 为了使confdefs.h中的配置生效,一定要定义CONFIGURE_INIT常量,该常量在包含confdefs.h的应用程序中定义。
%A
%A 程序员应该注意系统配置的默认值一般都是尽可能的小。缺省情况下,不会为应用分配资源。confdefs.h 文件确保至少有一个用户任务(线程),并且至少有一个初始化任务配置表。
%A
%A confdefs.h 文件中将估算RTEMS 运行所需的内存。如果提供的信息不精确,那么这个估算通常不是那么精确。RTEMS通常会因为下面的原因为系统分配过多的内存:
%A
%A
%A
%A • 所有的任务/ 线程被假定是浮点任务。
%A
%A
%A
%A 相反地,如果出现下面的情况,则可能出现内存不够:
%A
%A • 任务/ 线程堆栈空间不够
%A
%A • 没有考虑到消息使用的内存
%A
%A • 设备驱动的需求没有考虑进去
%A
%A • 网络协议栈的内存需求没有考虑
%A
%A • 附加函数库的内存需求没有考虑进去
%A
%A 当然,如果程序员在confdefs.h中提供的信息准确,那么confdefs.h的估算会非常精确。 非常正确。下列将介绍配置文件中的常量。
%A
%A
%A 26.2.1 : 库支持常量定义
%A
%A 这一节定义了confdefs.h中文件系统I/O库相关的常量
%A
%A CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS:可以同时打开的文件数目。I/O库中,每打开一个文件就需要为其分配一个互斥变量。 CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS的默认值为3,也就是支持标准的输入,输出和错误输出三个文件描述符。
%A
%A CONFIGURE_TERMIOS_DISABLED:程序中不会使用POSIX的termios 功能,缺省为支持。
%A
%A CONFIGURE_NUMBER_OF_TERMIOS_PORTS 终端数目,缺省为1。
%A
%A CONFIGURE_HAS_OWN_MOUNT_TABLE:如果系统使用自己的文件系统安装表,如果支持文件系统,就会定义的 rtems_filesystem_mount_table_t类型的变量rtems_filesystem_mount_table
%A
%A CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM 使用IMFS为缺省文件系统。这是默认选项,否则使用miniIMFS为基本文件系统。 STACK_CHECKER_ON 是否对堆栈越界进行动态检查,缺省为不检查。
%A
%A
%A 26.2.2 : 基本系统信息
%A
%A confdefs.h中定义的系统参数如下:
%A
%A CONFIGURE_HAS_OWN_CONFIGURATION_TABLE 系统使用自己定义的配置表CONFIGURE_INTERRUPT_STACK_MEMORY 中断堆栈大小,缺省大小为 RTEMS_MINIMUM_STACK_SIZE
%A
%A CONFIGURE_EXECUTIVE_RAM_WORK_AREA RTEMS基准地址,缺省为NULL,表示由BSP判断
%A
%A CONFIGURE_MICROSECONDS_PER_TICK 每个tick实际的微秒数
%A
%A CONFIGURE_TICKS_PER_TIMESLICE 每个时间片中的tick数目缺省为50.
%A
%A CONFIGURE_MEMORY_OVERHEAD 为系统追加的内存数目,默认价值是 0
%A
%A CONFIGURE_EXTRA_TASK_STACKS 为系统追加的堆栈数目,默认价值是 0 ,如果系统使用的堆栈大于confdefs.h计算出的的堆栈数目,那么就可以增大该值
%A 26.2.3 : 设备驱动表
%A
%A 自动生成设备驱动表格需要的配置参数。当然这些配置选项只适用用标准设备驱动。
%A
%A CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE:如果定义了自己的非标准设备驱动表,就需要打开次开关,这样会自动产生rtems_driver_address_table设备驱动表
%A
%A CONFIGURE_MAXIMUM_DRIVERS 驱动的最大数目缺省为10
%A
%A CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER 是否使用控制台驱动,如果定义,那么该设备驱动负责提供标准的输入和输出使用 "/dev/控制台". 预先设定地 , 该不被定义。
%A
%A 如果应用愿包括控制台设备驱动, CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER 被定义。 该设备驱动("/dev/console")负责提供标准的输入和输出,缺省被屏蔽。
%A
%A CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER 是否需要时钟驱动,缺省被屏蔽
%A
%A CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER 是否适用桩驱动,缺省被屏蔽
%A
%A
%A 26.2.4 : 多处理器配置选项
%A
%A 如果定义了CONFIGURE_MP_APPLICATION,下面的选项就有效:
%A
%A CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE 用户自己提供多处理器配置表。
%A
%A CONFIGURE_MP_NODE_NUMBER 多处理器节点数目。
%A
%A CONFIGURE_MP_MAXIMUM_NODES 最多节点数目。
%A
%A CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS 全局变量数目,默认是 32 。
%A
%A CONFIGURE_MP_MAXIMUM_PROXIES 代理最大数目,默认是 32 。
%A
%A CONFIGURE_MP_MPCI_TABLE_POINTER MPCI配置表的指针。该字段的默认值是 &MPCI_table。
%A 26.2.5 : 标准配置
%A
%A CONFIGURE_MAXIMUM_TASKS 并行任务最大数。默认是0(没有限制)。
%A
%A CONFIGURE_MAXIMUM_TIMERS 定时器最大数。默认是0(没有限制) 。
%A
%A CONFIGURE_MAXIMUM_SEMAPHORES 最大信号量数目,默认是 0 。
%A
%A CONFIGURE_MAXIMUM_MESSAGE_QUEUES 最大消息队列数目,为该字段的默认是 0 。
%A
%A CONFIGURE_MAXIMUM_PARTITIONS 内存区最大数目。默认是 0 。
%A
%A CONFIGURE_MAXIMUM_REGIONS 可变内存区最大数目,默认是 0 。
%A
%A CONFIGURE_MAXIMUM_PORTS 可以同时存在的ports数目,默认是 0 。
%A
%A CONFIGURE_MAXIMUM_PERIODS 可同时存在单调期数。默认是 0 。
%A
%A CONFIGURE_MAXIMUM_USER_EXTENSIONS 允许的用户扩展数。默认是 0 。
%A
%A
%A 26.2.6 : 标准API初始表
%A
%A confdefs.h 会自动产生初始化任务表Initialization_tasks,下面是控制表自动创建的参数。
%A
%A
%A
%A CONFIGURE_RTEMS_INIT_TASKS_TABLE 如果用户愿使用标准RTEMS API初始化任务表。任务一般会通过其他任务进行初始化,所以这个字段缺省为未定义。
%A
%A CONFIGURE_HAS_OWN_INIT_TASK_TABLE有自定义的初始化表,缺省没有。
%A
%A CONFIGURE_INIT_TASK_NAME 初始任务名称,缺省值为rtems_build_name 。 (‘U‘ , ‘I‘ , ‘1‘,‘‘)
%A
%A CONFIGURE_INIT_TASK_STACK_SIZE 任务栈大小 , 缺省为 RTEMS_MINIMUM_STACK_SIZE 。
%A
%A CONFIGURE_INIT_TASK_PRIORITY 初始任务的优先级 , 缺省为 1 。
%A
%A CONFIGURE_INIT_TASK_ATTRIBUTES 缺省的初始化任务属性 , 缺省为 RTEMS_DEFAULT_ATTRIBUTES 。
%A
%A CONFIGURE_INIT_TASK_ENTRY_POINT 初始任务 , 缺省为 Init 。
%A
%A CONFIGURE_INIT_TASK_INITIAL_MODES 初始任务执行模式,初始为RTEMS_NO_PREEMPT 。
%A
%A CONFIGURE_INIT_TASK_ARGUMENTS 初始任务参数,初始值是 0 。
%A
%A
%A
%A 系统配置表格
%A
%A 作者 Ray
%A
%A RTEMS版权所有,转载请注明来源www.rtems.net,作者ray@rtems
%A 26.3: 配置表格
%A
%A RTEMS 配置表格用于对应用进行剪裁。例如配置最大任务数目等。配置表的地址将传递给rtems_initialize_executive 函数,配置表定义如下:
%A
%A typedef struct{
%A
%A void *work_space_start;
%A
%A rtems_unsigned32 work_space_size;
%A
%A rtems_unsigned32 maximum_extensions;
%A
%A rtems_unsigned32 microseconds_per_tick;
%A
%A rtems_unsigned32 ticks_per_timeslice;
%A
%A rtems_unsigned32 maximum_devices;
%A
%A rtems_unsigned32 maximum_drivers;
%A
%A rtems_unsigned32 number_of_device_drivers;
%A
%A rtems_driver_address_table *Device_driver_table;
%A
%A rtems_unsigned32 number_of_initial_extensions;
%A
%A rtems_extensions_table *User_extension_table;
%A
%A rtems_multiprocessing_table *User_multiprocessing_table;
%A
%A rtems_api_configuration_table *RTEMS_api_configuration;
%A
%A posix_api_configuration_table *POSIX_api_configuration;
%A
%A }rtems_configuration_table;
%A
%A 表项内容可以根据名称判断,这里就不多说了。
%A 26.4: RTEMS API 配置表
%A
%A RTEMS API 配置表为 RTMES API 进行配置。 其数据结构定义如下 :
%A
%A typedef struct{
%A
%A rtems_unsigned32 maximum_tasks;
%A
%A rtems_unsigned32 maximum_timers;
%A
%A rtems_unsigned32 maximum_semaphores;
%A
%A rtems_unsigned32 maximum_message_queues;
%A
%A rtems_unsigned32 maximum_partitions;
%A
%A rtems_unsigned32 maximum_regions;
%A
%A rtems_unsigned32 maximum_ports;
%A
%A rtems_unsigned32 maximum_periods;
%A
%A rtems_unsigned32 number_of_initialization_tasks;
%A
%A rtems_initialization_tasks_table*User_initialization_tasks_table;
%A
%A }rtems_api_configuration_table;
%A
%A
%A 26.6: 处理器信息表
%A
%A 处理器信息表用来描述处理器相关的信息。其中的信息是由BSP提供的。confdefs.h无法自动产生该表,需要手工配置。
%A 26.7: 初始化任务表格
%A
%A 初始化任务表格为初始化管理器描述用户初始化任务。表格为每个初始化任务建立对应的表项。数据结构可用于rtems_task_create 和 rtems_task_start 函数的参数。 表的数目在配置表格 number_of_initialization_tasks 字段定义:
%A
%A 初始化任务表格定义如下:
%A
%A typedef struct {
%A
%A rtems_name name;
%A
%A rtems_unsigned32 stack_size;
%A
%A rtems_task_priority initial_priority;
%A
%A rtems_attribute attribute_set;
%A
%A rtems_task_entry entry_point;
%A
%A rtems_mode mode_set;
%A
%A rtems_task_argument argument;
%A
%A } rtems_initialization_tasks_table;s
%A
%A 下面是设置的实例:
%A
%A rtems_initialization_tasks_table
%A
%A Initialization_tasks[2] = {
%A
%A { INIT_1_NAME,
%A
%A 1024,
%A
%A 1,
%A
%A DEFAULT_ATTRIBUTES,
%A
%A Init_1,
%A
%A DEFAULT_MODES,
%A
%A 1
%A
%A },
%A
%A { INIT_2_NAME,
%A
%A 1024,
%A
%A 250,
%A
%A FLOATING_POINT,
%A
%A Init_2,
%A
%A NO_PREEMPT,
%A
%A 2
%A
%A }
%A
%A };
%A 26.8: 驱动地址表格
%A
%A 设备驱动表格是用向输入/输出管理器提供驱动信息。表格中包含了驱动需要的入口条目。其定义如下:
%A
%A typedef struct {
%A
%A rtems_device_driver_entry initialization;
%A
%A rtems_device_driver_entry open;
%A
%A rtems_device_driver_entry close;
%A
%A rtems_device_driver_entry read;
%A
%A rtems_device_driver_entry write;
%A
%A rtems_device_driver_entry control;
%A
%A } rtems_driver_address_table;
%A
%A 下面是设置的实例:
%A
%A rtems_driver_address_table Driver_table[2] = {
%A
%A { tty_initialize, tty_open, tty_close, /* major = 0 */
%A
%A tty_read, tty_write, tty_control
%A
%A },
%A
%A { lp_initialize, lp_open, lp_close, /* major = 1 */
%A
%A NULL, lp_write, lp_control
%A
%A }
%A
%A };
%A
%A
%A 26.9: 用户扩展表格
%A
%A 用户扩展表格是用来告知 RTEMS 有哪些可选择的用户提供的静态扩展集。 该表格为每个可能的扩展建立一个入口。对应事件发生时,会调用对应的扩展函数,扩展的定义如下:
%A
%A typedef User_extensions_routine rtems_extension;
%A
%A typedef User_extensions_thread_create_extension
%A
%A rtems_task_create_extension;
%A
%A typedef User_extensions_thread_delete_extension
%A
%A rtems_task_delete_extension;
%A
%A typedef User_extensions_thread_start_extension
%A
%A rtems_task_start_extension;
%A
%A typedef User_extensions_thread_restart_extension
%A
%A rtems_task_restart_extension;
%A
%A typedef User_extensions_thread_switch_extension
%A
%A rtems_task_switch_extension;
%A
%A typedef User_extensions_thread_begin_extension
%A
%A rtems_task_begin_extension;
%A
%A typedef User_extensions_thread_exitted_extension
%A
%A rtems_task_exitted_extension;
%A
%A typedef User_extensions_fatal_extension rtems_fatal_extension;
%A
%A
%A
%A typedef User_extensions_Table rtems_extensions_table;
%A
%A
%A
%A typedef struct {
%A
%A rtems_task_create_extension thread_create;
%A
%A rtems_task_start_extension thread_start;
%A
%A rtems_task_restart_extension thread_restart;
%A
%A rtems_task_delete_extension thread_delete;
%A
%A rtems_task_switch_extension thread_switch;
%A
%A rtems_task_begin_extension thread_begin;
%A
%A rtems_task_exitted_extension thread_exitted;
%A
%A rtems_fatal_extension fatal;
%A
%A } User_extensions_Table;
%A
%A 下面是设置的实例:
%A
%A rtems_extensions_table User_extensions = {
%A
%A task_create_extension,
%A
%A NULL,
%A
%A NULL,
%A
%A task_delete_extension,
%A
%A task_switch_extension,
%A
%A NULL,
%A
%A NULL,
%A
%A fatal_extension
%A
%A };
%A
%A
%A 26.10: 多处理器配置表
%A
%A 当系统为多处理器系统时,多处理器配置表包含了多处理器的配置信息。多处理器配置表的地址应该被放在表 User_multiprocessing_table中。
%A
%A 使用confdefs.h 配置多处理RTEMS 应用,必须定义 CONFIGURE_MP_APPLICATION。
%A
%A 多处理器格局表格的格式在下列的 C语言结构中被定义:
%A
%A typedef struct{
%A
%A rtems_unsigned32 node;
%A
%A rtems_unsigned32 maximum_nodes;
%A
%A rtems_unsigned32 maximum_global_objects;
%A
%A rtems_unsigned32 maximum_proxies;
%A
%A rtems_mpci_table*User_mpci_table;
%A
%A }rtems_multiprocessing_table;
%A
%A
%A 26.11: 多处理器通信接口表
%A
%A 当用 confdefs.h 配置应用,通信接口表的缺省名称为MPCI_table,除非是定义了CONFIGURE_MP_MPCI_TABLE_POINTER。
%A
%A 该表格的格式在下列的 C语言结构中被定义:
%A
%A typedef struct {
%A
%A rtems_unsigned32 default_timeout; /* in ticks */
%A
%A rtems_unsigned32 maximum_packet_size;
%A
%A rtems_mpci_initialization_entry initialization;
%A
%A rtems_mpci_get_packet_entry get_packet;
%A
%A rtems_mpci_return_packet_entry return_packet;
%A
%A rtems_mpci_send_entry send;
%A
%A rtems_mpci_receive_entry receive;
%A
%A } rtems_mpci_table;
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。