CMSIS-RTOS2 文档翻译 之 参考(CMSIS-RTOS2 API 之 内存池)

内存池

管理线程安全的固定大小的动态内存块。更多...

数据结构

struct  osMemoryPoolAttr_t
 内存池的属性结构体。更多...
 

类型定义

typedef void * osMemoryPoolId_t
 

函数

osMemoryPoolId_t osMemoryPoolNew (uint32_t block_count, uint32_t block_size, const osMemoryPoolAttr_t *attr)
 创建并初始化一个内存池对象。更多...
 
const char * osMemoryPoolGetName (osMemoryPoolId_t mp_id)
 获取内存池对象的名称。更多...
 
void * osMemoryPoolAlloc (osMemoryPoolId_t mp_id, uint32_t timeout)
 从内存池中分配内存块。更多...
 
osStatus_t osMemoryPoolFree (osMemoryPoolId_t mp_id, void *block)
 将分配的内存块返回到内存池。更多...
 
uint32_t osMemoryPoolGetCapacity (osMemoryPoolId_t mp_id)
 获取内存池中的最大内存块数。更多...
 
uint32_t osMemoryPoolGetBlockSize (osMemoryPoolId_t mp_id)
 获取内存池中的内存块大小。更多...
 
uint32_t osMemoryPoolGetCount (osMemoryPoolId_t mp_id)
 获取内存池中使用的内存块数量。更多...
 
uint32_t osMemoryPoolGetSpace (osMemoryPoolId_t mp_id)
 获取内存池中可用的内存块数量。更多...
 
osStatus_t osMemoryPoolDelete (osMemoryPoolId_t mp_id)
 删除一个内存池对象。更多...
 

描述

内存池是线程安全的固定大小内存块。它们的运行速度比动态分配的堆快得多,并且不会遭受碎片化。 线程安全的,他们可以通过线程和ISR来访问。

内存池可以看作固定和相同大小的可用(未使用)内存块的链表。从池中分配内存(使用 osMemoryPoolAlloc)只需从列表中取消链接,并将控制权移交给用户。释放内存到池(使用 osMemoryPoolFree)只需将块重新链接到列表中。

CMSIS-RTOS Memory Pools
注意
一个人不得写入释放块。实现将未使用的块的存储器重用于内部控制数据,即链接列表指针。

共享内存是线程之间交换信息的基本模型之一。使用内存池交换数据,与消息队列相比,您可以在线程之间共享更复杂的对象。内存池管理功能用于定义和管理这种固定大小的内存池。

注意
可以从中断服务例程调用osMemoryPoolAlloc,osMemoryPoolFree,osMemoryPoolGetCapacity,osMemoryPoolGetBlockSize,osMemoryPoolGetCount,osMemoryPoolGetSpace 函数。
有关 RTX5 配置选项,请参阅内存池配置。

数据结构文档

struct osMemoryPoolAttr_t

用于配置内存池的属性。

有关使用的详细信息,请参阅内存管理

数据字段
const char *name内存池的名称

指向具有人类可读内存池对象名称的字符串。
默认值:NULL 。

uint32_tattr_bits属性位

保留以供将来使用(设为 '0')。
默认值:0 。

void *cb_mem内存控制块

指向内存池控制块对象的内存位置。这可以选择用于定制内存管理系统。
默认值:NULL(使用内核内存管理)。

uint32_tcb_size为控制块提供的内存大小

内存块的大小与 cb_mem 一起传递。必须是内存池控制块对象的大小或更大。

void *mp_mem内存数据存储

指向内存池对象数据的内存位置。
默认值:NULL 。

uint32_tmp_size为数据存储提供的内存大小

通过 mp_mem 传递的内存大小。

类型定义文档

内存池 ID 标识内存池。

返回者:

函数文档

osMemoryPoolId_t osMemoryPoolNew(uint32_t block_count,
  uint32_t block_size,
  const osMemoryPoolAttr_tattr 
 )  
参数
[in]block_count内存池中的最大内存块数。
[in]block_size内存块大小以字节为单位。
[in]attr内存池属性; NULL:默认值。
返回
内存池 ID 以供其他函数参考,或者在发生错误时为 NULL 。

函数 osMemoryPoolNew 创建并初始化一个内存池对象,并返回指向内存池对象标识符的指针,或者在发生错误时返回 NULL 。它可以在 RTOS 启动之前(调用 osKernelStart)安全地调用,但不能在它初始化之前(调用 osKernelInitialize)调用

所需的内存总量至少为 block_count * block_size 。内存池中的内存只能在 block_size 的固定部分分配/释放。

注意
该函数不能从中断服务程序调用。

代码示例

#include "cmsis_os2.h" // CMSIS RTOS header file
/*----------------------------------------------------------------------------
* Memory Pool creation & usage
*---------------------------------------------------------------------------*/
#define MEMPOOL_OBJECTS 16 // number of Memory Pool Objects
typedef struct { // object data type
uint8_t Buf[32];
uint8_t Idx;
} MEM_BLOCK_t;
void Thread_MemPool ( void *argument); // thread function
osThreadId_t tid_Thread_MemPool; // thread id
osMemoryPoolId_t mpid_MemPool; // memory pool id
int Init_MemPool ( void)
{
mpid_MemPool = osMemoryPoolNew(MEMPOOL_OBJECTS, sizeof(MEM_BLOCK_t), NULL);
if (mpid_MemPool == NULL) {
; // MemPool object not created, handle failure
}
tid_Thread_MemPool = osThreadNew (Thread_MemPool,NULL , NULL);
if (tid_Thread_MemPool == NULL) {
return(-1);
}
return(0);
}
void Thread_MemPool ( void *argument)
{
osStatus_t status;
MEM_BLOCK_t *pMem = 0;
while (1) {
; // Insert thread code here...
pMem = (MEM_BLOCK_t *) osMemoryPoolAlloc (mpid_MemPool, NULL); // get Mem Block
if (pMem) { // Mem Block was available
pMem->Buf[0] = 0x55; // do some work...
pMem->Idx = 0;
status = osMemoryPoolFree (mpid_MemPool, pMem); // free mem block
switch (status) {
case osOK:
break;
break;
break;
default:
break;
}
}
osThreadYield (); // suspend thread
}
}

const char * osMemoryPoolGetName(osMemoryPoolId_t mp_id) 
参数
[in]mp_id内存池 ID 由 osMemoryPoolNew 获取。
返回
名称为 NULL 终止的字符串。

函数 osMemoryPoolGetName 返回指向由参数 mp_id 标识的内存池的名称字符串的指针,或者在出现错误时返回 NULL 。

注意
该函数不能从中断服务程序调用。
void * osMemoryPoolAlloc(osMemoryPoolId_t mp_id,
  uint32_t timeout 
 )  
参数
[in]mp_id内存池 ID 由 osMemoryPoolNew 获取。
[in]timeout超时值或 0 在没有超时的情况下。
返回
分配的内存块的地址或 NULL 在没有内存可用的情况下。

阻塞函数 osMemoryPoolAlloc 分配内存池参数 mp_id 并返回一个指向分配内存地址的指针,或者在出现错误时返回 0 。

参数 timeout 指定系统等待分配内存的时间。系统等待时,调用此函数的线程将进入 BLOCKED 状态。只要至少有一个内存块可用,线程就会变为 READY 。

参数超时可以有以下值:

  • 当超时为 0 时,函数立即返回(即尝试语义)。
  • 当超时设置为 osWaitForeve r时,该函数将等待无限的时间直到分配内存(即等待语义)。
  • 所有其他值都指定了内核中的超时时间(即定时等待语义)。

结果是指向已分配内存块的指针,如果没有可用内存,则返回 NULL 。

注意
用户有责任尊重块大小,即不能超出块限制访问内存。
如果参数 timeout 设置为 0 ,可以从中断服务例程调用。

代码示例

请参阅 osMemoryPoolNew 。

osStatus_t osMemoryPoolFree(osMemoryPoolId_t mp_id,
  void * block 
 )  
参数
[in]mp_id内存池 ID 由 osMemoryPoolNew 获取。
[in]block将分配的内存块的地址返回给内存池。
返回
状态代码,指示该功能的执行状态。

函数 osMemoryPoolFree 释放由参数 mp_id 指定的内存池对象中的参数块指定的内存池块。内存块被放回到可用块的列表中。

如果另一个线程正在等待内存变为可用状态,则线程将进入 READY 状态。

可能的 osStatus_t 返回值:

  • osOK: 内存已经释放。
  • osErrorParameter: 参数 mp_id 是 NULL 或无效,块指向无效内存。
  • osErrorResource: 由参数 mp_id 指定的内存池处于无效内存池状态。
注意
osMemoryPoolFree 可以对给定的块指针执行某些检查。但是,使用 osMemoryPoolFree 与 osMemoryPoolAlloc 接收到的指针之外的其他指针具有 UNPREDICTED 行为。
这个函数可以从中断服务程序中调用。

代码示例

请参阅 osMemoryPoolNew 。

uint32_t osMemoryPoolGetCapacity(osMemoryPoolId_t mp_id) 
参数
[in]mp_id内存池 ID 由 osMemoryPoolNew 获取。
返回
最大内存块数量。

函数 osMemoryPoolGetCapacity 返回由参数 mp_id 指定的内存池对象中的最大内存块数量,如果有错误,则返回 0 。

注意
这个函数可以从中断服务程序中调用。
uint32_t osMemoryPoolGetBlockSize(osMemoryPoolId_t mp_id) 
参数
[in]mp_id内存池 ID 由 osMemoryPoolNew 获取。
返回
内存块大小以字节为单位。

函数 osMemoryPoolGetBlockSize 返回由参数 mp_id 指定的内存池对象中的内存块大小(以字节为单位)或出现错误时返回 0 。

注意
这个函数可以从中断服务程序中调用。
uint32_t osMemoryPoolGetCount(osMemoryPoolId_t mp_id) 
参数
[in]mp_id内存池 ID 由 osMemoryPoolNew 获取。
返回
使用的内存块数量。

函数 osMemoryPoolGetCount 返回由参数 mp_id 指定的内存池对象中使用的内存块数量,或者在出现错误时返回 0 。

注意
这个函数可以从中断服务程序中调用。
uint32_t osMemoryPoolGetSpace(osMemoryPoolId_t mp_id) 
参数
[in]mp_id内存池 ID 由 osMemoryPoolNew 获取。
返回
可用的内存块数量。

函数 osMemoryPoolGetSpace 返回由参数 mp_id 或 0 指定的内存池对象中可用的内存块数量,以防出错。

注意
这个函数可以从中断服务程序中调用。
osStatus_t osMemoryPoolDelete(osMemoryPoolId_t mp_id) 
参数
[in]mp_id内存池 ID 由 osMemoryPoolNew 获取。
返回
状态代码,指示该功能的执行状态。

函数 osMemoryPoolDelete 删除由参数 mp_id 指定的内存池对象。它释放内存池处理获得的内部内存。此通话结束后,mp_id 不再有效,无法使用。 内存池可以使用函数 osMemoryPoolNew 再次创建。

可能的 osStatus_t 返回值:

  • osOK: 内存池对象已被删除。
  • osErrorParameter: 参数 mp_id 是 NULL 或无效。
  • osErrorResource: 由参数 mp_id 指定的内存池处于无效内存池状态。
  • osErrorISR: osMemoryPoolDelete 不能从中断服务例程调用。
注意
该函数不能从中断服务程序调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值