工作笔记之32BPP之二

这篇工作笔记详细记录了24位色彩每像素(BPP)与16位色彩在内存读写及DMA传输上的性能差异。测试结果显示,24BPP的内存操作时间几乎是16BPP的两倍,但DMA传输时间两者并无显著区别。由于内存速度受到SDRAM限制而非CPU,导致24BPP在刷新率上可能无法达到60Hz,从而造成显示效果的闪烁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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对应的内存中,需多个指令周期完成

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值