怎样将一个开源游戏移植给一款32位微控制器

在上世纪90年代,游戏开始在计算机世界中蔓延。我还记得第一次玩wolfenstein 3d,那是第一款3d的pc射击游戏。它由idsoftware于1992年开发,是doom的前身。wolfenstein 3d证明pc的图形能力已足以满足这种类型3d动画的开发。90年代很多十几岁的年青人都会记得wolfenstein 3d,因为这是第一款把3d世界带到他们pc上的游戏。90年代中期它的源码在互联网上公开,现在还能找到。现在我想再玩这款游戏,但不是在我的pc上。我将利用一只微控制器的功率和集成度。
随着微控制器性能增强,已经有可能用它们执行一些在90年代还需要pc处理能力的程序,而游戏领域的应用受这一进展影响很大。现在可以在某种移动应用(包含图形lcd和一个32位 arm微控制器)中实现第一个pc上的3d游戏。本文将阐述如何将一个开源pc游戏的代码移植到一款有适当源文件结构的微控制器上。
这里需要补充一句:本文并不打算分析wolfenstein 3d的源码。很多文章已经做过这件事了。本文的目标是说明将复杂代码移植到新平台上的方法。不过,这款游戏的结构做得很好,解释一下还是很有意思的。事实上在1992年,wolfenstein 3d在3d游戏领域是一场革命。它是第一款玩家能在3d场景中自由移动的游戏。
在此游戏中,图像与源码同等重要,因为它采用了大量贴图和子画面。这些都采用光线投射(ray casting)方法定位在屏幕上,从而给游戏以一种3d效果。光线投射包含了从一个pov(视点)的投射半径。并采用了一系列技巧以实现加速。例如,为了在像素点屏幕上投射一个半径,要做一个空间搜索,以找到该半径与最近墙上的交汇点。在wolfenstein 3d中,墙面和贴图的尺寸都是64 x 64像素(见图3)。
虽然该游戏在当时取得了无比的成功,但它也有一些局限。其中之一是墙的高度全都一样,它们全是90°,没有斜角。这些限制减轻了移植的难度,因为它们代表着源码不太复杂。另一个限制是地面和天花板没有贴图。
我会尝试在一只较新的32位微控制器上给这款游戏以新的生命。一个必需的部件是建立一个控制游戏的应用电路板。从用户角度只有两个东西是可见的,一个240 x 320 tft彩色屏幕,以及一组让玩家在wolfenstein 3d迷宫中穿越的按键。另外,微控制器用于屏幕和按键管理。由于这种类型屏幕采用一种并行接口(16位宽),需要选择一种能够驱动这种屏幕的微控制器。 如何更顺利地移植源码?
wolfenstein 3d的源码相当复杂。源码越复杂,控制它就越难。因此,将这个应用移植到一个新的目标上非常困难。在开始以前,重要的是了解用于编写原应用的语言是否为可移植的,而且该语言的的编译器是否能用于新的目标。wolfenstein 3d采用c语言编写。c语言有利于移植,因为它在微控制器领域广泛可用,市场上现有很多编译器与调试器。
c语言允许一个源码对多个目标,前提是它采用一种逻辑和清楚的方式编写。项目源文件的组织是一个考虑因素。图4提出了一种方法。
图示的软件方法将原始源码与应用板使用的物理层分隔开来。移植过程中,原始游戏的源码必须作少许修改,用到硬件的函数必须转移(并修改)到“可移植”段。
当你准备将一个程序移植到一个新的目标时,主要问题是“哪种新目标机能够执行这个程序?”要理解这个需求,就需要知道源码的主要功能,如外设的类型和数量,以及内存的大小(wolfenstein 3d需要至少500kb程序空间和96kb ram空间)。
应用的核心必须是一只32位微控制器,因为wolfenstein 3d的执行要求高性能的算术计算,用于光线投射方法和刷新屏幕的执行速度,8位或16位微控制器无法达到这种性能水平。另外,为了简化电路板布局,需要选择一款嵌入了程序内存(闪存)的微控制器。现在,市场上存在着大量这类32位微控制器,但arm处理器是嵌入式应用的标准处理器。
我选择的是意法半导体公司的stm32,因为它采用了一个arm cortex-m3核心,专为嵌入式应用而开发。请允许我介绍这个stm32 32bit闪存微控制器系列,尤其是stm32f103ze产品。
stm32f103ze运行频率最高可达72mhz,应用电源为2.0v至3.6v。它提供512kb闪存和64kb ram。外存控制(灵活的静态内存控制,fsmc)可使stm32f10xxx微控制器与各种存储器接口(sram、nor闪存...)。fsmc有16根数据线和26根地址线,可用五根独立的片选脚,最多连接64mb内存。在wolfenstein 3d应用板上,这个接口用于驱动tft显示器和外接的4mb sram高速异步内存。键盘由通用io直接驱动。应用板为3v工作,采用3只1.2v电池与一只lm317可调稳压器的组合。
意法半导体提供一个非常有用的软件库,它包含很多stm32功能管理实例。在这次移植中,软件库用于编写tft显示器硬件的驱动。图5表示架构需要的项目,wolfenstein 3d文件夹包含两个子文件夹。
appli文件夹包含ide项目以及硬件驱动源码,如tft屏幕。该文件夹包含硬件应用板的说明(在我们这里是stm3210e-eval),它还包含了stm32库,用于管理电路板硬件和ide项目。wolfenstein 3d的源码用库函数作硬件驱动。
“source”文件夹包含了wolfenstein 3d的原始源码,源码中所有指令或函数都不与应用板硬件直接交互,子文件夹“portable”包括用于在游戏原始代码与代码执行目标硬件之间建立连接的函数。在我们这种情况下,我们还有一个子文件夹stm3210e-eval,这个文件夹包含调用应用板硬件的函数。 让我们看一下显示管理的例子。wolfenstein 3d源码包含一个vw_updatescreen函数,这个函数根据内部视频缓冲的内容刷新tft屏幕,于是需要驱动tft屏幕。因此,它必须在文件夹“portable/stm3210e-eval”中定义。vw_updatescreen函数会调用在文件夹“appli/ stm3210e-eval”中定义的基本函数(驱动)。
文件夹“source/portable/stm3210e-eval/”包含与编译器兼容的类型说明与定义。通过这种方法处理,就能够将一个目标的源码移植到另一个目标,而无需修改复杂的源文件。举个有用的例子,源码要转换到一个不同映射的stm32应用,它有不同的接口硬件,或编译器有改变。这时只需要为新的目标更新“appli/stm3210e-eval/”和“source/portable/stm3210e-eval/”文件夹中的约束文件。结果在图6中。它看似90年代的一款口袋机游戏。
采用c编写的老式pc游戏的源码现在仍能从互联网上获得。多亏有微控制器的强大性能和lcd显示器的集成,我们现在还能体验到这些游戏。
captions:

华为芯片困境的转机来了?
Sonnet发布具有11个端口的雷电4扩展坞
USB开发的这个错误你犯了吗
英国制造新型硅基可持续使用60年的LED灯泡
机器人“刷机”将带来市场的一轮洗牌?
怎样将一个开源游戏移植给一款32位微控制器
全自动增压泵型号及选型
SAS:length,klength,substr,ksubstr,ksubstrb的区别
移动宽带将会在2014年成为中国宽带市场主流
眼镜清洗机胶粘剂方案浅析、汇巨电子电器胶粘剂应用解决方案!
近日新闻:三星或关闭天津工厂;联电停止研发12nm以下工艺
剖析ST高精度MEMS倾角仪,竟然用上了机器学习?
AR+ADAS 如何改变汽车行业
RFID技术在新零售上可以如何应用上
STM32定时器基本计数原理解析
先进的清洗技术如何助力先进节点实现最佳晶圆良率
自力式压力调节阀的材料工作压力与温度介质
三星OLED屏幕再出新品 有望获2019年版iPhone采用
苹果公司iPhone中国市场销量低迷 需要专门为中国市场设计一款新手机
村田针对车载电源电路发布多层电感器“LQM18DH_70系列