RT-Thread 动态内存管理与静态内存管理

一  静态内存池

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);

删除内存池

/**
 * @param mp:内存池对象句柄
 * @retval  RT_EOK
*/

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);

脱离内存池

/**
 * @param mp:内存池对象句柄
 * @retval  RT_EOK
*/

rt_err_t rt_mp_detach(rt_mp_t mp);

分配内存块

/**
 * @param mp:内存池对象句柄

 * @param time:超时时间
 * @retval  成功时返回分配的内存块地址,失败时返回RT_NULL
*/

void *rt_mp_alloc (rt_mp_t mp, rt_int32_t time);

释放内存块

/**
 * @param block:内存块指针
 * @retval  无
*/

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. 动态内存池相关接口

初始化系统堆空间

/**
 * @brief 在使用堆内存时,必须要在系统初始化的时候进行堆内存的初始化
 * @param begin_addr:堆内存区域起始地址

 * @param end_addr:堆内存区域结束地址
*/

void rt_system_heap_init(void* begin_addr, void* end_addr);

分配内存块

/**
 * @brief 从内存堆上分配用户指定大小的内存块
 * @param nbytes:申请的内存大小

 * @retval  返回重新分配的内存块地址
*/

void* rt_malloc(rt_size_t nbytes);

重分配内存块

/**
 * @brief  在已分配内存块的基础上重新分配内存块的大小(增加或缩小)
 * @param rmem:指向已分配的内存块

 * @param newsize:重新分配的内存大小

 * @retval  返回重新分配的内存块地址
*/

void *rt_realloc(void *rmem, rt_size_t newsize);

分配多内存块

/**
 * @brief 从内存堆中分配连续内存地址的多个内存块,并且所有分配的内存块都被初始化成零
 * @param count:内存块数量

 * @param size:内存块容量
 * @retval 返回的指针指向第一个内存块的地址
*/

void *rt_calloc(rt_size_t count, rt_size_t size);

释放内存块

/**
 * @param ptr:待释放的内存块指针
*/

void rt_free (void *ptr);

设置分配钩子函数

/**
 * @brief 设置的钩子函数会在内存分配完成后进行回调,回调时,会把分配到的内存块地址和大
               小做为入口参数传递进去
 * @param hook:钩子函数指针
*/

void rt_malloc_sethook(void (*hook)(void *ptr, rt_size_t size));

设置内存释放钩子函数

/**
 * @brief 设置的钩子函数会在调用内存释放完成前进行回调。回调时,释放的内存块地址会做为
               入口参数传递进去(此时内存块并没有被释放)
 * @param hook:钩子函数指针
*/

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;

 

你可能感兴趣的:(RT-Thread)