Zephyr 提供了一组实用程序,允许线程动态分配内存。

同步堆分配器

创建堆

定义堆的最简单方法是使用K_HEAP_DEFINE宏静态定义。这将创建一个具有给定名称的静态k_heap变量,用于管理指定大小的内存区域。
还可以使用k_heap_init()创建堆,以管理应用程序控制内存的任意区域。

分配内存

可以使用k_heap_alloc()从堆中分配内存,向其传递堆对象的地址和所需的字节数。其功能类似于标准C的malloc,在分配失败时返回NULL指针。
堆支持阻塞操作,允许线程进入休眠状态,直到内存可用。最后一个参数是一个k_timeout_t超时值,指示线程在返回之前可以休眠多长时间,可以为K_NO_WAITK_FOREVER的常量超时值之一。

释放内存

使用k_heap_alloc()分配的内存必须使用k_heap_free()释放。与标准C的free()类似,提供的指针必须是k_heap_alloc()返回的值或指针。释放NULL值被定义为没有效果。

系统堆

系统堆是系统预定义的内存分配器,它允许线程以malloc()类似的方式从公共内存区域动态分配内存。
仅定义单个系统堆。与其他堆或内存池不同,系统堆不能使用其内存地址直接引用。
系统堆的大小可配置为任意大小,具体取决于空间可用性。
线程可以通过调用k_malloc()来动态分配堆内存块。已分配块的地址保证在指针大小的倍数上对齐。如果找不到合适的堆内存块,则返回NULL。
当线程使用一个堆内存块完成时,它可以通过调用k_free()将该块释放回系统堆。

定义堆内存池

堆内存池的大小是使用CONFIG_HEAP_MEM_POOL_SIZE配置选项指定的。
默认情况下,堆内存池大小为零字节。此值指示内核不定义堆内存池对象。最大大小受系统中可用内存量的限制。如果无法支持指定的大小,则项目生成将在链接阶段失败。

分配内存

堆内存块是通过调用k_malloc()来分配的。

  1. char *mem_ptr;
  2. mem_ptr = k_malloc(200);
  3. if (mem_ptr != NULL)) {
  4. memset(mem_ptr, 0, 200);
  5. ...
  6. } else {
  7. printf("Memory not allocated");
  8. }

释放内存

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

  1. char *mem_ptr;
  2. mem_ptr = k_malloc(75);
  3. ... /* use memory block */
  4. k_free(mem_ptr);

内存堆的Kconfig

Kconfig 描述
CONFIG_HEAP_MEM_POOL_SIZE 系统堆内存池大小(以字节为单位)