|
变长内存区管理器(region manager)API
作者 Ray
RTEMS版权所有,转载请注明来源www.rtems.net,作者Ray
14.4: 函数
14.4.1 : REGION_CREATE- 创建一个变长内存区域
函数原型:
rtems_status_code rtems_region_create(
rtems_name name,
void *starting_address,
rtems_unsigned32 length,
rtems_unsigned32 page_size,
rtems_attribute attribute_set,
rtems_id *id
);
返回值代表的状态:
RTEMS_SUCCESSFUL- 成功地创造变长内存区域
RTEMS_INVALID_NAME- 无效的任务名称
RTEMS_INVALID_ADDRESS- id标识是空值
RTEMS_INVALID_ADDRESS- starting_address 是空值(返回值的确相同,不是我写错了
J )
RTEMS_INVALID_ADDRESS- address 没有按照 4 字节对齐
RTEMS_TOO_MANY- 已经创建太多的区域
RTEMS_INVALID_SIZE- 无效内存块 ( page ) 大小
描述:
该函数创建用户命名的变长内存区域。区域在内存中的起始地址是 starting_address,
内部页面初始大小为page_size,页面数目为length。从区域被分派的段将会是长度的 page_size 位元组的复。 变长内存区域的ID存放在*id中。
对于控制和维护变长内存区域,RTEMS
从RNCB池中分配空闲RNCB控制块。虽然RNCB并占用变长内存区域的存储空间,但是变长内存区域相关的信号量将会占用存储空间。
attribute_set参数如果是RTEMS_PRIORITY那么阻塞任务按照优先级排序,如果是RTEMS_FIFO(缺省),任务将会按照FIFO排序。
starting_address 和page_size 必须符合32位系统的对齐方式。
14.4.2 : REGION_IDENT- 获取变长内存区的 ID
函数原型 :
rtems_status_code rtems_region_ident(
rtems_name name,
rtems_id *id
);
返回值代表的状态 :
RTEMS_SUCCESSFUL- 成功地找到内存区
RTEMS_INVALID_ADDRESS- ID 标识是空值
RTEMS_INVALID_NAME- 找不到对应内存区
14.4.3 : REGION_DELETE- 删除一个变长内存区
函数原型:
rtems_status_code rtems_region_delete(
rtems_id id
);
返回值代表的状态:
RTEMS_SUCCESSFUL- 成功地删除变长内存区
RTEMS_INVALID_ID- 无效区域ID标识
RTEMS_RESOURCE_IN_USE- 区域中有正在使用的内存块
描述:
该函数删除ID标识指定的变长内存区。如果其中有内存块正在被使用,那么变长内存区不能删除。删除后释放RNCB。
注意:
任何知道区域 ID标识的本地任务都能删除内存区。
14.4.4 : REGION_EXTEND-动态增加变长内存区尺寸
函数原型:
rtems_status_code rtems_region_extend(
rtems_id id,
void *starting_address,
rtems_unsigned32 length
);
返回值代表的状态 :
RTEMS_SUCCESSFUL- 成功地增加内存到内存区
RTEMS_INVALID_ADDRESS- starting_address 是空值
RTEMS_INVALID_ID- 无效 ID 标识
RTEMS_INVALID_ADDRESS- 无效的地址
描述 :
该函数增加为可变内存区增加内存 , starting_address 是增加的内存块起始地址
, legnth 是增加量。
注意:
调用函数的任务不必是创建内存区的任务。
14.4.5 : REGION_GET_SEGMENT-从变长内存区获取内存块
函数原型:
rtems_status_code rtems_region_get_segment(
rtems_id id,
rtems_unsigned32 size,
rtems_option option_set,
rtems_interval timeout,
void **segment
);
返回值代表的状态 :
RTEMS_SUCCESSFUL- 成功地获取内存块
RTEMS_INVALID_ADDRESS- segment 是空值
RTEMS_INVALID_ID- 无效 ID 标识
RTEMS_INVALID_SIZE- 请求的内存块大小为 0 或者超出区域中可允许的最大尺寸
RTEMS_UNSATISFIED- 无法获得需求尺寸的内存
RTEMS_TIMEOUT- 计时器时间到
RTEMS_OBJECT_WAS_DELETED- 当等候的时候 , 信号量被删除
描述 :
该函数从 ID 标识指定的变长内存区中取的内存块。被分派的段地址在段中被退还。option_set中RTEMS_WAIT
或者RTEMS_NO_WAIT分量用来叙述调用者在没有合适内存块时是否愿等候。成功获得内存块后,调用者将获得RTEMS_SUCCESSFUL返回码。
如果调用者使用RTEMS_NO_WAIT立即返回,并且没有合适内存区,那么函数将返回对应错误码。如果调用者要等待合适的内存块,那么任务排序将按照RTEMS_PRIORITY
或者RTEMS_FIFO 方式进行。
timeout参数叙述任务愿意等候的时间长度。如果该参数被设置为RTEMS_NO_TIMEOUT,那么调用任务将会永远等候。
注意:
位任务时间分配的内存块会比任务需求的内存块大,这主要是因为信号量的开销。
如果需要等待指定时间,就需要定时器的支持。
14.4.6 : REGION_RETURN_SEGMENT- 释放内存块到内存区
函数原型:
rtems_status_code rtems_region_return_segment(
rtems_id id,
void *segment
);
返回值代表的状态:
RTEMS_SUCCESSFUL- 成功释放内存块
RTEMS_INVALID_ADDRESS- 段是空值
RTEMS_INVALID_ID- 无效ID标识
RTEMS_INVALID_ADDRESS- 内存块不属于该区
描述:
函数将内存块释放回内存区中。释放的内存将会和邻接内存合并形成较大的空闲内存区。释放后,内存区的等待队列的队首任务需求将会被处理,如果内存大小合适,那么将内存分配给该任务,并解除人物的阻塞;否则任务继续等待。
注意:
如果释放后内存块满足阻塞队列的要求,那么任务将会被就绪,并有可能产生抢占式调度。
任务需求的内存小于实际分配的内存。
一个候补任务有一个较高的优先级胜于召集任务
必需的段尺寸藉着候补任务是较少的超过或对被退还的段尺寸相等。
14.4.7 : REGION_GET_SEGMENT_SIZE-获得一个内存块的尺寸
函数原型:
rtems_status_code rtems_region_get_segment_size(
rtems_id id,
void *segment,
rtems_unsigned32 *size
);
返回值代表的状态 :
RTEMS_SUCCESSFUL- 成功地获得内存块尺寸
RTEMS_INVALID_ADDRESS- segment 是空值
RTEMS_INVALID_ADDRESS- size 是空值
RTEMS_INVALID_ID- 无效区域 ID标识
RTEMS_INVALID_ADDRESS- segment超出了内存区的界限
描述:
该函数获得内存区中一个内存块的尺寸
|