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.

C6638内存释放耗时的问题

Other Parts Discussed in Thread: SYSBIOS

在一个核中,程序开始会malloc一些空间(在DDR中,申请的空间都是28字节),申请的地址也是逐步向后排的,等到释放的时候发现越到后面的地址释放起来越耗时

前面的地址释放需要几千cycle,后面的地址释放需要几十万cycle,请问这是怎么回事?是寻址的时间长导致的吗?该怎么解决呢,是不是我用错了内存分配函数?还是这种现象无法避免了?

  • 肯定不是寻址时间的问题;但不清楚你的代码实现流程,也无法做出判断。

  • 我把代码简化了一下,做了一个实验,代码的结构是这样的:多个线程,我在优先级第二大的TSK的开头写了两个for循环

    /****连续申请****/

    for(i=0;i<400;i++)

    {

     pTest = malloc(28);  //申请28字节的空间

    uiTestArr[i] = pTest ;

    pTest  = NULL;

    }

    /****连续释放****/

    for(i=0;i<400;i++)

    {

    free(uiTestArr[i],28);

    }

    我统计出的耗时情况如下:

    (1)malloc的耗时:

    下图的第二列是malloc语句消耗的时间,第三列是申请到的地址

    我预期的情况是,申请同样大小的空间,耗时应该是相同的,或者不会相差很多,但从图中可见,有出现几千的情况,这个是什么原因?

    (2)free的耗时:

    情况和malloc的差不多,也是会突然冒出几个大的值

    如果是因为优先级抢占造成的,确实会有一个TSK会和它抢,而且频率是1ms一次,但不管是malloc还是free的执行应该都是会保护自己不被打断的才对,不知道真实情况是不是想我猜测的这样。而且我也在malloc和free的上下都加了ti_sysbios_knl_Task_disable和Task_enable函数,我理解的这两个函数是保护不被抢占的,不知道对不对。

    这个问题困扰了我好久,望大牛们多多指教,小妹不胜感激。

  • yu liang2,你好!

    请问你测量malloc耗时的那张图是用什么工具产生的?它如何测量每个malloc的耗时?

  • 嘿嘿,其实我是定义了两个变量,比如

    g_uiGetCycle1 = TSCL;

    malloc();

    g_uiGetCycle2 = TSCL;

    g_uiGetCycle2减去g_uiGetCycle1就是malloc消耗的时间啦,然后在内存中看,就是我贴的图

  • 你的系统里有中断吗?关闭中断试试

    malloc的源代码在C:\ti\c6000_7.4.x\lib\src,memory.c里

    供参考