zephyr 内存分配机制,内存片、内存池、堆内存池三个部分组成;
1 内存片
概述
- 内存片(memory slab) 是一个内核对象
- 允许从指定的内存区域上动态地分配内存块
- 同一内存片上所有的内存块尺寸都是固定的
API
定义内存片
2 内存池
概述
- 内存池(memory pool)是一个内核对象
- 允许从指定的内存区域上动态地分配内存块(memory block)
- 内存池中的内存块的大小是不固定的
- 内存池使用"伙伴"(buddy)内存分配算法
API
定义内存池
struct k_mem_pool
内存池只能使用 K_MEM_POOL_DEFINE 在编译时进行定义和初始化。
分配内存块
int k_mem_pool_alloc(struct k_mem_pool *p, struct k_mem_block *block, size_t size, s32_t timeout)
释放内存块
void k_mem_pool_free(struct k_mem_block *block)
3 堆内存池
概述
- 堆内存池(heap memory pool) 是一个预定义的内存池对象
- 运行线程像malloc()一样去动态申请内存
- 堆内存池智能定义一个
- 堆内存池大小是可配置的,支持256、1024、4096和16384字节
- 内存块分配后,它的前16字节将被内核用于记录块描述符,
- 也就是说,申请N字节,实际至少使用N+16字节
配置项
CONFIG_HEAP_MEM_POOL_SIZE
指定内存池大小
默认是0字节,指示内核不要去定义堆内存池对象
API
分配
void *k_malloc(size_t size)
释放
void k_free(void *ptr)