RTT学习笔记6-内存管理

1. 内存管理基础知识

1. RT-Thread 中的两种内存管理方式

  1. 动态内存堆管理
  2. 静态内存池管理

内存堆

2. 存分配管理算法

  1. 内存堆管理
  2. 内存池管理

内存堆管理

  1. 第一种是针对小内存块的分配管理(小内存管理算法);

  2. 第二种是针对大内存块的分配管理(slab 管理算法);

  3. 第三种是针对多内存堆的分配情况(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);

Guess you like

Origin blog.csdn.net/u010261063/article/details/121191067