数据结构 | |
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)只需将块重新链接到列表中。
-
注意
- 一个人不得写入释放块。实现将未使用的块的存储器重用于内部控制数据,即链接列表指针。
共享内存是线程之间交换信息的基本模型之一。使用内存池交换数据,与消息队列相比,您可以在线程之间共享更复杂的对象。内存池管理功能用于定义和管理这种固定大小的内存池。
-
注意
- 可以从中断服务例程调用osMemoryPoolAlloc,osMemoryPoolFree,osMemoryPoolGetCapacity,osMemoryPoolGetBlockSize,osMemoryPoolGetCount,osMemoryPoolGetSpace 函数。
- 有关 RTX5 配置选项,请参阅内存池配置。
数据结构文档
struct osMemoryPoolAttr_t |
用于配置内存池的属性。
有关使用的详细信息,请参阅内存管理
数据字段 | ||
---|---|---|
const char * | name | 内存池的名称 指向具有人类可读内存池对象名称的字符串。 |
uint32_t | attr_bits | 属性位 保留以供将来使用(设为 '0')。 |
void * | cb_mem | 内存控制块 指向内存池控制块对象的内存位置。这可以选择用于定制内存管理系统。 |
uint32_t | cb_size | 为控制块提供的内存大小 内存块的大小与 cb_mem 一起传递。必须是内存池控制块对象的大小或更大。 |
void * | mp_mem | 内存数据存储 指向内存池对象数据的内存位置。 |
uint32_t | mp_size | 为数据存储提供的内存大小 通过 mp_mem 传递的内存大小。 |
类型定义文档
函数文档
osMemoryPoolId_t osMemoryPoolNew | ( | uint32_t | block_count, |
uint32_t | block_size, | ||
const osMemoryPoolAttr_t * | attr | ||
) |
-
参数
-
[in] block_count 内存池中的最大内存块数。 [in] block_size 内存块大小以字节为单位。 [in] attr 内存池属性; NULL:默认值。
-
返回
- 内存池 ID 以供其他函数参考,或者在发生错误时为 NULL 。
函数 osMemoryPoolNew 创建并初始化一个内存池对象,并返回指向内存池对象标识符的指针,或者在发生错误时返回 NULL 。它可以在 RTOS 启动之前(调用 osKernelStart)安全地调用,但不能在它初始化之前(调用 osKernelInitialize)调用。
所需的内存总量至少为 block_count * block_size 。内存池中的内存只能在 block_size 的固定部分分配/释放。
-
注意
- 该函数不能从中断服务程序调用。
代码示例
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 | ||
) |
-
返回
- 分配的内存块的地址或 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 不能从中断服务例程调用。
-
注意
- 该函数不能从中断服务程序调用。