新闻  |   论坛  |   博客  |   在线研讨会
rtems;:变长内存区管理器(region manager)
tongxin | 2009-04-12 20:56:37    阅读:1109   发布文章

7.1: 介绍
%A
%A 变长内存管理器提供API为应用分配变长的内存区。提供的API包括:
%A
%A
%A
%A rtems_region_create- 创建变长内存区域
%A
%A rtems_region_ident- 获取区域的 ID标识
%A
%A rtems_region_delete- 删除一个区域
%A
%A rtems_region_extend- 扩大内存区
%A
%A rtems_region_get_segment- 从内存区取的内存块
%A
%A rtems_region_return_segment- 释放内存块回内存区
%A
%A rtems_region_get_segment_size- 获得变长内存块大小
%A
%A
%A 17.2 背景
%A 17.2.1 : 变长内存区定义
%A
%A 变长内存(region)是一个连续内存区,区内有用户定义的变长内存块(页面)。页面大小可变,但是必须大于4,并且是4的整数倍。如果需求的内存大小大于页面大小,那么页面将自动增加一倍。举例来说, 如果需要350字节内存,但是页面大小是256字节,那么页面将会扩大到512字节。 (Linux的内存分配策略和RTEM很相象)
%A
%A 变长内存管理器将变长内存区按照双向链表组织。对内存请求使用首次匹配算法(可能造成一些浪费)。为了系统的执行效率,任务在请求了内存后,最好不要频繁修改获得内存的尺寸。此外任务不应该改变变长区域以外的内存块尺寸。
%A
%A 释放的内存块会和邻接的内存块合并,以形成较大的空闲区。
%A 17.2.2 : 变长内存区属性集
%A
%A 变长内存区属性集如下所示:
%A
%A RTEMS_FIFO- 任务由 FIFO 等候 (默认)
%A
%A RTEMS_PRIORITY- 任务按照优先级排队
%A
%A 17.2.3 : 变长内存区选项
%A
%A 为rtems_region_get_segment 函数提供的选项包括:
%A
%A RTEMS_WAIT- 任务将会等候信号量 (默认)
%A
%A RTEMS_NO_WAIT- 任务不会等候
%A
%A
%A 17.3 基本操作
%A 17.3.1 : 创造一个变长内存区域
%A
%A rtems_region_create 函数创建用户命名的变长内存区域
%A
%A 。 需要内存的任务会排队等候,排队规则可以是FIFO或者优先级高低次序。RTEMS为变长内存区域分派变长内存区域控制块RNCB。此外RTEMS还创建一个内存区域的ID标识。
%A
%A 由于在变长内存区中,有一些内存将会预留给RTEMS,所以区域中实际可用的内存空间会小于分配值。而且RTEMS 实际开销不是固定值。例如,包含两个信号量的内存区比只有一个信号量的内存区可用空间要小。
%A
%A 此外,内存区中的内存会自动合并,内存区中内存块的数目也会变化,这样, RTEMS 预留的内存大小也会动态变化。
%A 17.3.2 : 获得内存区域ID标识
%A
%A 当内存区域创建时,RTEMS为其创建一个唯一的ID标识。区域 ID标识可使用二种方法获得。首先,rtems_region_create 函数返回,其次,使用rtems_region_ident 函数。
%A 17.3.3 : 动态增加内存区域的内存大小
%A
%A rtems_region_extend 函数可以增加内存区域的大小。函数参数指定了新加入内存的大小以及起始地址。
%A
%A
%A 17.3.4 : 获得一个变长内存块
%A
%A rtems_region_get_segment函数从指定的内存区域中取的一个内存块。 如果内存区域中有足够内存可用,函数返回成功,否则:
%A
%A •  缺省状态,调用任务将会永远地等候空闲内存块
%A
%A •  如果指定了RTEMS_NO_WAIT函数会返回错误码
%A
%A •  任务返回前等待指定时间
%A
%A 等待的任务将会按照FIFO或者优先级方式排序。
%A 17.3.4 : 获得一个变长内存块
%A
%A rtems_region_get_segment函数从指定的内存区域中取的一个内存块。 如果内存区域中有足够内存可用,函数返回成功,否则:
%A
%A •  缺省状态,调用任务将会永远地等候空闲内存块
%A
%A •  如果指定了RTEMS_NO_WAIT函数会返回错误码
%A
%A •  任务返回前等待指定时间
%A
%A 等待的任务将会按照FIFO或者优先级方式排序。如果内存区被删除,等待任务将会得到错误码。
%A 17.3.5 : 释放变长内存区域
%A
%A rtems_region_return_segment 函数将内存块释放回内存区中。释放的内存将会和邻接内存合并形成较大的空闲内存区。释放后,内存区的等待队列的队首任务需求将会被处理,如果内存大小合适,那么将内存分配给该任务,并解除人物的阻塞;否则任务继续等待。
%A 17.3.6 : 获取变长内存区的尺寸
%A
%A rtems_region_get_segment_size 函数返回指定的变长内存区尺寸。函数返回的是包含内存碎片的内存区容量。
%A 17.3.7 : 划除内存区域
%A
%A rtems_region_delete 函数删除内存区域。内存区域被删除时,它的控制区段RNCB释放回空闲链表。区域中有内存块在使用,那么删除会失败。如果成功删除,在该内存区域上等待的任务将获得表示内存区被删除的返回码。
%A%A
%A

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
寂寞如雪
2009-05-19 19:01:18
夜色花
2009-05-19 18:56:22
没有爱可以重来
2009-05-19 18:54:59
推荐文章
最近访客