RTX5 | 内存池01 - 内存池的使用

一、前言


内存池(Memory Pools)是线程安全的,固定大小的内存块。它们比动态堆栈分配内存操作更加快,且没有内存碎片化问题。因为线程安全,它们能够被线程与ISR同样地访问。

一个内存池能看被作为有效的(未使用的)内存块的链表,且它们有固定且相同的大小。从一个内存池里分配内存块提供给用户使用的话使用osMemoryPoolAlloc。使用osMemoryPoolFree将用户的内存块重新归还给内存池(此时用户不能再使用这块内存)。
在这里插入图片描述
共享内存是线程间交换信息的一个基本模型。使用内存池交换数据,相比于消息队列,内存池可以交换更为复杂的数据,且交换数据的效率更高。

什么是线程安全,网上有人总结得不错。简单来说,线程安全意味着一个方法或者一个实例(内存池,消息队列,信号量,互斥量等)可以被多个线程同时使用且没有问题发生。
在这里插入图片描述

STM32工程:
链接:https://pan.baidu.com/s/1jgNaS6A0CuId6_GiILg5hw
提取码:gie0

二、实验目的


1、建立一个内存池,并分配内存块0给用户使用。一段时间后,将内存块0归还给RTX5系统。

三、API


3.1、osMemoryPoolAttr_t

/* 使用案例1 */
const osMemoryPoolAttr_t memory_Poool_Attr =
{
	.name = "memory pool 1",                   /* 内存池的名字 */
};

在这里插入图片描述

3.2、osMemoryPoolNew

/* 使用案例1 */

/* 定义内存块的数据结构 */
typedef struct {
	
	uint8_t buf[32];
	uint8_t Idx;

}MEM_BLOCK_t;

/* 创建一个内存池 */
mpID_MemPool = osMemoryPoolNew(16,			        /* 内存池里内存块的数量 */
							   sizeof(MEM_BLOCK_t), /* 内存块的大小 */
							   &memory_Poool_Attr   /* 内存块的属性 */
							   );
if(NULL == mpID_MemPool)
{
	printf("Memory pool can't be created.\r\n");
}
else
{
	printf("Memory pool has been created.\r\n");
}

在这里插入图片描述

3.3、osMemoryPoolAlloc

/* 使用案例1 */
pMem = (MEM_BLOCK_t *)osMemoryPoolAlloc(mpID_MemPool,0U);  /* 从内存池里分配内存块0给用户使用*/
if(pMem != NULL)
{
	/* 获取内存块0成功,并初始化内存块0 */
	pMem->buf[0] = 100;
	pMem->Idx = 0;
}

/* 使用案例2 */
pMem = (MEM_BLOCK_t *)osMemoryPoolAlloc(mpID_MemPool,10U);  /* 从内存池里分配内存块10给用户使用*/
if(pMem != NULL)
{
	/* 获取内存块0成功,并初始化内存块0 */
	pMem->buf[0] = 100;
	pMem->Idx = 10;
}

在这里插入图片描述

3.4、osMemoryPoolFree

/* 使用案例1 */
osStatus_t status;
status = osMemoryPoolFree(mpID_MemPool,pMem);  /* 将内存池的内存块0归还给RTX5,此时用户不能再使用内存块0 */
if(status == osOK)
		printf("Memory block 0 back to the System.\r\n");  /* 打印信息 */

在这里插入图片描述

四、代码


4.1、main.h

在这里插入图片描述

4.2、main.c

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、Event Recorder调试


5.1、RTX RTOS

程序初始化后,创建内存池memory pool 1,接着将内存池的内存块0分配给用户使用。从RTX RTOS窗口看到,此时的Used blocks为1。此外,还能了解到内存池的指针地址是0x200008C0。
在这里插入图片描述
一段时间后,将内存块0归还给RTX5系统(从printf信息看到)。此时,RTX RTOS的窗口看到,Used bloacks从1变成0了。
在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wallace Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值