编辑: 被控制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'
........