1. 内存管理基础知识
1. RT-Thread 中的两种内存管理方式
- 动态内存堆管理
- 静态内存池管理
内存堆
2. 存分配管理算法
- 内存堆管理
- 内存池管理
内存堆管理
-
第一种是针对小内存块的分配管理(小内存管理算法);
-
第二种是针对大内存块的分配管理(slab 管理算法);
-
第三种是针对多内存堆的分配情况(memheap 管理算法)
- RT-Thread 将 “ZI 段结尾处” 到内存尾部的空间用作内存堆
- 小内存管理算法主要针对系统资源比较少,一般用于小于 2MB 内存空间的系统;
- 而 slab 内存管理算法则主要是在系统资源比较丰富时,提供了一种近似多内存池管理算法的快速算法。
- RT-Thread 还有一种针对多内存堆的管理算法,即 memheap 管理算法。memheap 方法适用于系统存在多个内存堆的情况,它可以将多个内存 “粘贴” 在一起,形成一个大的内存堆,用户使用起来会非常方便。
经过查询源码,rtt nano 默认分配的 heap 是15K
2. 内存堆使用的函数
从内存堆上分配用户指定大小的内存块
void *rt_malloc(rt_size_t nbytes);
释放内存块
void rt_free (void *ptr);
已分配内存块的基础上重新分配内存块的大小
void *rt_realloc(void *rmem, rt_size_t newsize);
内存堆中分配连续内存地址的多个内存块
void *rt_calloc(rt_size_t count, rt_size_t size);
内存分配钩子,分配完成后调用
void rt_malloc_sethook(void (*hook)(void *ptr, rt_size_t size));
- 回调函数形式
void hook(void *ptr, rt_size_t size);
内存池
- 内存池是一种内存分配方式,用于分配大量大小相同的小内存块
- 内存池一旦初始化完成,内部的内存块大小将不能再做调整。
- 当内存池中无可用内存块,并且申请线程允许等待时,申请线程将挂起在 suspend_thread 链表上
内存池相关函数
创建内存池
//动态
rt_mp_t rt_mp_create(const char* name,
rt_size_t block_count,
rt_size_t block_size);
//静态
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_delete(rt_mp_t mp);
//静态
rt_err_t rt_mp_detach(rt_mp_t mp);
申请内存块
void *rt_mp_alloc (rt_mp_t mp, rt_int32_t time);
归还内存块
void rt_mp_free (void *block);