1、 先介绍FreeRTOS内存管理的文件。
文件名 | 说明 | 建议 |
---|---|---|
heap_1 | 最简单的方法,不允许释放内存。 | 因为FreeRTOS添加了对静态分配的支持,所以heap_1的用处不大。 |
heap_2 | 允许释放内存,但不合并相邻的空闲块。 | 没有处理内存堆的碎片 |
heap_3 | 简单地包装标准malloc()和free()以确保线程安全。 | 在嵌入式中不建议使用 |
heap_4 | 合并相邻的空闲块以避免碎片。包括绝对地址放置选项。 | 没有特殊要求,在嵌入式中足够 |
heap_5 | 按照heap_4,具有跨多个不相邻的内存区域扩展堆的能力。 | 对内存块有特殊要求 |
2、 创建任务
static TaskHandle_t malloc_task_handle;
xTaskCreate(malloc_task, "malloc_task", configMINIMAL_STACK_SIZE + 200, NULL, 2, &malloc_task_handle);
3、 编写内存的测试任务入口函数
#ifndef TAG_BLE
#define LOG_BLE(...)
#endif
uint8_t malloc_heap_1024uint=1;
static void malloc_task (void * pvParameter)
{
uint8_t button1_sta=0;
uint8_t button2_sta=0;
uint8_t *Test_Ptr = NULL;
LOG_BLE("HeapSize:%d,%dk\n",xPortGetFreeHeapSize(),xPortGetFreeHeapSize()/1024);
while(1)
{
if( READ_BUTTON1_P11() == BUTTON_PUSH )//申请
{
if ( 0 == button1_sta )
{
button1_sta = 1;
if (Test_Ptr==NULL)
{
LOG_BLE("malloc %dk\n",malloc_heap_1024uint);
Test_Ptr = pvPortMalloc(malloc_heap_1024uint*1024);
if(NULL != Test_Ptr)
{
LOG_BLE("Test_Ptr addr:0x%X\n",(int)Test_Ptr);
LOG_BLE("HeapSize:%d,%dk\n",xPortGetFreeHeapSize(),xPortGetFreeHeapSize()/1024);
malloc_heap_1024uint++;
} else
{
LOG_BLE("malloc error\n");
}
} else
{
LOG_BLE("please free heap\n");
}
}
} else
{
button1_sta = 0;
}
if( READ_BUTTON2_P12() == BUTTON_PUSH )//释放
{
if (0 == button2_sta )
{
button2_sta = 1;
if (Test_Ptr!=NULL)
{
LOG_BLE("free heap\n");
vPortFree(Test_Ptr);
Test_Ptr=NULL;
LOG_BLE("HeapSize:%d,%dk\n",xPortGetFreeHeapSize(),xPortGetFreeHeapSize()/1024);
} else
{
LOG_BLE("please malloc heap\n");
}
}
} else
{
button2_sta = 0;
}
vTaskDelay(20);
}
}
3、实验说明和现象
配置的内存大小如下:
①按下按键1申请内存1024字节,然后按下按键2释放内存。
②按下按键1申请内存2K,然后按下按键2释放内存。
③以此递加1K,直到内存申请失败。
当申请的空间大于30K,则申请失败。