第18篇 zephyr 内存管理之Heap Memory Pool

目录

摘要

1 概念

2 实现

2.1 定义堆内存

2.2 分配内存

2.3 释放一个堆内存

3 参考链接


本学笔记基于zephyr 工程版本 2.2.99,主机环境为ubuntu18.04,开发平台 nrf52840dk_nrf52840

摘要

堆内存池是一个预定义的内存池对象,它允许线程以类似malloc()的方式从公共内存区域动态分配内存。类似于上一篇memory pool的一个特例。整个内核中只维护一个Heap Memory Pool。而使用方法与mallcoc和free基本一样。

1 概念

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

堆内存池的大小是可配置的。支持以下大小:256字节、1024字节、4096字节和16384字节。(通过menuconfig去配置,一般在内存比较紧张的soc上,不打开这个功能)

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

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

2 实现

2.1 定义堆内存

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

默认情况下,堆内存池大小为零字节。0表示内核使用堆内存池功能。

2.2 分配内存

通过调用k_malloc()分配一块堆内存。

下面的代码示例,分配一个200字节的堆内存块,然后用零填充它。如果内存可分配,用printf打印信息提示。
注意,应用程序实际上会分配一个256字节的内存块,因为这是堆内存池支持的最接近的匹配大小。

char *mem_ptr;

mem_ptr = k_malloc(200);
if (mem_ptr != NULL)) {
    memset(mem_ptr, 0, 200);
    ...
} else {
    printf("Memory not allocated");
}

2.3 释放一个堆内存

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

下面的代码示例,分配一个75字节的内存块,然后释放它。(请求75个字节,实际上分配256字节)

char *mem_ptr;

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

3 参考链接

https://docs.zephyrproject.org/latest/reference/kernel/memory/heap.html

你可能感兴趣的:(zephyr)