zephyr笔记 2.3.3 堆内存池

版权声明:本文为twowinter原创文章,请联系微信公众号twowinter,未经博主允许不得转载。 https://blog.csdn.net/iotisan/article/details/80140127

1 前言

堆内存池是一个预定义的内存池对象,它允许线程以类似 malloc() 方式从公共内存区域动态分配内存。

我正在学习 Zephyr,一个很可能会用到很多物联网设备上的操作系统,如果你也感兴趣,可点此查看帖子zephyr学习笔记汇总

2 概念

只能定义一个堆内存池。与其他内存池不同,堆内存池不能使用其内存地址直接引用。

堆内存池的大小是可配置的。支持以下大小:256字节,1024字节,4096字节和16384字节。

一个线程可以通过调用 k_malloc() 来动态分配一堆堆内存。分配的块的地址保证在4个字节的倍数上对齐。如果找不到合适的堆内存块,则返回 NULL。

当线程完成一堆堆内存时,它可以通过调用 k_free() 将块释放回堆内存池。

2.1 内部操作

堆内存池定义了包含整个堆的单个最大大小块; 即,一个256,1024,4096或16384字节的单个块。 堆内存池还定义了64字节的最小块大小。 因此,下表显示了堆内存池可支持的每个大小的最大块数。

注意:可以同时分配给定大小的块的数量通常小于表中显示的值。 例如,从1024字节的堆中分配256字节的块将减少可用于分配的64字节块的数量。对内存池的缓冲区进行分段还可以进一步减少块的可用性。

内核使用从堆内存池中分配的任何内存块的前16个字节来保存稍后释放该块所需的块描述符信息。 因此,应用程序对堆内存的N字节块的请求需要一个至少为(N + 16)个字节的块。

3 操作

3.1 定义堆内存池

堆内存池的大小是使用 CONFIG_HEAP_MEM_POOL_SIZE 配置选项指定的。

默认情况下,堆内存池大小为零字节。 该值指示内核不定义堆内存池对象。

3.2 分配内存

通过调用 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");
}

3.3 释放内存

通过调用 k_free() 释放一大堆堆内存。

以下代码分配75字节的内存块,然后在不再需要时释放它。 (实际上分配的是256字节的内存块。)

char *mem_ptr;

mem_ptr = k_malloc(75);
... /* use memory block */
k_free(mem_ptr);

4 建议用法

使用堆内存池以 malloc() 方式动态分配内存。

5 配置选项

CONFIG_HEAP_MEM_POOL_SIZE

6 APIs

下列堆内存池API,都在 kernel.h 中提供了:

k_malloc()
k_free()

没有更多推荐了,返回首页