Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
堆_heap_动态内存管理
【TLSF】TLSF内存管理算法的简单使用
发布于 2024-05-20 14:49:02 浏览:494
订阅该版
[tocm] ## 简介 TLSF算法是专门用作内存管理的算法,作为内存管理的算法它就逃不开初始化申请释放操作,那么这里就简单介绍一下这几个操作,让大家更好的上手使用这个开源算法。 如果大家不了解这个算法的话可以先阅读这篇文章: [TLSF -- 内存管理中的超级英雄!](https://club.rt-thread.org/ask/article/83b7037a98bbbec5.html "TLSF -- 内存管理中的超级英雄!") 文章会按照以下顺序介绍,大家按需阅读: 1. 源文件获取 2. 堆区初始化 3. 内存申请 4. 内存释放 ## 源文件获取 源代码可以直接从github上获取: [https://github.com/mattconte/tlsf](https://github.com/mattconte/tlsf) 获取成功后,我们可以直接将tlsf.h和tlsf.c文件导入到我们的工程中就可以直接使用了。 ## 堆区初始化 首先介绍一下堆区初始化设计的函数 ```c tlsf_t tlsf_create(void* mem); tlsf_t tlsf_create_with_pool(void* mem, size_t bytes); pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes); ``` 函数作用: 1.tlsf_t tlsf_create(void* mem); 根据传入的内存空间初始化堆管理器,返回初始化完成后的指针,指针指向管理器的头部,即mem指针指向的地址。 如下图: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240520/0a458acbe677491188cf3d61c8c58609.png) 2.pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes); 函数用于将指定大小的内存块加入到堆管理器中。 3.tlsf_t tlsf_create_with_pool(void* mem, size_t bytes); 这个函数是上述两个函数的结合体,它的执行步骤如下: - 调用tlsf_create创建堆管理器 - 将初始化之后剩余的内存加入到堆管理器中,即将上图中control_t后面的空间加入到堆管理器中。 基于上述的三个函数,我们可以有两种方式初始化堆区 方式一: 将一片内存(空间大小大于control_t结构体的内存)传入tlsf_create_with_pool函数进行初始化 > 这种方式适用于内存块大小比较大的情况 例:创建一个大小为8kb的字符数组,然后传入函数进行初始化 ```c char heap[8192]; tlsf_create_with_pool(heap, sizeof(heap)); ``` 方式二: 先创建堆管理结构体,然后再将另一块内存加入内存池 例:两块内存,一块用于堆管理器初始化,另一块用于加入内存池 > 这种方式适用于有多块内存的情况 ```c char heap_control[4096]; char heap[4096]; tlsf_t tlsf = tlsf_create(heap_control); tlsf_add_pool(tlsf, heap, sizeof(heap)) ``` > 注:tlsf_t 类型 实质为 void * 类型 ## 内存申请 内存涉及的函数 ```c void* tlsf_malloc(tlsf_t tlsf, size_t bytes); void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size); ``` 函数作用: 1.void* tlsf_malloc(tlsf_t tlsf, size_t bytes); 传入堆管理器的指针以及想要获取的内存大小,我们就可以获取到我们想要的内存空间,它的执行过程如下: 将bytes的大小转换成该大小在位图中的位置,如果该位置上有空闲空间能够分配,那么就将该空间分配出去,如果没有则寻找比它大的空间,并且这个空间是所有比bytes大的空间中最小的那个,找到了则对其进行分割并将目标大小的内存块分配出去,否则直接返回空。 具体的流程图如下: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240520/c1360616e4f3f521f4c1b964cf6a0567.png.webp) 2.void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size); 该函数最主要的作用就是重新分配一份指定大小内存空间,这里不作详细讲解。 ## 内存释放 内存释放就涉及一个函数 ```c void tlsf_free(tlsf_t tlsf, void* ptr); ``` 它释放内存的步骤很好理解: 1. 如果释放内存的前一个内存块处于空闲状态,那么就将释放的内存与前一个内存块合并 2. 判断后一个内存的状态,如果空闲则与合并后的内存块再次合并 3. 将合并完成的内存块插入回内存池中 ## 总结 基于这几个函数大家基本上是能够比较好的去使用tlsf算法管理内存了,如果大家在阅读文章时有什么疑问可以在评论区提问,我也会积极回复的。大家对tlsf算法感兴趣的话也可以阅读源码,它的源码真的超级工整好看,非常建议大家去阅读。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
比特饼干
这家伙很懒,什么也没写!
文章
10
回答
1
被采纳
0
关注TA
发私信
相关文章
1
rt_malloc 申请内存失败
2
webnet heap最大使用量。
3
调度锁会引起线程内存不足
4
RT-Thread内存和字符串相关函数与C语言自带的内存和字符串相关函数冲突问题
5
webnet 是否可以做全动态网页,使用内存池来加快速度
6
boatload跳转到app反复重启,难道你们编译器有问题?
7
怎么释放动态线程占用的内存
8
内存堆使用时产生不对齐
9
pandora开发板使用cjson,内存不足。
10
小内存管理中rt_realloc的实现问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部