heap_5

heap_5

小狼@http://blog.csdn.net/xiaolangyangyang


        heap_5是将.bss段的mem作为内存管理基础(一大片全局变量),支持多个不连续的内存块,经过函数vPortDefineHeapRegions()执行后,将多个block按地址从小到大使用链表串联起来,如下图所示:

        内存申请使用pvPortMalloc()函数,该函数在内存块链表中依次查找size大于待申请长度的block,如果存在这样的block,将该block从链表中取出,在该block中取出需要长度的mem,将剩余的mem变成链表节点插入到链表中。取出的mem带有链表头,返回给用户时向后偏移链表头的长度即可。

内存释放使用pvPortFree()函数,由于申请mem时,返回指针前面带有链表头,释放时,使用该链表头插入到链表中,插入时会找到按照mem从小到大的顺序找到插入点。

        碎片管理:

        碎片管理在prvInsertBlockIntoFreeList()函数中执行,在插入链表之前会按照mem从小到大顺序找到插入点,然后判断插入点的block末尾地址是不是新插入点的起始地址,如果是,直接在插入点末尾延长插入节点的长度为新插入点的长度,如果新插入点的末位地址是插入点下个节点的起始地址,则在这个节点前面延长新插入点的长度,这样实际就不会新插入链表节点,而是延长原有节点,减少内存碎片;如果以上两个条件都不满足,则将新插入点插入到链表中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值