2.1为什么要自己实现内存管理
堆heap:一块空闲的内存,需要提供管理函数
malloc:从堆中画出一块空间给程序员
free:用完后,将其标志为“空闲”,可以再次使用
栈stack:从堆中分配一块空间给栈
2.2FreeRTOS中五种内存管理方式
补充:
2.2.1Heap_1
Heap_1:只实现了pvPortMalloc 没有实现vPortFree
程序不需要删除内核对象,使用heap_1:
~实现简单
~没有碎片时间
~在不能使用动态内存时候,可以使用和和heap_1
定义原理:首先定义一个大数组,对于pvPortMalloc调用的时候,从这个数组中分配空间
2.2.2Heap_2
Heap_2:新设计中用heap_4代替heap_2
在数组上分配内存,使用最佳匹配算法分配,支持vPortFree
但是与Heap_4相比,2并不会合并相邻的空间内存,会导致严重的“碎片化”问题
2.2.3.Heap_3
Heap_3:
2.2.4 Heap_4
Heap_4:利用大数组进行分配内存
使用首次适应算法,并且将相邻的空闲内存合并成一个更大的空闲内存
2.2.5Heap_5
Heap_5:分配内存、释放内存的算法和4一样
但相比于4 ,5不局限于管理一个大数组,可以管理多块、分割开的内存
在内存的地址可能不连续:使用Heap_5
如何指定一块内存
typedef struct HeapRegion
{
uint8_t *pucStartAddress;//起始地址
size_t xSizeInBytes;//大小
}HeapRegion_t;
如何指定多块内存
HeapRegion_t xHeapRegions[]=
{
{(uint8_t *)0x8000000ul,0x10000};//起始地址和大小
{(uint8_t *)090000000ul,0xa0000};//起始地址和大小
{null,0}//表示数组结束
};
2.3Heap相关函数
pvPortMalloc/vPortFree
xPortGetFreeHaepSize
xPortGetMinimumEverFreeHeapSize