编辑: 被控制998 2013-10-19

? REG_IF |= IRQ_VBLANK;

依然不太对: 我们可以将写入代码从'

main'

函数中移出: int main(void) { powerON(POWER_ALL);

videoSetMode(MODE_FB0);

vramSetBankA(VRAM_A_LCD);

InitInterruptHandler();

while(1) { ? old_x = shape_x;

? old_y = shape_y;

? shape_x++;

? if(shape_x + shape_width >

= SCREEN_WIDTH) { ? ? shape_x = 0;

? ? shape_y += shape_height;

? ? if(shape_y + shape_height >

= SCREEN_HEIGHT) { ? ? shape_y = 0;

? ? } ? } ? ? } 不幸的是运行结果依然有问题.矩形在屏幕上多次出现并最终形成一个棋盘样子. 幸亏问题很清楚,当垂直扫描中断发生时硬件每1/60秒调用一次on_irq 函数,这时图形正在被擦除和重画. 不幸的是 '

main'

函数中的'

while'

循环和帧率并不同步.它快速的运行使得图形的坐标不断增加,这可能在'

on_irq'

程序调用时运行了50次.结果绘图程序擦除了已经被更新了50次的图形坐标.所以错误的区域被擦除了. 纠正: 我们可以通过让'

while'

循环等待直到中断发生.这可以通过让循环慢下来的侧面效果来实现.ARM9处理器可以有效的减慢直到中断发生.它也可以使我们的帧率维持在60帧每秒.实现这个功能的函数是'

swiWaitForVBlank'

. 你可能记得之前在'

on_irq'

函数中我们设置了一些寄存器,说是用来处理垂直扫描中断的.这是'

swiWaitForVBlank'

........

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题