提高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,请问下,问题是出在哪里呢?我这个测试方法对么?
愤怒的小土豆
11 years, 8 months ago
Answers
个人觉得可以从以下几个方面来检查:
1.更改系统频率是个大事,更改时钟频率后,各个模块的频率设置参数要同步跟新,一般模块是根据主时钟分频或者倍频来的,比如RTC的话分频的参数需要改变,否则获取系统时间实际是不准的。
2.硬件接口通信的频率匹配。比如你项目中各个IO支持的最大频率,DDR支持的频率,各个频率是否有整数倍的要求等。
3.检查一下中断程序,主频提高有可能会导致某些中断程序的执行也更加频繁,从而干扰测试程序的执行。
4.上面的三条都是基于硬件正常的前提之下,确保晶振的正常工作,可以把系统的时钟从IO输出来用示波器查看一下是否符合要求,是否有不工作的模块干扰程序的运行等等。
小样啊丫的
answered 11 years, 8 months ago