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