FreeRTOS的内存管理方案

FreeRTOS提供了多种内存管理方案,但这些内存管理方案的函数接口都是一样的,如下:

void *pvPortMalloc( size_t xSize ); //内存申请函数
void vPortFree( void *pv ); //内存释放函数
void vPortInitialiseBlocks( void ); //初始化内存堆函数
size_t xPortGetFreeHeapSize( void ); //获取当前未分配的内存堆大小
size_t xPortGetMinimumEverFreeHeapSize( void ); //获取未分配的内存堆历史最小值

内存管理方案一:

只能申请内存,不嫩释放内存,并且申请内存的时间是一个常量。

因为不允许内存释放,就不会产生内存碎片而导致系统崩溃,但是也有缺点,那就是内存利用率不高,某段内存只能用于内存申请的地方,即使该内存只使用一次,也无法让系统回收重新利用。

特点:

1、 用于从不删除任务、队列、信号量、互斥量等的应用程序(实际上大多数使用FreeRTOS 的应用程序都符合这个条件)。
2、 函数的执行时间是确定的并且不会产生内存碎片。

相关函数的实现(可免费下载):

https://download.csdn.net/download/m0_69251699/87691985

内存管理方案二:

内存管理方案二采用一种最佳匹配算法,比如我们申请100 字节的内存,而可申请内存中有三块对应大小200 字节, 500 字节和 1000 字节大小的内存块,按照算法的最佳匹配,这时候系统会把200 字节大小的内存块进行分割并返回申请内存的起始地址,剩余的内存则插回链表留待下次申请。该方案支持释放申请的内存,但是它不能把相邻的两个小的内存块合成一个大的内存块,对于每次申请内存大小都比较固定的,而对于每次申请并不是固定内存大小的则会造成内存碎片,后面要讲解的内存管理方案四采用的内存管理算法能解决内存碎片的问题,可以把这些释放的相邻的小的内存块合并成一个大的内存块。

特点:

1. 可以用在那些反复的删除任务、队列、信号量、等内核对象且不担心内存碎片的应用程序。
2. 如果我们的应用程序中的队列、任务、信号量、等工作在一个不可预料的顺序,这样子也有可能会导致内存碎片。
3. 具有不确定性,但是效率比标准C 库中的 malloc 函数高得多。
4. 不能用于那些内存分配和释放是随机大小的应用程序。

空闲链表结构体:

typedef struct A_BLOCK_LINK 
{
    struct A_BLOCK_LINK *pxNextFreeBlock;    //指向下一个空闲内存块的指针
    size_t xBlockSize;                       //用于记录申请的内存块的大小,包括链表结构体大小
} BlockLink_t;

相关函数的实现(可免费下载): 

https://download.csdn.net/download/m0_69251699/87691985

内存管理方案三:

该方案只是简单的封装了标准C 库中的malloc()和free()函数,并且能满足常用的编译器。重新封装后的malloc()和free()函数具有保护功能,采用的封装方式是操作内存前挂起调度器、完成后再恢复调度器。

特点:

1、 需要链接器设置一个堆,malloc()和free()函数由编译器提供。
2、 具有不确定性。
3、 很可能增大RTOS 内核的代码大小。

相关函数的实现(可免费下载):

https://download.csdn.net/download/m0_69251699/87691985

内存管理方案四:

该方案与内存管理方案二一样,都采用最佳匹配算法来实现动态的内存分配,但是不一样的是该方案还包含了一种合并算法,能把相邻的空闲的内存块合并成一个更大的块,这样可以减少内存碎片。该方案特别适用于移植层中可以直接使用pvPortMalloc()和 vPortFree()函数来分配和释放内存的代码。

该内存管理方案的空闲块链表不是以内存块大小进行排序的,而是以内存块起始地址大小排序,内存地址小的在前,地址大的在后,因为该方案还有一个内存合并算法,在释放内存的时候,假如相邻的两个空闲内存块在地址上是连续的,那么就可以合并为一个内存块,这也是为了适应合并算法而作的改变。

特点:

1、可用于重复删除任务、队列、信号量、互斥量等的应用程序
2、可用于分配和释放随机字节内存的应用程序,但并不像heap2.c 那样产生严重的内存碎片。
3、具有不确定性,但是效率比标准C 库中的malloc 函数高得多。

相关函数的实现(可免费下载):

https://download.csdn.net/download/m0_69251699/87691985

内存管理方案五:

该方案在实现动态内存分配时与内存管理方案四一样,采用最佳匹配算法和合并算法,并且允许内存堆跨越多个非连续的内存区,也就是允许在不连续的内存堆中实现内存分配,比如用户在片内RAM 中定义一个内存堆,还可以在外部SDRAM 再定义一个或多个内存堆,这些内存都归系统管理。

相关函数的实现(可免费下载):

https://download.csdn.net/download/m0_69251699/87691985

你可能感兴趣的:(STM32,c++,算法)