Welcome 微信登录

首页 / 操作系统 / Linux / Linux基础知识:双buffer与单buffer

在嵌入式平台Linux,主要通过framebuffer来显示UI。FrameBuffer实际上就是嵌入式系统中专门为GPU所保留的一块连续的物理内存,LED通过专门的总线从framebuffer读取数据,显示到屏幕上。根据系统中framebuffer的数量,可以分成单buffer和双buffer两种。先来说说单buffer:CPU往framebuffer上写,LED从framebuffer读,这是两个同时进行的过程,需要在时间上配合,否则会出现问题。如果CPU往framebuffer上写的速度>LED从framebuffer读的速度,那么就有可能出现LED在一行一行的读取前一屏数据的时候,CPU却已经刷新了整屏,从而导致显示混乱。这里要注意,LED从framebuffer读的速度并不等于屏幕的刷新频率,如果刷新频率为60hz,那么很有可能LED花了3个ms去读,剩余的时间都在等待。应该说CPU往framebuffer写的速度>LED从framebuffer读的速度还是很困难的。如果CPU往framebuffer写的速度太慢,也会出现屏幕闪烁的问题。比如说要画一幅图,CPU首先将其填充为白色,这时LED刷新,屏幕显示为白色,之后开始画完其他内容,屏幕正常显示。这时给用户的感觉就是屏幕一闪。这就要求CPU尽快的画完一屏,尽量保证写一屏不要跨越LED刷新周期。因此,在单framebuffer的时代,为了防止屏幕出现闪烁,我们一般是在内存中开辟一块与framebuffer同样大小的内容,将屏幕的内容都写好,然后再执行一次内存拷贝。从而使写framebuffer的时间尽可能的短。但这种机制有问题,我以屏幕分辩率为320*240为例。一块framebuffer的大小为:320*240*4=0.3072M。也就是说,我要先在内存中填写0.3M的内存,然后再把这块内存拷贝到framebuffer中。为了简单起见,这里我举一个将屏幕置为白色的例子,排除屏幕内容计算的影响。显示的实际过程为,将内存中0.3M置为0,然后读取这0.3M的内存,拷贝到Framebuffer中。在我使用的嵌入式平台中,采用的是SDRAM,532Mhz的ARM11芯片。通过使用lmbench得到内存访问的速率为:*Local* Communication bandwidths in MB/s - bigger is better-----------------------------------------------------------Host OS Pipe AF TCP File Mmap Bcopy Bcopy Mem MemUNIX reread reread (libc) (hand) readwrite--------- ------------- ---- ---- ---- ------ ------ -------- ---- -----phone Linux 2.6 79.1 94.7 13.3 47.1 135.9 78.6 77.8 135. 205.9很奇怪,为什么读会比写慢,可能与cache有关,这里先不用去管它。
  • 1
  • 2
  • 下一页
Linux设备模型之led子系统Linux中断导读之一--初始化<1>相关资讯      Linux基础知识 
  • Linux基础知识之文件权限详解  (08月09日)
  • Linux基础知识之ls与文件名通配详  (08月01日)
  • Linux基础知识之history的详细说明  (07月31日)
  • Linux基础知识之文件管理命令(cp、  (08月09日)
  • Linux基础知识之man手册的使用  (07月31日)
  • Linux基础知识之文件的时间戳及  (07月31日)
本文评论 查看全部评论 (0)
表情: 姓名: 字数