FreeRTOS

[FreeRTOS学习] 内存管理基础

2017-02-26  本文已影响0人  EleZtian

FreeRTOS的内存管理较为只有,它提供了多套管理法案有简单的有复杂的,它还允许用户同时使用两种管理方案,甚至允许你自己设计内存管理方案。

  1. heap_1.c
    当需要分配RAM时,这个内存分配方案只是简单的将一个大数组细分出一个子集来。
    大数组的容量大小通过FreeRTOSConfig.h文件中的configTOTAL_HEAP_SIZE宏来设置
  1. heap_2.c
    和方案1不同,这个方案使用一个最佳匹配算法,它允许释放之前分配的内存块。
    它不会把相邻的空闲块合成一个更大的块(换句话说,这会造成内存碎片)

Heap_5通过调用vPortDefineHeapRegions()函数实现初始化,在该函数执行完成前不允许使用内存分配和释放。创建RTOS对象(任务、队列、信号量等等)会隐含的调用pvPortMalloc(),因此必须注意:使用heap_5创建任何对象前,要先执行vPortDefineHeapRegions()函数。
vPortDefineHeapRegions()函数只需要单个参数。该参数是一个HeapRegion_t结构体类型数组。HeapRegion_t在portable.h中定义,如下所示:

typedef struct HeapRegion    
{    
  /* 用于内存堆的内存块起始地址*/    
  uint8_t *pucStartAddress;    
  
  /* 内存块大小 */    
  size_t xSizeInBytes;    
} HeapRegion_t;  

这个数组必须使用一个NULL指针和0字节元素作为结束,起始地址必须从小到大排列。下面的代码段提供一个例子。MSVCWin32模拟器演示例程使用了heap_5,因此可以当做一个参考例程。

/* 在内存中为内存堆分配两个内存块.第一个内存块0x10000字节,起始地址为0x80000000,  
第二个内存块0xa0000字节,起始地址为0x90000000.起始地址为0x80000000的内存块的  
起始地址更低,因此放到了数组的第一个位置.*/    
const HeapRegion_t xHeapRegions[] =    
{    
    { ( uint8_t * ) 0x80000000UL, 0x10000 },    
    { ( uint8_t * ) 0x90000000UL, 0xa0000 },    
    { NULL, 0 } /* 数组结尾. */    
};    
    
/* 向函数vPortDefineHeapRegions()传递数组参数. */    
vPortDefineHeapRegions( xHeapRegions );   
上一篇 下一篇

猜你喜欢

热点阅读