提高ARM和DDR2的主频,为何访存速度不升反降?


RT,在提高了ARM的主频和DDR2的主屏后,为何访存速度不仅没有提高,反而下降了呢?
以下是测试代码:

   
  #include <stdio.h>
  
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>

#define Buffer_Num 2
#define Buffer_Len 576*704*2

unsigned char * g_memcpyBuf[Buffer_Num];

unsigned int getCurTimeInMsec()
{
struct timeval tv;

if (gettimeofday(&tv, NULL) < 0)
return 0;

return tv.tv_sec * 1000 + tv.tv_usec/1000;
}

int main(void)
{
int i;
int len = Buffer_Len;
for( i=0; i<Buffer_Num; i++)
{
g_memcpyBuf[i] = (unsigned char *)malloc(len);
if(g_memcpyBuf == NULL)
{
printf("Memcpy_Thread cmemAlloc Fail!\n");
return -1;
}
}
usleep(1000000);

printf("\n ok, enter loop!\n");

unsigned int beftime,endtime,avgtime;

unsigned int count = 0;
avgtime = 0;

while(1)
{
beftime = getCurTimeInMsec();

//memset(g_memcpyBuf[0],0,len);

memcpy(g_memcpyBuf[1],g_memcpyBuf[0],len);

endtime = getCurTimeInMsec();

avgtime += endtime-beftime;

if (++count % 10 == 0)
{
printf("count=%d, 10 memcpy times, total_time=%d, avgtime=%f\n", count, avgtime, avgtime/10.0);
avgtime = 0;
}
usleep(10000);
}

for( i=0; i<Buffer_Num; i++)
{
free(g_memcpyBuf[i]);
}

return 0;
}

程序功能和简单,使用memcpy拷贝一块大约811KB的内存单元,在提高主频前,每次memcpy是2ms,提高主频后,每次是5ms,请问下,问题是出在哪里呢?我这个测试方法对么?

Linux 嵌入式

愤怒的小土豆 11 years, 8 months ago

个人觉得可以从以下几个方面来检查:
1.更改系统频率是个大事,更改时钟频率后,各个模块的频率设置参数要同步跟新,一般模块是根据主时钟分频或者倍频来的,比如RTC的话分频的参数需要改变,否则获取系统时间实际是不准的。
2.硬件接口通信的频率匹配。比如你项目中各个IO支持的最大频率,DDR支持的频率,各个频率是否有整数倍的要求等。
3.检查一下中断程序,主频提高有可能会导致某些中断程序的执行也更加频繁,从而干扰测试程序的执行。
4.上面的三条都是基于硬件正常的前提之下,确保晶振的正常工作,可以把系统的时钟从IO输出来用示波器查看一下是否符合要求,是否有不工作的模块干扰程序的运行等等。

小样啊丫的 answered 11 years, 8 months ago

Your Answer