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

发布者:EEWorld资讯最新更新时间:2009-05-27 来源: EEWORLD关键字:源文件  微控制器  功率  屏幕  驱动 手机看文章 扫描二维码
随时随地手机看文章

  随着微控制器性能增强,已经有可能用它们执行一些在90年代还需要PC处理能力的程序,而游戏领域的应用受这一进展影响很大。现在可以在某种移动应用(包含图形LCD和一个32位 ARM微控制器)中实现第一个PC上的3D游戏。本文将阐述如何将一个开源PC游戏的代码移植到一款有适当源文件结构的微控制器上。

  在上世纪90年代,游戏开始在计算机世界中蔓延。我还记得第一次玩Wolfenstein 3D,那是第一款3D的PC射击游戏。它由IdSoftware于1992年开发,是Doom的前身。Wolfenstein 3D证明PC的图形能力已足以满足这种类型3D动画的开发。90年代很多十几岁的年青人都会记得Wolfenstein 3D,因为这是第一款把3D世界带到他们PC上的游戏。90年代中期它的源码在互联网上公开,现在还能找到。现在我想再玩这款游戏,但不是在我的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位宽),需要选择一种能够驱动这种屏幕的微控制器。

[page]

  如何更顺利地移植源码?

  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,这个文件夹包含调用应用板硬件的函数。

[page]

  让我们看一下显示管理的例子。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:



关键字:源文件  微控制器  功率  屏幕  驱动 引用地址:如何将一个开源游戏移植给一款32位微控制器

上一篇:NXP先发制人 首款Cortex-M0内核MCU亮相
下一篇:恩智浦推出业界功耗最低的CortexTM-M3微控制器

推荐阅读最新更新时间:2024-03-16 12:25

汽车电机控制:全新MOTIX™ MCU 嵌入式功率IC系列配备CAN FD接口
汽车电机控制:全新MOTIX™ MCU 嵌入式功率IC系列配备CAN FD接口,提供更快的通信速度和更高的性能 【2023年8月11日,德国慕尼黑讯】英飞凌科技股份公司推出TLE988x和TLE989x系列,进一步扩大其全面且成熟的MOTIX™ MCU嵌入式功率IC产品组合。 英飞凌的系统级芯片解决方案将栅极驱动器、微控制器、通信接口和电源集成到一颗芯片上,实现了最小的占板面积。全新TLE988x 和TLE989x 系列具有更高的性能,其特点是以CAN(FD)作为通信接口。新型IC已通过 AEC Q-100 认证,是车身、舒适性和热管理应用中的车用有刷直流电机和无刷直流电机控制应用的理想选择。 英飞凌科技高级副总
[汽车电子]
汽车电机控制:全新MOTIX™ <font color='red'>MCU</font> 嵌入式<font color='red'>功率</font>IC系列配备CAN FD接口
双锁存与PWM LED驱动IC拍照效果浅析
随着智能手机的普及和拍照功能的日渐强大,越来越多客户反映使用了双锁存IC的显示屏拍照效果很差。集创北方高性价比PWM IC系列产品ICN205X,可以解决双锁存产品拍照差的痛点,让显示屏在相机镜头下保持完美显示效果。那么,与双锁存IC相比,ICN205X的拍照效果究竟有何提升?下面通过一组测试来观察。下面就随半导体小编一起来了解一下相关内容吧。 选用目前最火爆的租赁P4.81户内外通用产品做测试平台,分别对比某行业主流双锁存IC与ICN205X的拍照效果。为了确保测试的公平和客观性,我们首先将亮度和色温调整到完全一致,分别在不同的快门速度下进行拍照对比。另外要说明的是,本文所有图片均选用原图,未经任何处理。 应用场景亮度范围相
[半导体设计/制造]
STM32系列MCU解决方案展示
  STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。按性能分成多个不同的系列,满足不同应用的不同需求。由于STM32系列在开发工具的成本和广泛度;存储器的种类、规模、性能和容量;以及各种软件获得的难易度方面都做了非常出色的准备,因此迅速在市场上取得巨大成功,成为最受欢迎的工业及消费市场应用的MCU产品系列之一。   STM32系列 E-METER产品方案介绍   友尚集团   与传统的机械式电能表相比,eMeter能够更快、更便宜、更可靠地报告用电量。友尚推出ST于智能电表上的运用方案,整个方案中的架构主要包括计量芯片、MCU和外围芯片三个部分。   计量芯片   单相表
[单片机]
STM32系列<font color='red'>MCU</font>解决方案展示
AT89C51单片机在无线数据传输中的应用
一般的数字采集系统,是 通过 传感 器将捕捉的现场 信号 转换为电信号,经模/数转换器ADC采样、量化、编码后,为成数字信号,存入数据 存储器 ,或送给微处理器,或通过无线方式将数据发送给接收端进行处理。无线数据传输系统就是 样一套利用无线手段,将采集的数据由测量站发送到主控站的设备。 1 系统组成 系统组成如图1、图2所示。   系统由测量站和主控站两部分组成。测量站主要完成对现场信号的采集、存储,接收遥控 指令并 发送数据。主控站的主要工作是发送遥控指令、接收数据信息、进行数据处理和数据管理、随机显示打印等。 2 AT89C51与数字电台的串行通信 Atmel公司的AT89C51单片机,是一种低功耗、高 性能 的、片
[单片机]
S3C6410开发板按键驱动代码分析及测试代码分析
在本文中,我们对S3C6410开发板按键驱动代码的实现过程进行分析,然后通过一个实例对按键功能进行测试。在本文的资源中包含了设备驱动的源码和测试的源码。 一、设备驱动源码分析 按键的设备驱动主要实现了模块的初始化、模块的卸载、设备打开、设备关闭、设备读取、设备阻塞功能。 1、模块初始化 模块的初始化的源码如下所示。 static int __init dev_init(void) { int ret; ret = misc_register(&misc); printk (DEVICE_NAME tinitializedn ); return ret; } 这段代码只实现了一个功能,就是使用mi
[单片机]
基于单片机的HT1621液晶显示系统设计方法
  HT1621液晶显示控制器是多功能全自动智能开关的显示部件,能实时、准确、在线监控供电线路的运行情况。一旦线路出现漏电、过载、短路、过压、欠压和缺相时,智能安全用电开关能立刻启动保护程序,并显示在HT1621液晶显示控制器上。在智能化楼宇、中高档家庭住宅、电力系统、工矿企业、国家重点消防单位以及石油化工、文教卫生、金融、电信等领域。基于单片机的HT1621液晶显示控制器应用广泛。本文详细讨论段式液晶模块HT1621D与单片机STC89C52的一种硬件接口电路和软件编程方法。   1 HT1621液晶模块与STC89CS2单片机   HT1621是128点内存映像和多功能的LCD驱动器,HT1621的软件配置特性使它适用于多种
[单片机]
基于<font color='red'>单片机</font>的HT1621液晶显示系统设计方法
LED驱动电源的2种分类方式及其特性比较
LED灯带所采用的LED必须要配驱动电源,不同环境下的LED对于驱动电源的要求不同。目前市面上的驱动电源种类也比较多,下面根据东莞光虹电子所采用的驱动电源,按照电源的驱动方式和电路结构,对驱动电源进行不同的分类及电气特性比较。 1、按驱动方式可分为两大类:(1)恒流式: a、 恒流驱动电路输出的电流是恒定的,而输出的直流电压却随着负载阻值的大小不同在一定范围内变化,负载阻值小,输出电压就低,负载阻值越大,输出电压也就越高; b、 恒流电路不怕负载短路,但严禁负载完全开路。 c、 恒流驱动电路驱动LED是较为理想的,但相对而言价格较高。 d、 应注意所使用最大承受电流及电压值,它限制了LED的使用数量;(2)稳压式: a、 当稳压电路
[电源管理]
八位微控制器有哪些可以节约代码空间的代码优化技巧?
本文将介绍一些优化技术,帮助设计人员节约多达 10% 的代码空间,从而让容量有限的程序存储器支持更多新特性和补丁。 良好的操作方法 许多程序员在 32 位处理器上学习编写软件,如 Intel 的 Pentium 处理器或某种 ARM 平台。不过,嵌入式领域的软件编写需要不同的思路。在 32 位 CPU 上,存储比特位的最佳方法通常是使用 32 位变量。对 8 位处理器而言,最好的办法就是采用单字节。像增强型 8051s 等某些处理器可能提供特殊的 1 位变量。 嵌入式处理器通常会超出标准的哈佛架构将存储器分散到不同的存储器空间中,有的相互重叠,有的又是相互分离。例如,8051 中常见的存储器空间包括 CODE、XDATA、DA
[单片机]
八位<font color='red'>微控制器</font>有哪些可以节约代码空间的代码优化技巧?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved