1、rt_system_heap_init初始化的起始和结束地址
函数声明:rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
关于动态内存堆的起始和结束地址,我截取了重要的几行;
下图中,SRAM的大小是128KB,HEAP_BEGIN是从RW和ZI段的结束开始,HEAP_END就是SRAM起始地址加上SRAM的大小;
打印出HEAP_BEGIN和HEAP_END的值看看(16进制)。
HEAP_BEGIN是0x20005C28,那0x5C28的十进制就是23592,就是RW+ZI的大小,根据map文件果然对上了。
HEAP_END也是对的,自己拿计算器算算就知道了。
2、dynmem_sample例程
例程是官方例程,但自己也要实际在板子上跑一跑,顺便打印了一下rt_malloc申请到内存的首地址。
首地址是0x20007aa8,最多可申请64KB的内存(以2的幂次方为单位),申请128KB内存失败;
3、初始化:对申请到的内存清零
char *ptr = rt_malloc(100);
if(ptr != RT_NULL){
rt_memset(ptr,0,100);
}
使用完:及时free,避免内存泄露
free释放申请的内存空间,但是free之后的指针仍然指向之前的地址,所以要加一句ptr = RT_NULL;
突然想起来个问题,free怎么知道之前申请多大内存的?这个信息肯定要被保存,具体来说就是当我们申请内存的时候,不仅分配给我们一块内存空间,还有一个头部存放了这块内存大小等信息,搜个链接放这里:
【C语言】free函数如何知道要释放多大空间_性感博主在线瞎搞的博客-优快云博客_free函数怎么知道释放内存大小
rt_free(ptr);
ptr = RT_NULL;
4、重新分配内存
重新分配内存块的大小,原来内存块rmem的数据内容保持不变;
当然,缩小的情况下,后面的数据被自动截断丢弃。
申请成功后,rmem之前申请的内存块系统自动释放。
返回值:返回重新分配的内存块地址
void *rt_realloc(void *rmem, rt_size_t newsize);
5、分配一段连续的内存
从内存堆中分配连续内存地址的多个内存块(count*size字节),且申请的所有内存块会自动清零;
返回值:申请的第一个内存块的地址;
void *rt_calloc(rt_size_t count,rt_size_t size);
malloc申请的内存可能不是连续的,可能是以链表形式存在于堆中,calloc申请的内存是连续的内存块;