开源游戏移植到32位微控制器的方法
2009-06-02
作者:Pierre Berquin
摘 要: 随着处理性能的提升,现在的微控制器中可以运行在20世纪90年代需要PC机才能运行的应用程序。电子游戏业是这一技术进步的最大受益者。目前,在一个配有LCD图形界面和32位ARM微控制器的移动平台上,可以实现最早出现在PC机上的3D游戏。本文介绍利用适合的源文件架构,把开源游戏代码移植到微控制器上的方法。
关键词: 微控制器;ARM;游戏代码
20世纪90年代,计算机领域开始盛行游戏,世界首款PC机3D 游戏《德军总部》(Wolfenstein 3D)是IdSoftware公司1992年开发的,是《毁灭战士》的前身。《德军总部》证明了PC机显卡的处理性能足以运行这类3D动画。很多人都记得,《毁灭战士》是第一款把3D带到PC机的游戏。这款游戏的源代码于20世纪90年代中期被公布在互联网上,今天在网上还能找到这款游戏的源代码。如果现在想再玩一次这个游戏将不是在PC机上,而是使用微控制器和集成的液晶显示器。
本文主要介绍向一个新平台移植复杂代码的方法。1992年,《德军总部》彻底改变了3D游戏世界,它是第一款让玩家可以在3D环境中自由移动的游戏。图1为在一个应用电路板上的Wolfentien 3D。
在这款游戏中使用了大量的纹理和精灵,因此图形和源代码一样重要。为使游戏有一种3D的效果,软件采用光线投射法将图像放置到屏幕上。光线投射法就是从视点投射光线。为了加快这个过程,软件使用了大量的墙砖。例如,为了向一个屏幕像素点投射一条射线,软件采用一个空间搜索方法,找到这条射线与最近墙体的交叉点。
在《德军总部》中,墙体和纹理的尺寸为64×64像素,如图2所示。
虽然这款游戏在当时取得了巨大成功,但仍然存在局限性。例如,墙壁的高度都相同,角度都是90°,没有对角线;另外这些局限性方便了代码移植,因为它们表示源代码复杂性不高。
目前设计者力争在最新的32位微控制器上令这款游戏焕发新的生机。首先,必须设计一个应用电路板运行这款游戏。从用户的角度看,只看见两个元器件:一个240×320的彩色TFT液晶显示器和一组让玩家可以在《德军总部》的迷宫中行走的按键。实际上,除这两个可以看到的设备外,还有一个管理屏幕和键盘的微控制器芯片。因为这类屏幕的接口是并口(16位宽),所以必须选择一个能够驱动这个屏幕的微控制器。
把源代码轻松地移植到微控制器
《德军总部》的源代码十分复杂。源代码越复杂,越难管理。因此,把这款游戏代码移植到新的目标应用不是一件容易的事情。在动手之前,应先确定原应用程序的编程语言是否可移植及编程语言的编译器是否可用。《德军总部》用C语言编写。因为C语言在微控制器领域应用广泛,市场上有众多的C语言编译器和调试器,所以,可以把这个软件移植到微控制器。
如果应用代码逻辑清晰,C语言准许源代码移植到多个目标应用。项目源文件的组织是一个需要考虑的因素,下面提供一个源文件组织方法。
《德军总部》文件夹有两个子文件夹,如图3所示。
从意法半导体基于ARM Cortex M3内核的内置闪存的32位微控制器系列产品中选择了STM32F103ZE。
STM32F103ZE的主频高达72 MHz,电源电压范围2.0 V~3.6 V,内置512 KB闪存和64 KB RAM。该产品还提供一个外存控制器FSMC(灵活静态存储控制器),通过这个控制器,STM32F10xxx微控制器可连接各种存储器(SRAM、NOR闪存等)。FSMC有16条数据线和26条地址线,使用5个独立的存储器片选引脚,可连接64 MB存储器。在《德军总部》应用电路板上,这个接口用于驱动TFT液晶显示器和外部4 MB SRAM高速异步存储器。按键直接连接到通用输入输出端口。应用电路板的电源电压为3 V,使用三支1.2 V电池和LM317稳压器为应用板供电。
意法半导体提供一个非常有用的软件库,包含多个STM32硬件管理示例。为了达到移植应用代码的目的,软件库用于写TFT显示驱动程序。开发人员可以从 www.st.com网站下载STM32软件库。
Appli文件夹包含IDE项目以及硬件驱动程序资源,如TFT显示驱动程序。该文件夹包含硬件应用板的名称(本示例是STM3210E-EVAL)。文件夹还含有用于管理应用板硬件和IDE项目的意法半导体STM32软件库。软件库函数被《德军总部》源代码用于写硬件驱动程序。
Source文件夹包含《德军总部》的原程序源代码,源代码的指令或函数不能直接与应用电路板硬件互动。portable子文件包含在游戏源代码与执行源代码的目标硬件之间建立联系的函数。在本示例中,这个文件夹是STM3210E-EVAL。这个文件含有调用应用板硬件的函数。
显示管理
《德军总部》游戏含有一个VW_UpdateScreen函数。根据内部视频缓存的内容,这个函数可以刷新TFT液晶显示器,函数本身还用于驱动TFT液晶显示器。因此,必须在portable/STM3210E-EVAL文件夹内定义这个函数。VW_UpdateScreen函数可以调用在Appli/ STM3210E-EVAL文件夹内定义的基本函数(驱动软件)。
Source/portable/STM3210E-EVAL/文件夹含有与编译器兼容的类型的摘要和定义。通过种方法,可以把源代码从一个目标应用移植到另一个目标应用,无需修改复杂的源文件。如果源代码是移植到一个有不同的接口硬件、映射不同的STM32应用,或者当编译器修改时,这个功能非常有用。只需更新Appli/STM3210E-EVAL/和Source/portable/STM3210E-EVAL/ 中的限制性文件,即可将游戏源代码移植到新的目标应用。
设计成果如图4,这看起来很像90年代的便携游戏。
在互联网上很容易找到用C语言编写的老PC机游戏的源代码。因为STM32系列微控制器的处理性能很强,并集成了液晶显示器接口,现在可以在以STM32为内核的应用产品上体验这些游戏。