liyang121316 发表于 2020-9-27 10:51:26

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

本帖最后由 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(为了方便观察现象)
    }
}

zzh90513 发表于 2020-9-27 12:02:09

本帖最后由 zzh90513 于 2020-9-27 12:03 编辑

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

liyang121316 发表于 2020-9-27 12:08:42

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

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

nongxiaoming 发表于 2020-9-27 12:14:26

没这个问题,申请一个字节都可以

liyang121316 发表于 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中的数据                  
}

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


页: [1]
查看完整版本: 求助熟悉FreeRTOS的坛友帮忙解惑pvPortMalloc函数的使用