TI中文支持网
TI专业的中文技术问题搜集分享网站

C6638内存释放耗时的问题

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

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

Allen35065:

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

yu liang2:

回复 Allen35065:

我把代码简化了一下,做了一个实验,代码的结构是这样的:多个线程,我在优先级第二大的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函数,我理解的这两个函数是保护不被抢占的,不知道对不对。

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

comeback:

回复 yu liang2:

yu liang2,你好!

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

yu liang2:

回复 comeback:

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

g_uiGetCycle1 = TSCL;

malloc();

g_uiGetCycle2 = TSCL;

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

赞(0)
未经允许不得转载:TI中文支持网 » C6638内存释放耗时的问题
分享到: 更多 (0)