现在的位置: 首页 > 综合 > 正文

vertical blank interrupt 和 horizontal blank interrupt解释

2012年10月14日 ⁄ 综合 ⁄ 共 980字 ⁄ 字号 评论关闭

转载自:http://hi.baidu.com/johnman/blog/item/24086289d68cc3b20e2444c0.html

 

垂直中断(vertical blank interrupt)和水平中断(horizontal blank interrupt)。

ndsl的硬件在屏幕上绘图的时候,是从上到下,从左到右,每个屏幕象素点依次绘制的。如下图:

绘制的过程是一行一行地绘制,每当绘制完一行。黑色箭头所指示,就引发一个水平中断(Hblank
interrupt)。当所有的行都被绘制,相当于完成了一次红色箭头所指示的路径,硬件引发一个垂直中断(Vbland
interrupt)。当然,完成这些过程,是否引发中断,还要设置对应的寄存器。

为什么需要这些中断?举个例子:

如上图:最左边的文字是经过的时间,每一行的左边图形表示当时显存的内容,右边表示当时屏幕的显示内容。实际上,显存是一块线性的连续内存,并且每一个单位(8bit或者16bit)对应屏幕上的一点。但是为了具像,所以把显存抽象成跟屏幕一样是个矩形。另外要指出:nds是每1/60秒(2/120秒)绘制一次屏幕。

下面是对上图的解释:

0秒的时候:

内存的内容是一个正方形,硬件准备绘图,这时屏幕上什么也没有。

       

1/120秒的时候:

硬件把内存一半的内容绘制到屏幕上,屏幕上出现半个正方形。

     

再过了0.01/120秒的时候(也就是1.01/120):

这时你的程序希望显示一个三角形,于是就把整个内存的内容改写成三角形了,而在这短短的时间内,nds的绘制屏幕的硬件并没有停止,而是继续把显存的内容绘制到屏幕上,也就是绘制了第三行那小小的红色块。不过这些似乎并没有太大影响。

  

2/120秒的时候:

绘制的硬件完成了内存下半部红色区域所指示的内容的绘制,本来你写的程序以为要显示一个三角形,但实际上却显示成了右图所示的一个类似T状的图形。这并不是你所希望的结果。

实际上的程序和情况会比这个更加复杂和不可预知。因此,垂直和水平中断向量就是为了克服这个问题而引入的。

当完成了一次屏幕绘制的时候,就引发一个垂直中断。通过引发这个中断,这个时候就不再绘制屏幕,用户可以在这个时候更新显存,等到更新完毕的时候,设置好所有要显示的内容的时候,再让硬件进行绘制。这样就能够保证显示出来的东西是你所希望的东西了。

抱歉!评论已关闭.