一 静态内存池
1.静态内存池接口
创建内存池 | /** * @param name :内存池名 * @param block_count:内存块数量 * @param block_size:内存块容量 * @retval 创建内存池对象成功,将返回内存池的句柄;否则返回RT_NULL */ rt_mp_t rt_mp_create(const char* name, rt_size_t block_count, rt_size_t block_size); |
删除内存池 | /** rt_err_t rt_mp_delete(rt_mp_t mp); |
初始化内存池 | /** * @param mp:内存池对象句柄 * @param name :内存池名 * @param start:内存池的起始位置; * @param size:内存池大小; * @param block_size:内存块大小 * @retval 初始化成功返回RT_OK;否则返回-RT_ERROR */ rt_err_t rt_mp_init(rt_mp_t mp, const char* name, void *start, rt_size_t size, rt_size_t block size); |
脱离内存池 | /** rt_err_t rt_mp_detach(rt_mp_t mp); |
分配内存块 | /** * @param time:超时时间 void *rt_mp_alloc (rt_mp_t mp, rt_int32_t time); |
释放内存块 | /** void rt_mp_free (void *block); |
2. 创建内存池方式一
static rt_uint8_t mempool[4096];
static struct rt_mempool mp; /* 静态内存池对象 */
/* 初始化内存池对象,每个内存块80字节 */
rt_mp_init(&mp, "mp1", &mempool[0], sizeof(mempool), 80);
3 创建内存池方式二
/* 定义内存池控制块 */
rt_mp_t mp = RT_NULL;
/* 创建一个静态内存池 */
mp = rt_mp_create("test_mp",
20,//内存块数量
80);//内存块大小
if (test_mp != RT_NULL)
rt_kprintf(" 静态内存池创建成功!\n\n");
4 申请与释放内存块
char *block;
/* 申请一个内存块 */
block = rt_mp_alloc(&mp, RT_WAITING_FOREVER);
/* 释放这个内存块 */
rt_mp_free(block);
block = RT_NULL;
5 静态内存池知识点
- 静态内存池就是将一个大内存分成同等大小的多个内存块
- 静态内存池一次只能申请一个内存块,不能自由定义大小
- 内存池一旦初始化完成,内部的内存块大小将不能再做调整
二 动态内存池
1. 动态内存池相关接口
初始化系统堆空间 | /** * @param end_addr:堆内存区域结束地址 void rt_system_heap_init(void* begin_addr, void* end_addr); |
分配内存块 | /** * @retval 返回重新分配的内存块地址 void* rt_malloc(rt_size_t nbytes); |
重分配内存块 | /** * @param newsize:重新分配的内存大小 * @retval 返回重新分配的内存块地址 void *rt_realloc(void *rmem, rt_size_t newsize); |
分配多内存块 | /** * @param size:内存块容量 void *rt_calloc(rt_size_t count, rt_size_t size); |
释放内存块 | /** void rt_free (void *ptr); |
设置分配钩子函数 | /** void rt_malloc_sethook(void (*hook)(void *ptr, rt_size_t size)); |
设置内存释放钩子函数 | /** void rt_free_sethook(void (*hook)(void *ptr)); |
2 动态内存相关知识点
- 使用动态内存,需要打开宏RT_USING_USER_MAIN 与 RT_USING_HEAP
- rt_system_heap_init在board.c中的rt_hw_board_init函数中已经被调用
- 系统能够使用的栈大小由宏 RT_HEAP_SIZE 进行配置
3. 使用动态内存
/* 定义申请内存的指针 */
rt_uint32_t *ptr = RT_NULL;
ptr = rt_malloc(64); /* 申请64字节内存 */
/* 释放内存块*/
rt_free(ptr[i]);
ptr[i] = RT_NULL;