工作笔记之32BPP之二

来源:互联网 发布:lego ev3 编程教程 编辑:程序博客网 时间:2024/04/28 18:30

20100924:

   

最后验证的结果,应该是和内存速度相关,测试如下:

//内存读写数据测试

void MemTimeTst(void)

{

#if    24BPP

       unsigned int *addr=(unsigned int *)(LCD_BUFFER);

#else

       //16BPP

       unsigned short *addr=(unsigned short *)(LCD_BUFFER);

#endif

       unsigned int i,j,k,m;

       //屏分辨率

       m=(SCR_XSIZE*LCD_YSIZE);

       rGPGCON=(rGPGCON & (~(0x3<<10)))|(1<<10);

       //IO口输出高电平

       rGPGDAT=rGPGDAT | (1<<5);

       //输出低电平,此时就可以抓到下降沿了

       rGPGDAT=rGPGDAT & ~(1<<5);

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

       {

              *(addr+i)=*(addr+i+1);   

}

//拉高,测量低电平时间

       rGPGDAT=rGPGDAT | (1<<5);

}    

16BPP写内存时间8ms,对应的24BPP时间15ms

 

void LCDDMATimeTst(void)

{

       //(rLCDCON1>>18)DMA输出LCD数据的行指针,只读,countdown

       while((rLCDCON1>>18)!=271)

       {}

       rGPGCON=(rGPGCON & (~(0x3<<10)))|(1<<10);

       rGPGDAT=rGPGDAT | (1<<5);

       rGPGDAT=rGPGDAT & ~(1<<5);

       //等待DMA271传输到0

       while((rLCDCON1>>18)!=0)

       {}

       rGPGDAT=rGPGDAT | (1<<5);

}    

输出271,DMA时间17->18ms左右(基于不同的HCLK和CLKVAL时间会不同,只是测试一下16BPP和24BPP差异),16BPP24BPP无明显区别

 

以上,时间用示波器测量IO端口的高低电平来测量时间

 

一般,人眼可以感觉到的闪烁为60HZ,1000/60ms=16.7ms,24BPP直接写一帧的时间基本就已经达到了60HZ,再做一下其他判断,则输出来的画面会缓慢

 

总结:16BPP->24BPP,写内存时间增加接近1倍左右,DMA时间没变,所以直接写屏也会较16BPP闪烁;从16BPP->24BPP DMA时间可以变得更大或更小,而写内存时间是改变不了的

 

之所以会出现这种状况,可能是由于驱动中是用NOCACHE,对应的写内存速度不是受CPU限制而是受SDRAM限制,SDRAM目前最高速度好像是133M,而不是CPU400M。而且写数据一般是从内存的一个地方读取出来保存到LCD buffer对应的内存中,需多个指令周期完成

 

原创粉丝点击