堆内存池是一个预定义的内存池对象,它允许线程以类似 malloc() 方式从公共内存区域动态分配内存。
我正在学习 Zephyr,一个很可能会用到很多物联网设备上的操作系统,如果你也感兴趣,可点此查看帖子zephyr学习笔记汇总。
只能定义一个堆内存池。与其他内存池不同,堆内存池不能使用其内存地址直接引用。
堆内存池的大小是可配置的。支持以下大小:256字节,1024字节,4096字节和16384字节。
一个线程可以通过调用 k_malloc() 来动态分配一堆堆内存。分配的块的地址保证在4个字节的倍数上对齐。如果找不到合适的堆内存块,则返回 NULL。
当线程完成一堆堆内存时,它可以通过调用 k_free() 将块释放回堆内存池。
堆内存池定义了包含整个堆的单个最大大小块; 即,一个256,1024,4096或16384字节的单个块。 堆内存池还定义了64字节的最小块大小。 因此,下表显示了堆内存池可支持的每个大小的最大块数。
注意:可以同时分配给定大小的块的数量通常小于表中显示的值。 例如,从1024字节的堆中分配256字节的块将减少可用于分配的64字节块的数量。对内存池的缓冲区进行分段还可以进一步减少块的可用性。
内核使用从堆内存池中分配的任何内存块的前16个字节来保存稍后释放该块所需的块描述符信息。 因此,应用程序对堆内存的N字节块的请求需要一个至少为(N + 16)个字节的块。
堆内存池的大小是使用 CONFIG_HEAP_MEM_POOL_SIZE 配置选项指定的。
默认情况下,堆内存池大小为零字节。 该值指示内核不定义堆内存池对象。
通过调用 k_malloc() 来分配一堆堆内存。
下面的代码分配一个200字节的堆内存块,然后用零填充它。 如果没有获得合适的块,则发出警告。
请注意,应用程序将实际分配一个256字节的内存块,因为这是堆内存池支持的最接近的匹配大小。
char *mem_ptr;
mem_ptr = k_malloc(200);
if (mem_ptr != NULL)) {
memset(mem_ptr, 0, 200);
...
} else {
printf("Memory not allocated");
}
通过调用 k_free() 释放一大堆堆内存。
以下代码分配75字节的内存块,然后在不再需要时释放它。 (实际上分配的是256字节的内存块。)
char *mem_ptr;
mem_ptr = k_malloc(75);
... /* use memory block */
k_free(mem_ptr);
使用堆内存池以 malloc() 方式动态分配内存。
CONFIG_HEAP_MEM_POOL_SIZE
下列堆内存池API,都在 kernel.h 中提供了:
k_malloc()
k_free()