运行结果(串口助手显示)
本项目基于 **rhempel **大神的开源仓库 umm_malloc ,仓库地址为https://github.com/rhempel/umm_malloc,程序移植性强,鲁棒性好。经过本人在PC和STM32均验证,可放心使用。
- 32位MCU和对应工具链(比如STM32和Keil)
- 开源大神源码
-
下载源码
-
找一个可以完全编译的工程
-
把下载源码里面的src目录放入你的工程,目录名字改为umm_malloc(个人习惯)
-
添加目录里面的所有c文件,并把路径加入项目
-
创建umm_malloc_cfgport.c和umm_malloc_cfgport.h文件
-
在umm_malloc_cfgport.h文件中定义UMM_MALLOC_CFG_HEAP_ADDR的变量名指向buffer的指针变量地址、定义UMM_MALLOC_CFG_HEAP_SIZE大小(单位字节)。参考如下:
#ifndef __UMM_CFGPORT_H #define __UMM_CFGPORT_H #define UMM_MALLOC_CFG_HEAP_ADDR heap_addr #define UMM_MALLOC_CFG_HEAP_SIZE heap_size #endif //__UMM_CFGPORT_H
-
在umm_malloc_cfgport.c中添加变量并和头文件对应上
#include "umm_malloc_cfgport.h" #include <stdint.h> //@config<array> //堆空间大小分配 uint8_t heap_buff[1024*4] = {0}; void * heap_addr = (void *)heap_buff; uint32_t heap_size = sizeof(heap_buff);
-
随后在初始化的地方包含头文件umm_malloc.h并调用
umm_init(); -
现在你可以正常使用这些函数了
void *umm_malloc(size_t size); void *umm_calloc(size_t num, size_t size); void *umm_realloc(void *ptr, size_t size); void umm_free(void *ptr);
测试没有什么大碍,比KEIL给的标准库malloc/free好太多了。
- 堆大小单位为字节
- 堆消耗 = 16字节固定开销 + 用户累计申请字节数 + 8*用户申请次数 + 内存碎片(可能有)
- 实际项目应该有20%~30%的余量
- 分配的堆空间应该远大于8且是4的整数倍
- 内存申请完记得在不用时释放
作者:阳海峰
BILIBILI昵称:風吹海浪
致谢遇见的人...