RT-Thread_动态内存堆

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函数如何知道要释放多大空间_性感博主在线瞎搞的博客-CSDN博客_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申请的内存是连续的内存块;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值