一、内存管理简介
在使用FreeRTOS创建任务、队列、信号量等对象时,有动态创建 和静态创建 (本质上内存分配的问题 ) FreeRTOS提供了5种 动态内存管理算法,分别为heap_1 、heap_2 、heap_3 、heap_4 、heap_5 ,如下所示
heap_1 :只实现了pvportMallor(创建),没有实现vportFree(释放),只能申请 ,无法释放内存 ,管理的内存堆是一个数组 heap_2 :使用最适应算法,支持释放内存 ,但不能将相邻的空闲内存块合并成一个大的空闲内存块,不可避免的会产生内存碎片 内存碎片 是由于多次申请和释放内存,但释放的内存无法与相邻的空闲内存合并而产生的heap_4 :使用首次适应算法 ,支持申请和释放 ,能够将空闲且相邻的内存合并,减少内存碎片 的情况heap_5 :在heap_4基础上实现,同时额外管理多个非连续内存区域的功能 ,没有默认定义内存堆,需要用户手动指定区域的信息 ,对其初始化
二、内存管理实验
void * pvPortMalloc ( size_t xWantedSize) ;
void vPortFree ( void * pv) ;
size_t xPortGetFreeHeapSize ( void ) ;
实验设计:设计两个任务,start_task :创建task1。task1 :按键扫描,Key0按下申请内存,Key1按下释放内存。
# define configSUPPORT_DYNAMIC_ALLOCATION 1
# define START_TASK_STACK_SIZE 128
# define START_TASK_PRIO 1
TaskHandle_t start_task_handle;
# define TASK1_STACK_SIZE 128
# define TASK1_PRIO 2
TaskHandle_t task1_handle;
void task1 ( void * pvParameters )
{
uint8_t KeyNum = 0 ;
uint8_t * buf = NULL ;
while ( 1 )
{
KeyNum = Key_GetNum ( ) ;
if ( KeyNum == 1 )
{
buf = pvPortMalloc ( 30 ) ;
}
else if ( KeyNum == 2 )
{
vPortFree ( buf) ;
}
vTaskDelay ( 10 ) ;
}
}
void Start_task ( void * pvParameters )
{
taskENTER_CRITICAL ( ) ;
xTaskCreate ( task1,
"task1" ,
TASK1_STACK_SIZE,
NULL ,
TASK1_PRIO,
& task1_handle
) ;
vTaskDelete ( start_task_handle) ;
taskEXIT_CRITICAL ( ) ;
}
void freertos_demo ( )
{
xTaskCreate ( Start_task,
"Start_task" ,
START_TASK_STACK_SIZE,
NULL ,
START_TASK_PRIO,
& start_task_handle
) ;
vTaskStartScheduler ( ) ;
}