双缓冲,顾名思义,就是二级缓冲。缓冲是一块内存或者一个/一组寄存器,一般位于接口之中,接口是指硬件或者软件间的一种连接。接口可以协调通信双方的数据交换,比如并行/串行数据的转换,模拟/数据信号的转换,高速/低速设备间的匹配等。那么双缓冲又是什么呢?
一种双缓冲是硬件上的,是一种严格意义上的双缓冲。下面就是一个双缓冲结构的例子:

PIC定时器中的双缓冲结构
图示是PIC 18单片机中定时/计数器的结构图,PIC18是一种8位的单片机,但它的定时/计数器(的寄存器)却是16位的,所以为其装初值的时候就要分高低字节分别装载。于是问题就来了,由于定时计数器一般是连续工作,需要经常进行重装,如果对一个正在工作的定时计数器进行重装的话,就会产生高低字节不同步的状态,这是一种潜在的错误,尽管这种错误发生的概率很小。为了防止这种错误的发生,PIC单片机设计者采用了上图所示的双缓存结构。其中,TMR0H’和TMR0L组成了一个真正的定时计数器,而TMR0H是一个临时寄存器只有TMR0L的写信号有效时它才能被装入TMR0H’。当需要重装定时器时,首先应该将16位定时/计数的初值的高8位装入TMR0H临时寄存器,然后在向TMR0L写入低8位时由于TMR0L写信号有效,TMR0H也被同步地装入TMR0H’。这样,定时计算器就可以正确的工作,这就是硬件的双缓冲。
接触到”软件”的或者说逻辑的双缓冲,是在Chris写一个3D魔方的时候。最初的魔方在转动时画面会发生闪烁,后来采用的双缓存消除了闪烁。画面闪烁是因为程序是边计算图像的”桢”(输入法无此字)数据,边向显示器(显存)写出桢数据所造成的延迟感。解决方法就是,先将计算所得数据存入内存,得到一个完整桢后再”一次性”地写入显存。这也是一种双缓存,也是一种同步,但不是严格意义上的同步。另外,一个更好的方法就是采用利用多线程,创建一个可容纳多个桢的缓冲池作为共享,创建一个线程来计算桢数据并添加到缓冲池,创建另外一个线程从缓冲池中取出桢并写入显存。当然,正两个线程需要一定的同步机制来协调工作。要是再创建一个线程,痴痴地等待着Chris同学的鼠标就perfect了!
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
Be the first to comment on this entry.