FreeRTOS之内存实验

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,则申请失败。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值