前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >zephyr笔记 2.3.3 堆内存池

zephyr笔记 2.3.3 堆内存池

作者头像
twowinter
发布2020-04-17 11:16:42
4350
发布2020-04-17 11:16:42
举报
文章被收录于专栏:twowintertwowinter

1 前言

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

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

2 概念

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

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

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

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

2.1 内部操作

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

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

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

3 操作

3.1 定义堆内存池

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

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

3.2 分配内存

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

下面的代码分配一个200字节的堆内存块,然后用零填充它。 如果没有获得合适的块,则发出警告。

请注意,应用程序将实际分配一个256字节的内存块,因为这是堆内存池支持的最接近的匹配大小。

代码语言:javascript
复制
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字节的内存块。)

代码语言:javascript
复制
char *mem_ptr;

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

4 建议用法

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

5 配置选项

代码语言:javascript
复制
CONFIG_HEAP_MEM_POOL_SIZE

6 APIs

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

代码语言:javascript
复制
k_malloc()
k_free()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 前言
  • 2 概念
    • 2.1 内部操作
    • 3 操作
      • 3.1 定义堆内存池
        • 3.2 分配内存
          • 3.3 释放内存
          • 4 建议用法
          • 5 配置选项
          • 6 APIs
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档