推荐星级:
  • 1
  • 2
  • 3
  • 4
  • 5

RT-Thread快速入门-内存池

更新时间:2023-10-03 07:02:02 大小:189K 上传用户:sun2152查看TA发布的资源 标签:RT-Thread内存 下载积分:1分 评价赚积分 (如何评价?) 打赏 收藏 评论(0) 举报

资料介绍

引言 上篇文章介绍了动态内存堆相关的内容: RT-Thread 快速入门-动态内存堆管理 这篇文章继续介绍 RT-Thread 内存管理剩下的部分——内存池。 为何引入内存池? 内存堆虽然方便灵活,但是存在明显的缺点:  分配效率低。每次分配内存的时候,都需要查找空闲内存块。  容易产生内存碎片。 为了规避这两个问题,RT-Thread 提供了内存池(Memory Pool)的管理机制。 理解内存池 内存池用于分配大小相同的小内存块,可以极大地提高内存分配和释放的速度, 且避免内存碎片。 内存池的其他优点:支持线程挂起。内存池无空闲内存块时,申请线程会被挂起, 直到有可用内存块。 简单理解,就是将相同大小的内存块通过某种方式放在一起,就好比将各个内存 块放在类似于水池的容器里,需要用的时候,就从这个池子里取。 1. 内存块工作机制 使用内存池需要以下几个步骤:  创建内存池。先向系统申请一块大的内存。  分割大内存块。将申请成功过的大内存块,分成多个同样大小的小内存块。  连接小内存块。以链表的形式,将各个小内存块连接起来。  分配内存块。在用户申请内存块时,从空闲链表中取出第一个内存块给申 请者。 内存池工作机制如下图所示。 注意:内存池一旦创建并初始化完成后,其内部的内存块大小就固定了,不能再 做调整。 2. 内存池控制块 RT-Thread 通过内存池控制块来操作和管理内存池,内存控制块结构体用于存 放内存池的一些信息,包括:内存池数据域起始地址、内存块大小和内存块列表, 还有内存块与内存块之间连接用的链表结构等等。 其具体的定义由 struct rt_mempool 表示,如下: 其中,rt_mp_t 表示的是内存池控制块的句柄,即指向内存池结构体的指针。 结构体成员 suspend_thread 形成了一个申请线程等待列表,即当内存池中无可 用内存块时,其申请线程允许等待,申请线程将挂起在 suspend_thread 链表上。 内存池管理 RT-Thread 提供了管理内存池的函数接口,包含:  创建 / 初始化内存池  申请内存块  释放内存块  删除 / 脱离内存池 老规矩,本文详细讲解常用的几种函数接口,其他不常用的接口简单介绍,了解 即可。 1. 动态创建内存池 RT-Thread 创建内存池,与创建其他内核对象类似,具有两种方式:动态创建、 静态初始化。 动态创建内存池是由内核负责完成分配内存池需要的内存资源,包括内存池控制 块和内存池缓冲区。创建内存池的函数原型如下: rt_mp_t rt_mp_create(const char* name, rt_size_t block_count, rt_size_t block_size) 参数 name 内存池的名字;block_count 为内存池中小内存块的个数; block_size 为内存块的大小,单位字节。 创建成功,则返回内存池对象句柄;否则,返回 RT_NULL。 调用 rt_mp_create() 可以创建一个与需求的内存块大小、数目相匹配的内存 池 。该函数从系统中申请一个内存池对象,自动分配内存池控制块,然后从内 存堆中分配一个内存缓冲,该缓冲区大小由内存块数目与块大小计算得到的。 申请的资源准备好后,初始化内存池控制块,然后将内存缓冲区组织成可用于分 配的空闲块链表。 注意:动态创建内存池时,需要内存堆资源能够满足要求。 2. 静态初始化内存池 静态方式创建的内存池,所需要的内存资源是由用户自己分配的。需要用户定义 一个内存池控制块,并且指定一个内存缓冲区,用于组织内存池。然后调用如下 函数,初始化内存池: rt_err_t rt_mp_init(rt_mp_t mp, const char *name, void *start, rt_size_t size, rt_size_t block_size) 此函数中,参数 mp 为内存池控制块指针;start 为用户指定的缓冲区首地址。 size 为内存池数据区域的大小。其他参数与 rt_mp_create() 相同。 初始化成功,返回 RT_EOK;否则,返回 -RT_ERROR。 该函数对内存池进行初始化,将内存池用到的内存空间组织成可用于分配的空闲 块链表。内存池中内存块的个数为 size / (block_size + 指针大小) 计算结果向下取整。 3. 分配内存块 内存池创建成功了。接下来就是如何用内存池:分配内存块和释放内存。 从指定的内存池中申请一个内存块,RT-Thread 的函数接口如下: void *rt_mp_alloc (rt_mp_t mp, rt_int32_t time) 参数 mp 为内存池句柄,即内存池控制块指针;time 为申请超时时间。 分配成功,则返回内存块地址;否则,返回 RT_NULL。 线程调用此函数分配内存块,如果内存池中有可用的内存块,则从内存池的空闲 链表上取下一个内存块,并减少空闲块数目,将这个内存块的地址返回给调用线 程。 若内存池中没有空闲内存块,则判断超时时间:  超时时间为零,则立即返回 RT_NULL。  超时时间大于零。则把调用线程挂起在这个内存池对象上。 4. 释放内存块 内存块使用完毕之后,必须将其释放掉,否则会造成内存泄漏。释放内存块的函 数接口如下: void rt_mp_free (void *block) 参数 block 为内存块指针。 调用该函数释放内存块过程中,首先通过内存块指针计算得到该内存块所属的内 存池,然后把该内存块加入到空闲内存块链表上,并增加内存池可用内存块的数 目。 在释放过程中,会判断该内存池对象上是否有挂起线程,若有,则唤醒挂起线程 链表上第一个线程。 内存池实战演练 举个栗子。 该栗子以静态方式创建一个内存池。动态创建两个线程,一个线程试图从内存池 申请内存块,一个线程释放内存块。 示例代码如下: 上面详细介绍了 RT-Thread 内存池常用的几个接口函数。还有几个相关的函数, 在这简单介绍一下,了解了解。 1. 删除动态创建的内存池 删除 rt_mp_create() 函数创建的内存池,需要调用如下函数: rt_err_t rt_mp_delete(rt_mp_t mp) 这个函数首先唤醒等待在该内存池对象上的所有线程,然后释放掉从内存堆上申 请的内存缓冲区。 2. 脱离静态创建的内存池 脱离 rt_mp_init() 函数初始化的内存池,函数接口如下: rt_err_t rt_mp_detach(rt_mp_t mp) 调用该函数后,内核先唤醒等待在该内存池对象上的所有线程,然后将内存池对 象从内核对象管理器中脱离。 小结 利用两篇文章介绍完毕 RT-Thread 内存管理相关的内容:  内存堆管理。内存堆方便灵活,但是容易出现碎片以及分配效率低。  内存池管理。内存池分配速度快,不会产生内存碎片,但是只能申请固定 大小的内存块,不够灵活。 各有优缺点,需要根据实际情况选择何种方式进行管理内存。

部分文件列表

文件名 大小
RT-Thread快速入门-内存池.pdf 189K

【关注B站账户领20积分】

全部评论(0)

暂无评论

上传资源 上传优质资源有赏金

  • 打赏
  • 30日榜单
  • sd-hyc 打赏1.00元   1天前

    资料:神州易刻2024最新版

  • 柏涵 打赏1.00元   3天前

    资料:XDS100_v1_1_RTM

  • 21ic下载 打赏310.00元   3天前

    用户:jh0355

  • 21ic下载 打赏310.00元   3天前

    用户:w178191520

  • 21ic下载 打赏210.00元   3天前

    用户:gsy幸运

  • 21ic下载 打赏210.00元   3天前

    用户:zhengdai

  • 21ic下载 打赏210.00元   3天前

    用户:jh03551

  • 21ic下载 打赏110.00元   3天前

    用户:liqiang9090

  • 21ic下载 打赏60.00元   3天前

    用户:sun2152

  • 21ic下载 打赏60.00元   3天前

    用户:xuzhen1

  • 21ic下载 打赏80.00元   3天前

    用户:xzxbybd

  • 21ic下载 打赏25.00元   3天前

    用户:WK520077778

  • 21ic下载 打赏20.00元   3天前

    用户:w1966891335

  • 21ic下载 打赏20.00元   3天前

    用户:铁蛋锅

  • 21ic下载 打赏20.00元   3天前

    用户:玉落彼岸

  • 21ic下载 打赏15.00元   3天前

    用户:kk1957135547

  • 21ic下载 打赏10.00元   3天前

    用户:zpf22332

  • 21ic下载 打赏5.00元   3天前

    用户:pangpidan

  • 21ic下载 打赏5.00元   3天前

    用户:hpxny

  • 21ic下载 打赏5.00元   3天前

    用户:pandq2009

  • 21ic下载 打赏5.00元   3天前

    用户:tomp

推荐下载