Gnuboy是一种虚拟机机制,它对具体硬件的操作是通过操作系统(这里是L inux)来进行的,图4 为它对基于ARMlinux平台硬件操作的抽象层次。
这个抽象层次也适用于在ARM Linux平台下用C语言编写的一般虚拟技术应用。越是顶层越是抽象,代码可移植性就越好;越是底层,越是硬件相关,代码可移植性就越差,但代码执行速度越快。这也是一般虚拟机移植和优化思想的体现,提高移植性,多运用抽象的接口,提高速度,多一些直接操作硬件的代码。
移植
Gnuboy在此平台上的正确运行需要解决中断、提供Framebuffer支持、数据存储格式、字符串到64位整数转换等问题。
中断问题
Gnuboy需要依赖宿主操作系统(这里是L inux)来提供输入/输出等基本服务,让宿主操作系统作为它与硬件设备的中间人,这种游离于硬件通信细节之外的方法具有良好的可移植性,本文要解决的主要是提供对键盘输入和游戏控制终端的中断响应和处理。
在本文构建的平台下,需要编写相应的键盘和游戏控制终端的Linux驱动程序,以模块方式加载后,在Gnuboy中打开该设备。对应键盘处理,在Gnuboy中需要调整相应的键盘设置代码使之与系统一致。
提供Framebuffer支持
Framebuffer技术提供了一个访问物理图形设备的定义良好的接口,本文构建的平台下采用的是Qt系统的嵌入式版本,它是基于Framebuffer的, Gnuboy要在该平台下运行,必须提供对Framebuffer的支持。通过访问/dev/ fb0来取得系统framebuffer中用于显示图像的数据和进行处理。在Gnuboy中调用游戏画面的Framebuffer地址和扫描方法也需要作响应的修改。
修改Framebuffer地址,也就是获得游戏画面的开始地址在内存中的位置。针对采用的LCD 的分辨率, 需要在Gnuboy中计算Framebuffer地址处做出相应修改。对于本平台中采用的LCD, Gnuboy刷新处理方法是从第一行开始,逐行刷新,同时由于一个像素采用两个字节,因此在逐行刷新时,每次写两个字节。
数据存储格式和字符串到64位整数转换
在ARM Linux下可配置成大数端或者小数端格式来保存和处理整数数值,在Gnuboy中与数值存储字节顺序有关的代码需要与之对应。
Linux明显缺乏用来把整数字符串转换为64位整数的函数,如果字符串参数突破32位的极限,就有可能出问题,因此在Gnuboy需要提供字符串到64位整数的的转换函数。
设置启动模拟器路径和编译
在用户已经选择好游戏Rom,点击launch simulator按钮触发启动模拟器,进入游戏功能,因此在Gnuboy代码中需要获得rom的绝对路径,由于QT操作系统无法在代码中直接运行qtop iagnuboy命令,因此需要给出该可执行文件的绝对路径。
源代码修改好以后,在Makefile中设定交叉编译器: CC= arm - linux - gcc, CXX = arm - linux - g + +。编译时要用到针对ARM的函数库可以把函数库放在一个自己建的一个目录,为了让gcc 在搜索函数库时到指定的目录中寻找,可在Makefile的通过- L参数添加存放针对ARM函数库的目录。例如QTOP IA L IBS = - L $(QPED IR) / lib。
经过交叉编译后把得到的可执行文件qtop iagnuboy和qtop iagnuboyl烧到嵌入式系统中可以运行,然后不足之处是画面速度有些慢,这正是下面优化要研究的问题。
Gnuboy在ARM Linux下的优化
优化概述
如果说CISC的指导思想之一是为了减轻编译的负担,R ISC则向编译提出了更高的要求,ARM作为一种R ISC体系结构,优化问题显得非常重要。从图4 的抽象层次可以知道,对Gnuboy的优化问题,概括来说是对它一些抽象代码进行硬件相关代码替代的过程,并且越是底层的代码,速度越快,这里直接用ARM汇编语言来改写一些原来的C函数。前面的移植运行结果已经显示, Gnuboy的图像显示较慢。它的函数void lcd refreshline ( )的主要功能是使用已经解码好的图像数据来完成游戏画面的显示。对它的优化主要是对它里面调用的两个用C语言所写函数updatepatp ix ( )和bg scan color ( )函数的优化。
本文采用了与机器相关优化的优化技术,与机器相关的优化这里主要是寄存器分配问题,一般寄存器分配算法是基于一种称为图着色技术的。给定一个无向图G= (V , E ) ,V 是有限节点的集合,V = { v 1, v 2, ., v n} , E是边的集合, E = { ( i, j ) | v i∈V , v j∈V , v i和v j相连} , 图着色问题要求找到一个k尽量小的所有节点的赋值(也称“完全赋值”) C: V — > {1.k } , 要求在该完全赋值中, 若( i,j ) ∈E , 则C ( v i) ≠C ( vj) 。
简化的图着色技术应用
针对本文的优化,第一阶段是把C函数用伪ARM汇编指令(即用符号寄存器Ui替代真正ARM寄存器的ARM指令)改写。
评论
查看更多