RTEMS:用户扩展管理器
21.1: 介绍
%A
%A RTEMS 用户扩展管理器允许程序员对RTEMS进行扩展。扩展函数的作用类似于Linux中的包过滤驱动,也可以看成window里面的钩子函数或者过滤层驱动。在对应的系统事件发生时,用户可以让RTEMS执行用户的扩展函数。扩展函数管理器提供了下面的API:
%A
%A rtems_extension_create- 产生一个扩展置集
%A
%A rtems_extension_ident- 获取扩展的ID标识
%A
%A rtems_extension_delete- 删除一个扩展置集
%A
%A
%A 21.2: 背景
%A
%A 当下列的系统事件发生的时候,调用用户扩展例程:
%A
%A • 任务创建
%A
%A • 任务初始化
%A
%A • 任务重新初始化
%A
%A • 任务删除
%A
%A • 任务切换
%A
%A • 任务开始
%A
%A • 任务推出
%A
%A • 发现异常
%A
%A • 这些扩展调用时使用系统事件为参数。
%A
%A
%A 21.2.1 : 用户扩展例程集
%A
%A 任务扩展集是一组例程,当特定的系统事件发生时,这些例程会被RTEMS触发。这些例程通常用来完成特殊的任务(例如系统状态监视、远程调试等)。RTEMS中用户扩展数据结构定义如下:
%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 } rtems_extensions_table;
%A
%A RTEMS 允许用户同时具备多个扩展集。首先,程序员可以在系统配置表中定义一个静态的扩展例程集。这个扩展例程集在系统的整个生命周期都有效。该例程集对于系统来说非常重要。因为只有这个例程集在initialize_executive 函数失败时,能够提供异常处理。当然,用户扩展是可选的,如果不希望提供扩展,可以将对应的表项设置为NULL。
%A
%A 此外用户可以使用rtems_extension_create安装动态扩展。这些扩展是和其他 RTEMS 对象一样有自己的名称,ID标识,并且可以动态地创建和删除。与静态扩展不同,动态扩展只有在 initialize_executive函数成功完成之后才会被安装。动态扩展对于封装扩展功能非常有用。例如程序员可以使用扩展函数监控协处理器的状态,做性能监控, 做栈越界检查。每一个这样的扩展可能独立安装。
%A
%A 所有的用户扩展是可选的,而且 RTEMS 对于扩展命名也没有特殊的限制。扩展创建后,RTMES将扩展表拷贝到内核中,这样程序员就不必维护该扩展,此外以后对该扩展进行动态的修改也是没有效用的。
%A
%A 如果没有任务切换扩展,那么扩展不会产生开销。
%A
%A
%A 21.2.2 : TCB 扩展区域
%A
%A RTEMS 为每个任务提供了一个扩展指针,该指针定义在任务控制块TCB中。这些指针是TCB的扩展,可以用来存储用户自定义信息。此外还可以让用户扩展使用任务的记事本来存储相关信息(虽然这么做有违系统设计初衷)。
%A
%A TCB 中包含了一个扩展指针,他指向一个指针数组。如下所示:
%A
%A void **extensions;
%A
%A 数组的索引可以通过ID标识来获取:
%A
%A index = rtems_get_index(extension_id);
%A
%A 指针数组中指针的个数在配置表中配置。有了扩展指针,应用程序可以为TCB增加自定义信息。例如,用户可以将任务执行的时间戳存放在TCB扩展中,为应用程序提供系统的统计数据。当任务其换时,TASK_SWITCH 扩展可以读取实时时钟来计算任务被换出处理器的时间。
%A
%A 如果使用了TCB扩展,那么扩展的内存区域必须在任务创建TASK_CREATE或者启动TASK_START的时候初始化。应用程序就负责对扩展内存进行管理。在任务重启TASK_RESTART时,扩展将会重新初始化。在任务删除TASK_DELETE 时也要将扩展内存删除。由于任务扩展通常都是固定大小的内存区,所以可以使用固定长度内存管理器进行内存分配管理。也就是说使用定长内存管理器分配和回收扩展内存区。
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。