FreeRTOS代码阅读笔记:heap_2.c

FreeRTOS中对于内存的管理当前一共有5种实现方式(作者当前的版本是10.1.1),均在【 \Source\portable\MemMang 】下面,这里笔记下。

重要的参数: 

使用方法:
头文件:FreeRTOSConfig.h 
配置参数:
configTOTAL_HEAP_SIZE             定义系统所用的堆栈大小。
configUSE_MALLOC_FAILED_HOOK      默认0: 1则开启钩子函数,内存分配失败则调用 

函数调用:	
      vPortInitialiseBlocks();//初始化
      ptr=pvPortMalloc(1024);
	  if(ptr !=NULL)
	  {
	  freemem=xPortGetFreeHeapSize(); 
	  printf("剩余内存 %d \r\n",i,freemem); 
	  }
	  else
	  {
	  printf("获取内存失败\r\n");break;
	  }

//

heap_2.c分析:

/**************************************
重要的参数备注:
(1)FreeRTOS  内存堆为:ucHeap[] 大小为 configTOTAL_HEAP_SIZE 

(2)pucAlignedHeap 作为堆栈字节对齐后的起始地址(怎么实现的思考一下)

(3)configADJUSTED_HEAP_SIZE      堆栈可操作空间,减去对齐单位,防止越界

(4)xNextFreeByte   记录已经使用的内存数量

(5)//空闲内存管理结构体,通过它来管理释放回来的内存
typedef struct A_BLOCK_LINK
{
	struct A_BLOCK_LINK *pxNextFreeBlock;	/*<< 指向链表中下一个空闲的内存块. */
	size_t xBlockSize;						/*<< 当前空闲内存块的大小 */
} BlockLink_t;

(6)heapSTRUCT_SIZE  /* 考虑到字节对齐后BlockLink_t的大小 */

(7)heapMINIMUM_BLOCK_SIZE  内存块分配后剩余内存大于此数值,就会建立新的空闲内存块

(8)static BlockLink_t  xStart, xEnd; 记录空闲链表的首尾。
  xFreeBytesRemaining  当前剩余的空闲内存总大小 



举个例子:
内存申请:xWantedSize需要获取的内存,在空闲链表内找到大小合适的。从空闲链表中删除该内存块。需要注意的是 找到大小合适的内存块后如果其大小减去xWantedSize后,剩余空间大于heapMINIMUM_BLOCK_SIZE  会将其分配新的内存块,插入空闲链表中使用。
内存释放:
被占用的内存由于有BlockLink_t结构体可以知道其块的大小,所以释放后,将其重新插入到空闲链表中即可。
空闲块一但被创建后就一直存在。由于不存在内存回收机制,反复分配、回收大小不一的块,会导致产生内存碎片。

**************************************/
/*
一种非常简单的内存实现方式,和heap_1.c的实现差不多,内部也是一个大号的数组,不过实现了内存的回收,但是没有实现空闲内存的整合,因此
会产生内存碎片。
*/

#include <stdlib.h>

/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
all the API functions to use the
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值