栈(stack): 由编译器自动分配释放
堆(heap) : 一般由程序员分配和释放
rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
#define HEAP_BEGIN ((void *)&Image??RW_IRAM1??ZI??Limit) //ZI段的结束地址,执行地址,也就是程序执行区的RAM结束后的地址,反过来也就是我们执行区的RAM未使用的区域的起始地址
#define HEAP_END STM32_SRAM_END
PS:一个ARM程序包含3部分:RO,RW和ZI
RO是程序中的指令和常量
RW是程序中的已初始化变量
ZI是程序中的未初始化的变量
- void *rt_malloc(rt_size_t nbytes):rt_malloc函数会从系统堆空间中找到合适大小的内存块.
- void rt_free(void *ptr):为用户将malloc、realloc、calloc申请的内存释放,每次申请内存用完后必须进行释放,否则会造成内存泄漏.
- void *rt_realloc(void *rmem, rt_size_t newsize):在已分配内存块的基础上重新分配内存块的大小(增加或缩小),在进行重新分配内存块时,原来的内存块数据保持不变(缩小的情况下, 后面的数据被自动截断).
- void *rt_calloc(rt_size_t count, rt_size_t size):从内存堆中分配连续内存地址的多个内存块.