FreeRTOS的堆管理(heap_1 - heap_5)

时间:2021-05-25 09:18:40   收藏:0   阅读:41

FreeRTOS的堆管理

上文对FreeRTOs的目录结构进行了说明,其中提到了FreeRTOS\Source\portable\MemMang目录下的五个heap_n.c文件,本文将对这个五个文件的作用、差异、使用场景进行对比,以便选择出适合自己项目的堆管理模式。

Heap_1.c

主要用于小型专一嵌入式系统。内核在任何实时任务执行之前先分配内存,一次分配永久使用并不再改变,可靠性较高。

堆的总容量 configTOTAL_HEAP_SIZE 在 FreeRTOSConfig.h 文件中配置

每创建一个任务都会分配一个堆控制块(TCB:Task control block)和一个栈(Stack)

技术分享图片

Heap_2.c

Heap_3.c

Heap_4.c

Heap5.c

typedef struct HeapRegion
{
/* 内存块的起始地址将成为堆的一部分.*/
uint8_t *pucStartAddress;
/* 堆的容量大小bytes. */
size_t xSizeInBytes;
} HeapRegion_t;

下图表示vPortDefineHeapRegions函数的具体使用场景RAM1,RAM2,RAM3分别代表三个空闲空间
技术分享图片

/* 图最左侧堆:A   定以RAM1-3的基本信息. */
#define RAM1_START_ADDRESS ( ( uint8_t * ) 0x00010000 )
#define RAM1_SIZE ( 65 * 1024 )
#define RAM2_START_ADDRESS ( ( uint8_t * ) 0x00020000 )
#define RAM2_SIZE ( 32 * 1024 )
#define RAM3_START_ADDRESS ( ( uint8_t * ) 0x00030000 )
#define RAM3_SIZE ( 32 * 1024 )

const HeapRegion_t xHeapRegions[] =
{
 { RAM1_START_ADDRESS, RAM1_SIZE },
 { RAM2_START_ADDRESS, RAM2_SIZE },
 { RAM3_START_ADDRESS, RAM3_SIZE },
 { NULL, 0 } /* 标志数组的结尾. */
};
int main( void )
{
 /* 初始化heap_5 */
 vPortDefineHeapRegions( xHeapRegions );
 
/* 编码区域。*/
}
* 定以没有被链接器使用的两个起始地址和容量 */
#define RAM2_START_ADDRESS ( ( uint8_t * ) 0x00020000 )
#define RAM2_SIZE ( 32 * 1024 )
#define RAM3_START_ADDRESS ( ( uint8_t * ) 0x00030000 )
#define RAM3_SIZE ( 32 * 1024 )
/* 定义一个数组为heap_5使用的一部分,此数组将会被链接器放置于RAM1 */
#define RAM1_HEAP_SIZE ( 30 * 1024 )
static uint8_t ucHeap[ RAM1_HEAP_SIZE ];
/* 定义一个数组HeapRegion_t,第一个入口只定义了ucHeap数组。像之前一样HeapRegion_t结构定以仍需地址从小到大排列。*/
const HeapRegion_t xHeapRegions[] =
{
 { ucHeap, RAM1_HEAP_SIZE },
 { RAM2_START_ADDRESS, RAM2_SIZE },
 { RAM3_START_ADDRESS, RAM3_SIZE },
 { NULL, 0 } /* 标志数组的结束. */
};

优势

堆分配相关函数

原文:https://www.cnblogs.com/Pomelos/p/14806826.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!