主页 文档 下载 莱特 沙龙 English

RTESM文档
RTEMS精彩应用
RTEMS版权说明
其他RTOS
ARM/DSP专区
AVR/FPGA/PCB
嵌入式文件系统
ARM AVR仿真器DIY
莱特电子工作室
联系我们
 


用户扩展管理器

作者 Ray

RTEMS版权所有,转载请注明来源www.rtems.net,作者Ray

21.1: 介绍

RTEMS 用户扩展管理器允许程序员对RTEMS进行扩展。扩展函数的作用类似于Linux中的包过滤驱动,也可以看成window里面的钩子函数或者过滤层驱动。在对应的系统事件发生时,用户可以让RTEMS执行用户的扩展函数。扩展函数管理器提供了下面的API:

rtems_extension_create- 产生一个扩展置集

rtems_extension_ident- 获取扩展的ID标识

rtems_extension_delete- 删除一个扩展置集

 

21.2: 背景

当下列的系统事件发生的时候,调用用户扩展例程:

•  任务创建

•  任务初始化

•  任务重新初始化

•  任务删除

•  任务切换

•  任务开始

•  任务推出

•  发现异常

•  这些扩展调用时使用系统事件为参数。

 

21.2.1 : 用户扩展例程集

任务扩展集是一组例程,当特定的系统事件发生时,这些例程会被RTEMS触发。这些例程通常用来完成特殊的任务(例如系统状态监视、远程调试等)。RTEMS中用户扩展数据结构定义如下:

typedef struct {

rtems_task_create_extension thread_create;

rtems_task_start_extension thread_start;

rtems_task_restart_extension thread_restart;

rtems_task_delete_extension thread_delete;

rtems_task_switch_extension thread_switch;

rtems_task_begin_extension thread_begin;

rtems_task_exitted_extension thread_exitted;

rtems_fatal_extension fatal;

} rtems_extensions_table;

RTEMS 允许用户同时具备多个扩展集。首先,程序员可以在系统配置表中定义一个静态的扩展例程集。这个扩展例程集在系统的整个生命周期都有效。该例程集对于系统来说非常重要。因为只有这个例程集在initialize_executive 函数失败时,能够提供异常处理。当然,用户扩展是可选的,如果不希望提供扩展,可以将对应的表项设置为NULL。

此外用户可以使用rtems_extension_create安装动态扩展。这些扩展是和其他 RTEMS 对象一样有自己的名称,ID标识,并且可以动态地创建和删除。与静态扩展不同,动态扩展只有在 initialize_executive函数成功完成之后才会被安装。动态扩展对于封装扩展功能非常有用。例如程序员可以使用扩展函数监控协处理器的状态,做性能监控, 做栈越界检查。每一个这样的扩展可能独立安装。

所有的用户扩展是可选的,而且 RTEMS 对于扩展命名也没有特殊的限制。扩展创建后,RTMES将扩展表拷贝到内核中,这样程序员就不必维护该扩展,此外以后对该扩展进行动态的修改也是没有效用的。

如果没有任务切换扩展,那么扩展不会产生开销。

 

21.2.2 : TCB 扩展区域

RTEMS 为每个任务提供了一个扩展指针,该指针定义在任务控制块TCB中。这些指针是TCB的扩展,可以用来存储用户自定义信息。此外还可以让用户扩展使用任务的记事本来存储相关信息(虽然这么做有违系统设计初衷)。

TCB 中包含了一个扩展指针,他指向一个指针数组。如下所示:

void **extensions;

数组的索引可以通过ID标识来获取:

index = rtems_get_index(extension_id);

指针数组中指针的个数在配置表中配置。有了扩展指针,应用程序可以为TCB增加自定义信息。例如,用户可以将任务执行的时间戳存放在TCB扩展中,为应用程序提供系统的统计数据。当任务其换时,TASK_SWITCH 扩展可以读取实时时钟来计算任务被换出处理器的时间。

如果使用了TCB扩展,那么扩展的内存区域必须在任务创建TASK_CREATE或者启动TASK_START的时候初始化。应用程序就负责对扩展内存进行管理。在任务重启TASK_RESTART时,扩展将会重新初始化。在任务删除TASK_DELETE 时也要将扩展内存删除。由于任务扩展通常都是固定大小的内存区,所以可以使用固定长度内存管理器进行内存分配管理。也就是说使用定长内存管理器分配和回收扩展内存区。

 

 
嵌入式软硬件设计咨询 • 8位 16位 32位 64位 RISC DSP
主页文章 方案 产品 下载反馈
 
2004 RTEMS.NET 版权所有