外观
内存池示例
2026-3-24
概述
本示例演示 RT-Thread 内存池的使用方法。通过初始化一个内存池和两个线程,实现一个线程分配内存块,另一个线程释放内存块的功能。帮助用户掌握内存池这一动态内存管理机制的使用方法。
内存池的作用
内存池(mempool)是一种用于动态内存分配的管理机制,用于解决频繁的内存分配和释放导致的内存碎片问题。内存池预先分配一块固定大小的内存空间,并将其分割成多个固定大小的内存块,应用程序需要时可以快速分配和释放这些内存块,避免了使用堆内存分配时可能出现的碎片问题,提高了内存分配的效率和确定性。
创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
固化设备树

固化 APP

核心代码
内存池示例相关 API
rt_mp_init:初始化内存池,指定名称、内存池缓冲区、总大小和每个内存块大小;rt_mp_alloc: 从内存池中分配一个内存块;rt_mp_free:释放一个内存块回内存池;rt_mp_detach:分离内存池;
applications/mempool_example.c
void mempool_alloc_thread_entry(void *parameter)
{
int i;
for (i = 0; i < BLOCK_COUNT; i++)
{
block_queue[i] = rt_mp_alloc(&mp, RT_WAITING_FOREVER); // 分配内存块
if (block_queue[i] != RT_NULL)
{
rt_kprintf("alloc thread: alloc block[%d] = %p\n", i, block_queue[i]);
}
}
rt_kprintf("alloc thread exit\n");
}
void mempool_free_thread_entry(void *parameter)
{
int i;
for (i = 0; i < BLOCK_COUNT; i++)
{
rt_mp_free(block_queue[i]); // 释放内存块
rt_kprintf("free thread: free block[%d] = %p\n", i, block_queue[i]);
}
rt_kprintf("free thread exit\n");
rt_mp_detach(&mp); // 脱离内存池
}
int mempool_example(void)
{
rt_thread_t alloc_tid = RT_NULL;
rt_thread_t free_tid = RT_NULL;
rt_err_t result;
result = rt_mp_init(&mp, "mempool", mempool_pool, POOL_SIZE, BLOCK_SIZE); // 初始化内存池
if (result != RT_EOK)
{
rt_kprintf("mp_init failed\n");
return result;
}
alloc_tid = rt_thread_create("mp_alloc", mempool_alloc_thread_entry, RT_NULL,
THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE);
if (alloc_tid != RT_NULL)
{
rt_thread_startup(alloc_tid);
}
free_tid = rt_thread_create("mp_free", mempool_free_thread_entry, RT_NULL,
THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE);
if (free_tid != RT_NULL)
{
rt_thread_startup(free_tid);
}
return 0;
}
MSH_CMD_EXPORT(mempool_example, mempool example);运行示例
操作步骤
- 将程序下载到开发板
- 打开串口终端连接开发板
- 输入
mempool_example命令
预期结果
- 分配线程依次分配 10 个内存块
- 释放线程依次释放这 10 个内存块
- 最后分离内存池,两个线程正常退出
rtt 终端
msh />mempool_example
alloc thread: alloc block[0] = 0x040f0010
alloc thread: alloc block[1] = 0x040f0054
alloc thread: alloc block[2] = 0x040f0098
alloc thread: alloc block[3] = 0x040f00dc
alloc thread: alloc block[4] = 0x040f0120
alloc thread: alloc block[5] = 0x040f0164
alloc thread: alloc block[6] = 0x040f01a8
alloc thread: alloc block[7] = 0x040f01ec
alloc thread: alloc block[8] = 0x040f0230
alloc thread: alloc block[9] = 0x040f0274
alloc thread exit
msh />free thread: free block[0] = 0x040f0010
free thread: free block[1] = 0x040f0054
free thread: free block[2] = 0x040f0098
free thread: free block[3] = 0x040f00dc
free thread: free block[4] = 0x040f0120
free thread: free block[5] = 0x040f0164
free thread: free block[6] = 0x040f01a8
free thread: free block[7] = 0x040f01ec
free thread: free block[8] = 0x040f0230
free thread: free block[9] = 0x040f0274
free thread exit