【FreeRTOS】内存管理

heap_1.c

只能申请内存而不能进行内存释放,并且申请内存的时间是一个常量,这样子对于要求安全的嵌入式设备来说是最好的,因为不允许内存释放,就不会产生内存碎片而导致系统崩溃,但是也有缺点,那就是内存利用率不高,某段内存只能用于内存申请的地方,即使该内存只使用一次,也无法让系统回收重新利用。

内存申请函数 pvPortMalloc()

heap_2.c

查找比申请大或者等于的内存空间,在其中选择内存空间小的;如申请100,有200、500、1000字节,分割200字节,返回申请内存的起始地址,剩余内存则插回链表等待下次申请;
不能把相邻的两个小内存合并,不是固定大小内存申请就会造成内存碎片
会导致最后申请大内存时,没有内存大内存供给申请!

内存申请函数 pvPortMalloc()
内存释放函数 vPortFree()

heap_3.c

只是简单的封装了标准 C 库中的 malloc()和 free()函数,
堆大小要在stm32的startup_stm32fxxxx.s中修改

内存申请函数 pvPortMalloc()
内存释放函数 vPortFree()

heap_4.c

与2类似,包含了一种合并算法;能把相邻的空闲的内存块合并成一个更大的块,这样可以减少内存碎片

内存申请函数 pvPortMalloc()
内存释放函数 vPortFree()

heap_5.c

与4类似,允许内存堆跨越多个非连续的内存区,也就是允许在不连续的内存堆中实现内存分配,比如用户在片内 RAM 中定义一个内存堆,还可以在外部 SDRAM 再定义一个或多个内存堆,这些内存都归系统管理;

注意:

使用 heap_5.c 内存管理方案创建任何对象前,要先调用 vPortDefineHeapRegions()函数将内存初始化。

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

 /* 向函数 vPortDefineHeapRegions()传递形参 */
 vPortDefineHeapRegions( xHeapRegions );

你可能感兴趣的:(FreeRTOS,FreeRTOS)