1. 增加支持内存分配器

This commit is contained in:
coffee 2026-03-25 16:24:33 +08:00
parent 2176bdf1a9
commit fd76d9f346
3 changed files with 1519 additions and 0 deletions

View File

@ -1,3 +1,21 @@
## 基础结构
该库使用字符数组实现不同结构设计, 方便用于单片机固定数组.
## HTlsf 参数对比
可用 `tools/htlsf_config_matrix.sh` 快速比较不同 `HTLSF_CONFIG_SL_INDEX_COUNT_LOG2` /
`HTLSF_CONFIG_FL_INDEX_MAX` 组合下的:
- 公开开销指标
- 4KB/8KB/16KB 固定缓冲区可用容量
- 16KB 池里 16/32/64/128/256 字节请求可连续分配次数
- 主机目标体积, 以及可选 Cortex-M3 目标体积
- 对应配置下 `HTlsf` 单元测试是否通过
示例:
```sh
sh tools/htlsf_config_matrix.sh
CONFIGS="4:15 4:14 4:13" RUN_TESTS=0 sh tools/htlsf_config_matrix.sh
```

163
include/HTlsf.h Normal file
View File

@ -0,0 +1,163 @@
/**
* : 2026-03-22
* : coffee
* : TLSF
*
* :
* 1. ,
* 2. TLSF O(1) /,
* 3. , ,
* 4. tlsf.c/tlsf.h, 便
*
* :
* - HTLSF_CONFIG_SL_INDEX_COUNT_LOG2: , 4(16), 4
* - HTLSF_CONFIG_FL_INDEX_MAX: , 15(32KB块)
* - HTLSF_DEBUG: , 便,
*/
#ifndef __H_TLSF_H__
#define __H_TLSF_H__
#include <stddef.h>
#include <stdint.h>
typedef struct HTlsf
{
void *mem; ///< 对齐后的控制区起始地址
size_t memSize; ///< 对齐后可用于 HTlsf 的大小
} HTlsf;
typedef void (*HTlsfWalk)(void *ptr, size_t size, uint8_t used, void *arg);
/**
* @brief TLSF
*/
size_t HTlsfAlignSize(void);
/**
* @brief
*/
size_t HTlsfAllocOverhead(void);
/**
* @brief
*/
size_t HTlsfPoolOverhead(void);
/**
* @brief
*
* :
* ,
*/
size_t HTlsfMinBufferSize(void);
/**
* @brief TLSF
* @param htlsf
* @param mem
* @param size
* @return 1, 0
*/
uint8_t HTlsfInit(HTlsf *htlsf, void *mem, size_t size);
/**
* @brief
*/
uint8_t HTlsfIsReady(const HTlsf *htlsf);
/**
* @brief ,
*
* :
* , TLSF
*/
uint8_t HTlsfReset(HTlsf *htlsf);
/**
* @brief
*
* :
* ,
*/
size_t HTlsfGetCapacity(const HTlsf *htlsf);
/**
* @brief
*/
void *HTlsfMalloc(HTlsf *htlsf, size_t size);
/**
* @brief
*/
void *HTlsfCalloc(HTlsf *htlsf, size_t num, size_t size);
/**
* @brief
* @param align , 2
*/
void *HTlsfMemalign(HTlsf *htlsf, size_t align, size_t size);
/**
* @brief
*
* :
* realloc :
* - ptr == NULL malloc
* - size == 0 free NULL
*/
void *HTlsfRealloc(HTlsf *htlsf, void *ptr, size_t size);
/**
* @brief
*/
void HTlsfFree(HTlsf *htlsf, void *ptr);
/**
* @brief
*
* :
* TLSF ,
*/
size_t HTlsfBlockSize(const void *ptr);
/**
* @brief
*
* :
* TLSF ,
* , O(1)
*/
size_t HTlsfGetUsedSize(const HTlsf *htlsf);
/**
* @brief
*
* :
* TLSF
* , O(1)
*/
size_t HTlsfGetFreeSize(const HTlsf *htlsf);
/**
* @brief
*
* :
* O(1),
*/
size_t HTlsfGetMaxFreeBlock(const HTlsf *htlsf);
/**
* @brief
*/
void HTlsfWalkPool(const HTlsf *htlsf, HTlsfWalk call, void *arg);
/**
* @brief TLSF
* @return 1, 0
*/
uint8_t HTlsfCheck(const HTlsf *htlsf);
#endif // __H_TLSF_H__

1338
src/HTlsf.c Normal file

File diff suppressed because it is too large Load Diff