FreeRTOS动态内存管理
在嵌入式系统中,为了提高代码的运行效率,通常会用相对简单的方法去实现内存的分配,再封装成与malloc和free相同的函数接口。
申请内存的函数原型:
void *pvPortMalloc( size_t xWantedSize );//参数为需申请的字节数,返回地址指针
释放内存的函数原型:
void vPortFree( void *pv ); //参数为指向内存的指针;
实现动态内存分配的方式:
Heap_1方式:
最简单的,运行效率最高的;
只支持申请内存,不允许释放;
具有时间确定性,不会产生内存碎片;
它不支持内存释放;
Heap_2方式:
支持内存申请、内存释放;
释放后的空闲小内存块不会被合并成大内存块;
适用于动态分配的内存块大小都是一样的情况;
Heap_3方式:
对编译器提供的malloc和free进行了封装,需要编译器提供malloc和free的实现;
Heap_4方式:
支持内存申请、内存释放;并且支持内存碎片整理;
Heap_5方式:
在heap_4的基础上,堆空间可以是不连续的空间;
使用heap_5方式进行动态内存管理时,需要先调用vPortDefineHeapRegions函数进行初始化,之后才能调用申请内存操作。
注意:
①FreeRTOS的堆空间大小由configTOTAL_HEAP_SIZE宏来确定,除了heap_3方式;
②使用xPortGetFreeHeapSize()函数来获取剩余可用堆空间的大小。
③使用heap_4或heap_5时,可以用xPortGetMinimumEverFreeHeapSize()函数来获取历史剩余可用空
间的最小值。
FreeRTOS的系统配置
FreeRTOS的系统配置文件是FreeRTOS.h和FreeRTOSConfig.h。在使用时,可以在FreeRTOSConfig.h配置自己需要的选项
举个🌰子:
#define configCPU_CLOCK_HZ ( SystemCoreClock ) //定义CPU时钟主频
#define configMAX_PRIORITIES ( 7 )
//定义可使用的任务优先级,定义为7则用户可用优先级为0~6,值越大优先级越高