搜索
bottom↓
回复: 4

求助熟悉FreeRTOS的坛友帮忙解惑pvPortMalloc函数的使用

[复制链接]
(17506281)

出0入0汤圆

发表于 2020-9-27 10:51:26 | 显示全部楼层 |阅读模式
本帖最后由 liyang121316 于 2020-9-27 14:50 编辑


      楼主位更新:硬错误问题找到了。第二个问题:获取剩余堆内存的时候,第一次分配完的剩余堆内存比第二次分配完的少。目前来看从第二次分配开始才能获取正确的堆内存剩余字节数。       
       
      使用的软件keil5,板子上芯片是stm32f103,添加了FeeRTOS系统(版本是v10.3.1),MemMang选择的是heap_4.c。

      在普通任务中使用pvPortMalloc函数申请内存时,当申请的内存字节数小于9时,程序运行了几次后会进入硬错误,
而且第二次申请内存后的剩余内存比第一次申请内存后剩余的内存大,请问这是什么原因,是不是pvPortMalloc函数在申请内存时,对申请的字节数有范围限制?
(我的实验代码很简单不涉及中断的使用)

       另外我分别用heap_1.c、heap_2.c、heap_3.c、heap_5.c做了上述相同的实验,发现只有heap_1.c在上面的实验条件下能正常分配。

       请熟悉FeeRTOS的坛友帮忙解惑,不胜感激!

//MALLOC任务函数
void malloc_task(void *pvParameters)
{
        u8 *buffer;               
        u8 times = 0;
        u32 freemem;

    while(1) {
                               
        buffer = pvPortMalloc(5);                        //申请内存,5个字节

        My_Print((0,"申请到的内存地址为:%#x\r\n",(int)buffer));
               
        if (buffer != NULL) {
            if (0 == freemem) {
                vPortFree(buffer);        //释放内存
                My_Print((0,"释放内存\r\n"));
                //buffer = NULL;
            }
        } else {
            My_Print((0,"内存分配失败\r\n"));
        }

        if (buffer != NULL)        {                                //buffer可用,使用buffer
            times++;
            sprintf((char*)buffer,"User %d Times",times);   // 向buffer中填写一些数据
            My_Print((0,"buffer = %s\r\n",buffer)); // 打印buffer中的数据
                }

                freemem = xPortGetFreeHeapSize();                  //获取剩余内存大小
        My_Print((0,"freemem = %d\r\n",freemem)); // 打印buffer中的数据

        vTaskDelay(100);//延时0.5s(为了方便观察现象)
    }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(17502038)

出0入0汤圆

发表于 2020-9-27 12:02:09 | 显示全部楼层
本帖最后由 zzh90513 于 2020-9-27 12:03 编辑

你上面frermem变量为啥没初值?申请完就释放了,下面再操作肯定有可能触发错误啊
(17501645)

出0入0汤圆

 楼主| 发表于 2020-9-27 12:08:42 | 显示全部楼层
zzh90513 发表于 2020-9-27 12:02
你上面frermem变量为啥没初值?申请完就释放了,下面再操作肯定有可能触发错误啊 ...

这个问题,我注意到了,把初值设置了一个非零的值,结果是一样的出错。
(17501301)

出0入0汤圆

发表于 2020-9-27 12:14:26 | 显示全部楼层
没这个问题,申请一个字节都可以
(17494885)

出0入0汤圆

 楼主| 发表于 2020-9-27 14:01:22 | 显示全部楼层
本帖最后由 liyang121316 于 2020-9-27 14:16 编辑
nongxiaoming 发表于 2020-9-27 12:14
没这个问题,申请一个字节都可以


多谢,找到硬错误的问题了。调试的时候往buffer 这里存字符串是不合适的,分配的小块,如果存的字符多的话,打印调试信息字符访问 字符串的时候会存在数组越界。

if (buffer != NULL){                                           //buffer可用,使用buffer
   times++;
   sprintf((char*)buffer,"User %d Times",times);   // 向buffer中填写一些数据
   My_Print((0,"buffer = %s\r\n",buffer));           // 打印buffer中的数据                    
}

目前第二个问题,获取剩余堆内存的时候,第一次分配完的剩余堆内存比第二次分配完的少。目前来看从第二次分配开始才能获取正确的堆内存剩余字节数。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2021-4-18 01:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表