主页 文档 下载 莱特 沙龙 English

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


变长内存区管理器(region manager)

作者 Ray

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

摘要

   摘要内容

17.1: 介绍

变长内存管理器提供API为应用分配变长的内存区。提供的API包括:

 

rtems_region_create- 创建变长内存区域

rtems_region_ident- 获取区域的 ID标识

rtems_region_delete- 删除一个区域

rtems_region_extend- 扩大内存区

rtems_region_get_segment- 从内存区取的内存块

rtems_region_return_segment- 释放内存块回内存区

rtems_region_get_segment_size- 获得变长内存块大小

 

17.2 背景

17.2.1 : 变长内存区定义

变长内存(region)是一个连续内存区,区内有用户定义的变长内存块(页面)。页面大小可变,但是必须大于4,并且是4的整数倍。如果需求的内存大小大于页面大小,那么页面将自动增加一倍。举例来说, 如果需要350字节内存,但是页面大小是256字节,那么页面将会扩大到512字节。 (Linux的内存分配策略和RTEM很相象)

变长内存管理器将变长内存区按照双向链表组织。对内存请求使用首次匹配算法(可能造成一些浪费)。为了系统的执行效率,任务在请求了内存后,最好不要频繁修改获得内存的尺寸。此外任务不应该改变变长区域以外的内存块尺寸。

释放的内存块会和邻接的内存块合并,以形成较大的空闲区。

17.2.2 : 变长内存区属性集

变长内存区属性集如下所示:

RTEMS_FIFO- 任务由 FIFO 等候 (默认)

RTEMS_PRIORITY- 任务按照优先级排队

17.2.3 : 变长内存区选项

为rtems_region_get_segment 函数提供的选项包括:

RTEMS_WAIT- 任务将会等候信号量 (默认)

RTEMS_NO_WAIT- 任务不会等候

 

17.3 基本操作

17.3.1 : 创造一个变长内存区域

rtems_region_create 函数创建用户命名的变长内存区域

。 需要内存的任务会排队等候,排队规则可以是FIFO或者优先级高低次序。RTEMS为变长内存区域分派变长内存区域控制块RNCB。此外RTEMS还创建一个内存区域的ID标识。

由于在变长内存区中,有一些内存将会预留给RTEMS,所以区域中实际可用的内存空间会小于分配值。而且RTEMS 实际开销不是固定值。例如,包含两个信号量的内存区比只有一个信号量的内存区可用空间要小。

此外,内存区中的内存会自动合并,内存区中内存块的数目也会变化,这样, RTEMS 预留的内存大小也会动态变化。

17.3.2 : 获得内存区域ID标识

当内存区域创建时,RTEMS为其创建一个唯一的ID标识。区域 ID标识可使用二种方法获得。首先,rtems_region_create 函数返回,其次,使用rtems_region_ident 函数。

17.3.3 : 动态增加内存区域的内存大小

rtems_region_extend 函数可以增加内存区域的大小。函数参数指定了新加入内存的大小以及起始地址。

 

17.3.4 : 获得一个变长内存块

rtems_region_get_segment函数从指定的内存区域中取的一个内存块。 如果内存区域中有足够内存可用,函数返回成功,否则:

•  缺省状态,调用任务将会永远地等候空闲内存块

•  如果指定了RTEMS_NO_WAIT函数会返回错误码

•  任务返回前等待指定时间

等待的任务将会按照FIFO或者优先级方式排序。

17.3.4 : 获得一个变长内存块

rtems_region_get_segment函数从指定的内存区域中取的一个内存块。 如果内存区域中有足够内存可用,函数返回成功,否则:

•  缺省状态,调用任务将会永远地等候空闲内存块

•  如果指定了RTEMS_NO_WAIT函数会返回错误码

•  任务返回前等待指定时间

等待的任务将会按照FIFO或者优先级方式排序。如果内存区被删除,等待任务将会得到错误码。

17.3.5 : 释放变长内存区域

rtems_region_return_segment 函数将内存块释放回内存区中。释放的内存将会和邻接内存合并形成较大的空闲内存区。释放后,内存区的等待队列的队首任务需求将会被处理,如果内存大小合适,那么将内存分配给该任务,并解除人物的阻塞;否则任务继续等待。

17.3.6 : 获取变长内存区的尺寸

rtems_region_get_segment_size 函数返回指定的变长内存区尺寸。函数返回的是包含内存碎片的内存区容量。

17.3.7 : 划除内存区域

rtems_region_delete 函数删除内存区域。内存区域被删除时,它的控制区段RNCB释放回空闲链表。区域中有内存块在使用,那么删除会失败。如果成功删除,在该内存区域上等待的任务将获得表示内存区被删除的返回码。

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