发布网友 发布时间:2024-12-03 11:39
共1个回答
热心网友 时间:2024-12-04 19:24
FreeRTOS内存管理简介
在使用FreeRTOS创建任务、队列、信号量等对象时,一般提供两种方法:动态方法创建和静态方法创建。动态方法创建自动从FreeRTOS管理的内存堆中申请创建对象所需的内存,并在对象删除后,将这块内存释放回FreeRTOS管理的内存堆。静态方法创建则需要自行提供内存空间,这些任务、队列被删除后,这些内存空间也没有其他用途。动态方式更灵活,但FreeRTOS提供多种动态内存管理算法,可根据不同嵌入式系统需求选择。
FreeRTOS内存管理算法
正点原子的例程中,均使用heap_4内存管理算法。heap_1算法只实现了pvPortMalloc,没有实现vPortFree,只能申请内存,无法释放内存。如果工程中创建的任务、队列、信号量等无需删除,可以使用heap_1算法。heap_1实现最简单,管理的内存堆是一个数组,申请内存时从数组中分出合适大小的内存。heap_2使用最适应算法,并支持释放内存,但无法将相邻空闲内存块合并成一个大的空闲内存块,会产生内存碎片。heap_4使用首次适应算法,支持内存申请、释放,并能将空闲且相邻的内存进行合并,减少内存碎片。heap_5在heap_4的基础上实现了管理多个非连续内存区域的能力,适用于内存地址不连续的场景。
FreeRTOS内存管理相关API
FreeRTOS内存管理实验旨在学习如何使用FreeRTOS内存管理,观察申请和释放过程中内存大小的变化情况。实验包括创建task1、按键扫描、KEY0申请内存、KEY1释放内存,并打印剩余内存信息。heap4.c讲解内存的结构体,包含指针和无符号整数两个成员。内存堆初始化prvHeapInit()通过宏configTOTAL_HEAP_SIZE获取FreeRTOS管理的内存总大小,获取给FreeRTOS管理的数组首地址,进行对齐操作,并初始化管理的数组。合并空闲内存prvInsertBlockIntoFreeList()用于将空闲内存插入空闲列表,合并相邻空闲内存,并将空闲地址由低到高排列。申请内存pvPortMalloc()和释放内存vPortFree()提供了内存的申请和释放功能,分别用于动态分配和释放内存。