This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

c6678 多核跑内存释放失败



mcsdk中有个image processing的例程,我将其中的边缘检测替换为了替他图像处理的算法。此算法处理时需要很多buffer,但从核无法完成空间分配,所以将所有核上的malloc操作均放在core0中进行,然后将分配好的buffer,通过message_put传给各从核,然后所有核做算法,完成算法后从核将结果反回给core0,最后core0要free所有buffer。

单核跑时,可以正常释放,但多核跑时,所有(包括给core0自己)的buffer均无法释放,控制台输出assertion failure,invalid free。

不知是什么原因,或者可能是什么原因?

我在malloc后,算法处理中,free之前,输出所有buffer的地址信息,从始至终地址信息都是一致的。

  • malloc是在heap上分内存的。请确认一下你的heap是分在local L2还是shared L2。
    如果heap是在local L2,在核A调用malloc给核B分配memory的做法是不对的。因为分配的是核A自己的heap。
    即使是在shared L2,这样做也不推荐,很容易出错。
    建议还是改进下软件架构。主核只把任务发给从核,从核自己管理自己的heap。

  • 先谢谢你的回答!

    image processing这个例程本来就是这样的架构,边缘检测算法里用的buffer也是主核分配释放的,从核使用。image processing的框架我都没变,只是改了算法而已为什么不行呢

    我今天参考边缘检测算法,把malloc改成Memory_alloc,把free改成Memory_free了,但时不时的还是会invalid free

    1. malloc 和 Memory_alloc 什么区别?

    2.之前试过在从核上做自己的malloc操作,但都malloc failed,算法根本没法进行。你说从核自己管理自己的heap,如何管呢?我该怎么着手呢?-_-||

    3.有时会有只free成功buffers中的一两个,然后在下一个free上invalid free的情况。可是那些buffers都一样的么,为什么中途会突然就free不了了?

    菜鸟求教

    thanks

     

  • 我写了个文档,总结了我所了解的BIOS中使用heap的要点。供参考
    另外你的问题回答如下:
    问题1
    • Malloc是标准C的函数,它是从system heap上分配buffer。在使用BIOS的情况下,通过BIOS.heapSize = 0x2000设定system heap的大小,在不使用BIOS的情况下要在cmd文件中用-heap设定sytem heap的大小。函数API是 void *malloc(unsigned int num_bytes);定义在stdilb.h头文件中。Malloc得到的buffer用free释放,API是void   free(void *_ptr);
    • Memory_alloc是从用户创建的heap(不是system heap)上分配bufer,它是BIOS的API,有下面4个入参。用户通过编辑BIOS的cfg文件可以创建自己的heap,参见附件文档。

    参数1 heap handler,即 指向heap object的handler

    参数2 size  需要分配的heap的size

    参数3 align 对齐特性要求

    参数4 Error_block 可以设成NULL

    Memory_alloc得到的buffer用Memory_free释放,API有3个参数

    参数1 Heap_Handle,即指向heap object的handler

    参数2 block, 即要释放的buffer的指针

    参数3 size, 即要释放的buffer的size  

    问题2

    Malloc fail 可能是System heap不够

    问题3

    没看太明白,我猜你是不是把Memory_alloc分来的buffer用free去释放了

    SYS-BIOS中malloc和Memory_alloc的区别.doc
  • 非常感谢你的回答以及文档!!

    关于文档:
    如果使用malloc,就设定BIOS.heapSize,如果是Memory_alloc,就设定heapbuf或heapMem是吧?
       1.那么这三种分别能设定的最大值是多少,有什么可能的制约条件么?
       2.文档里3个heap的物理地址如何推出来的我不知道,它们是有固定的起始地址吗?如果没有指定sectionName,那分配时是在足够大的section中随机选的吗?都是从section的第一个可用地址开始顺序往下分的吗?
       3.刚刚被free掉的空间是可以立即被重新分配的?
       4.watch窗口是...-_-||

    另外:
    我的cfg文件中有下面一些语句(是同一cfg里的):
       var heapMemParams = new HeapMem.Params;
       heapMemParams.size = 0x8000;
       var heap0 = HeapMem.create(heapMemParams);
       Memory.defaultHeapInstance = heap0;   //5.这里设成default后是什么效果呢?另外这个Memory是?

       /*Shared Memory base address and length */  
       var SHAREDMEM           = 0x0c200000;
       var SHAREDMEMSIZE       = 0x00200000

       SharedRegion.setEntryMeta(0,
           { base: SHAREDMEM,
              len:  SHAREDMEMSIZE,
              ownerProcId: 0,
              isValid: true,
              name: "MSMCSRAM_IPC",
           });
    //6.这里的shared memory和上面的heapMem是怎样的关系呢?
    //7.这个shared memory怎么被使用呢

    Memory.defaultHeapSize = 0x10000;   // 8.那这里设的是heap0的size?那heap0的size到底是0x8000还是0x10000?
    Program.heap = 0x10000;   // 9.这里Program又是什么?这里的heap又是什么heap?

    大菜鸟求教
    thanks

  • 问题1 heap的最大值物理内存大小限制
    问题2 system heap的地址根据分到的buffer地址退出来,用户创建的heap的地址从heap 对象可以看出来,在文档中我highlight成红色字体了
    问题3 可以
    问题4 我是指CCS 的expression窗口,用来观察变量值
    问题5, 6,7,8,9 这几个是 BIOS的cfg脚本相关的问题,和你跑得用例有关系,具体我不太了解。你查查CCS的BIOS相关帮助吧
    share memory是6678上多个核可以读写的共享内存,此外每个核还有自己私有的local L2

  • 非常感谢你的回答!

  • 关于malloc分system heap,Memory_alloc分用户自定义heap的说法,我只是根据BIOS的memory样例猜测出来的。

  • 你好,不知你的问题解决没.我最近也在研究这个例程。

     

    6 7代码里的messageQ_alloc是从 shared memory上分配buffer的,从共享区分配消息?

    从核的heapbufmp_open返回的指针在从核的heapMem上

    主核的heapbufmp_create返回的指针在主核的heapMem上

     在IPC user guide里提到,当你创建堆的时候,heapbufmp对象在local memory 上创建,只有实际的buffer和一些共享信息在shared memory ,这里的就是这个意思吧

     8 9 不知你明白了没有,望解答