同步堆分配器
创建堆
定义堆的最简单方法是使用K_HEAP_DEFINE宏静态定义。这将创建一个具有给定名称的静态k_heap
变量,用于管理指定大小的内存区域。
还可以使用k_heap_init()
创建堆,以管理应用程序控制内存的任意区域。
分配内存
可以使用k_heap_alloc()
从堆中分配内存,向其传递堆对象的地址和所需的字节数。其功能类似于标准C的malloc,在分配失败时返回NULL指针。
堆支持阻塞操作,允许线程进入休眠状态,直到内存可用。最后一个参数是一个k_timeout_t
超时值,指示线程在返回之前可以休眠多长时间,可以为K_NO_WAIT
或K_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()
来分配的。
char *mem_ptr;
mem_ptr = k_malloc(200);
if (mem_ptr != NULL)) {
memset(mem_ptr, 0, 200);
...
} else {
printf("Memory not allocated");
}
释放内存
通过调用k_free()
释放堆内存块。
char *mem_ptr;
mem_ptr = k_malloc(75);
... /* use memory block */
k_free(mem_ptr);
内存堆的Kconfig
Kconfig | 描述 |
---|---|
CONFIG_HEAP_MEM_POOL_SIZE | 系统堆内存池大小(以字节为单位) |