定义
TLSF(全称Two-Level Segregated Fit)
源码
https://github.com/mattconte/tlsf
代码
结构体
typedef struct block_header_t {
/* 指向上一个物理块。*/
struct block_header_t * prev_phys_block;
/* 此块的大小,不包括块头。*/
size_t size;
/* 下一个和上一个空闲块。*/
struct block_header_t * next_free;
struct block_header_t * prev_free;
} block_header_t;
/*
**由于块大小始终至少是 4 的倍数,因此两个最小
** 大小字段的重要位用于存储块状态:
** - 位 0:块是忙还是空闲
** - 位 1:前一个块是忙碌还是空闲
*/
static const size_t block_header_free_bit = 1 << 0;
static const size_t block_header_prev_free_bit = 1 << 1;
/*已经使用的块已经使用的内存大小*/
static const size_t block_header_overhead = sizeof(size_t);
/* 用户数据直接在已使用块中的大小字段之后开始。*/
static const size_t block_start_offset =
offsetof(block_header_t, size) + sizeof(size_t);
/*
*一个自由块的最小大小是整个存储空间减去头部说明
*更大的空间索引是FL_INDEX
*/
static const size_t block_size_min =
sizeof(block_header_t) - sizeof(block_header_t *);
static const size_t block_size_max = tlsf_cast(size_t, 1) << FL_INDEX_MAX;
/* TLSF 控制结构。*/
typedef struct control_t {
/* 空列表指向此块以指示它们是空闲的。*/
block_header_t block_null;
/* 位图空闲列表。*/
unsigned int fl_bitmap;
unsigned int sl_bitmap[FL_INDEX_COUNT];
/* 空闲列表的控制链表。*/
block_header_t * blocks[FL_INDEX_COUNT][SL_INDEX_COUNT];
} control_t;
/* 在执行指针算术时用于强制转换的类型。*/
typedef ptrdiff_t tlsfptr_t;
堆的创建
lv_tlsf_t lv_tlsf_create_with_pool(void * mem, size_t bytes)
{
/*从mem开始初始化control_t*/
lv_tlsf_t tlsf = lv_tlsf_create(mem);
/*堆开始空闲块开始的首地址要添加control_t的偏移,大小也是要减去control_t的大小*/
lv_tlsf_add_pool(tlsf, (char *)mem + lv_tlsf_size(), bytes - lv_tlsf_size());
return tlsf;
}
lv_tlsf_t tlsf = lv_tlsf_create(mem)作用:
-
-
将bitmap清0,所有链表置空(指向block_null)
-
*lv_tlsf_add_pool(tlsf, (char )mem + lv_tlsf_size(), bytes - lv_tlsf_size())
-
作用:初始化两个block,一个位于开头,作为最初也是最大的block,另一个位于结尾,是哨兵block
-
将开头的那个block插入(头插)空闲链表
- 实例
printf("Main Start!\n"); // tlsf_destroy(tlsf); tlsf = tlsf_create_with_pool(0x13000000, 128 * 1024); char *name = tlsf_malloc(tlsf, 100); printf("name= %p\n ", name); for (int i = 0; i < 100; i++) { name[i] = i; printf("%d = 0x%x, ", i, name[i]); } printf("\n over \n"); tlsf_free(tlsf, name); lv_tlsf_destroy(tlsf);
参考:
1、https://blog.csdn.net/gzxb1995/article/details/124504705
2、https://www.jianshu.com/p/01743e834432 -
评论(0)
您还未登录,请登录后发表或查看评论