用C在GBA上写光线追踪(0)配置开发编译环境
前段时间用C#写了一个光线追踪程序,可以渲染圆球,平面这种基本图形,反射,光照,阴影,都大致尝试做了一下。
↑ C#实现的光线追踪
↑ GBA上C实现的光线追踪
然而,在我打算继续深入优化的时候,我失去了我的好帮手强强电脑,换成了超极本。看来继续做技术密集型光线追踪是不行的了。就在这时,我看到了一些GBA的开发文章,我又刚好有一台GBA,于是我产生了一个大胆的想法——在GBA上实现光线追踪。GBA架构清晰简明,入手门槛低,而且还有一个官方的编程指南,很适合我这种人折腾。
在写程序之前,我要先花点时间了解GBA。GBA(Game Boy Advance)是任天堂2001年的推出的彩色游戏掌机,它的前身是黑白掌机GB。
GBA有一个16位色深,240x160的液晶屏幕,初代无背光。
它有一个频率为16.78Mhz的32位RISC类型的CPU(ARM7TDMI)。虽然和现在的几GHz的处理器比起来实在太低,但只要使用得当,还是可以做出很多东西的。
除此之外,它机身的内存有两部分,一个是32KB的内部工作内存,还有一个256KB的外部工作内存。这两个内存都是掉电数据就没了的ROM。插入机身的游戏卡容量最大32M,游戏卡大部分内存是只读的,但一部分可擦写储存游戏存档。
详细的功能和GBA的运行原理我就先不讲了,我们从最迫切的配置开发和编译的环境开始,之后再慢慢介绍功能。
本来我想直接从写代码开始讲的,但是现在网络上GBA的中文资料很少,而GBA简单的硬件又很适合学习系统底层和嵌入式开发,所以我还是详细的讲述我了解到的所有知识,希望能吸引更多人了解并入门GBA编程。
更好的教程:TONC教程:建立开发环境
开发前的准备
Windows系统的电脑,因为我只有这个。
GBA主要使用C语言,虽然也许能找到C++编译到GBA的编译器,但GBA上运行的是裸机代码,C速度快,也适合和底层交互。因此要想玩好GBA,要熟悉C语言,了解系统底层原理,不过即使不太会也没关系,我也不会,用着用着 踩多几个坑就熟悉了。
为了方便测试,当然要有一个GBA的模拟器,这样就不用每次都把程序放到真机上运行了。我推荐mGBA,这是一个新开发(2013年)的模拟器,开发它的人希望兼顾准确性和速度。它不仅可以显示地图,精灵,调色板,还可以使用GDB调试(虽然我还不会)
如果你想在真机上运行,可以采用两种方法。1、使用flash烧录卡,将程序写入到烧录卡里就可以插入到GBA上运行。但烧录卡一般比较贵,即使是GBA完全不流行的现在也要150~1000元。2、使用multiboot线,直接把程序送到机子256kB的内存里,不用插卡就能运行。这其实是利用了GBA多人连线游戏的功能,这个功能可以让一台机子通过连接线把小游戏发给其他机子,这样大家就可以一起玩小游戏了。我们通过把电脑假装成一台主机,就可以实现传输自己的程序。这种特制线一般买不到,需要的话可以自制,不太难成本也低。
要用什么编译器?
对于这种嵌入式的开发,最重要的是要有一套工具链。工具链是指编译器、连接器、解释器和调试器这些组成的一套工具,它可以把我们的代码编译成在特定机器上运行的机器代码。不同的机器的工具链一般不通用,例如ARM公司就提供了它自己的产品的工具链。
ARM的官方编译器
GBA用的就是ARM的CPU,因此可以从ARM那里找到工具链,但是时代久远,有点难找,而且可能是收费的。
gcc编译器
除此之外我们可以使用gcc的编译器,gcc是免费开源的编译器,是开源计划里的重要组成部分,这个东西大概程序员都知道,程序员们希望世界上所有程序都是开源的,可以自由修改,于是他们一起做了一个开源的编译器(gcc),然后通过编译器做了开源的系统(linux),然后在系统上写了开源的软件。一般的gcc是编译到linux的,但也有编译到ARM的gcc-arm。我们只需要针对GBA配置一个就可以了,当然我不会,不过一些GBA爱好者已经为我们做好了。
DevKitAdv:这个比较旧,需要使用.bat脚本管理编译。
devkitPro:整合了多个游戏机的工具链,支持GBA,NDS,PSP,NS等,可以按需下载,有这个新的就没必要用旧的了。这个工具内有一些makefile模板,可以使用makefile方便的管理要编译的内容,输入make就可以编译,很有了解的必要。
这些工具链中也提供了用于GBA的库libgba,包含了常用类型和数学运算库,内存操作,中断系统等一些常用的功能。
安装工具链
我这里介绍devkit Pro的安装:
去论坛里下载devkit Pro的Windows安装包,名称是devkitProUpdater,选择安装位置(建议C盘根目录),点选需要的组件(GBA),之后就会开始联网下载。
安装之后打开安装目录,看看包含什么:
devkitARM:这就是工具链
examples:示例文件,里面有图像、音频演示,xboo连接线项目,还有一个空的项目模板。
libgba: devkitPro的GBA库;
libtonc:tonc教程的作者写的GBA库。
tools:一些小工具,例如修复rom头部,图像转换。
sys2等一些安装文件。
测试工具链
现在来测试能不能正常使用工具链。
打开examples->gba->graphics->SimpleBGScroll,在这里打开cmd(shift+右键菜单)(win10下是powershell)
在cmd下输入 make ,看看有没有编译出一个build文件夹和.gba的rom文件。
如果成功了,恭喜你,可以开始写代码了!
错误的解决方法
如果有错误,我这里列出了2种可能的原因:
1、cmd/PowerShell的目录地址不在 \divkitPro\examples\gba\graphics\SimpleBGScroll。
2、make指令是调用工具链里make.exe,如果没有添加Path,系统会找不到这个程序。
打开环境变量的窗口,检查是否已经配置了变量。正常情况下,应该有四个:1) 在Path里的“c:\devkitPro\msys2\usr\bin”,2) 名称为DEVKITARM的“/opt/devkitpro/devkitARM”,3) 名称为DEVKITPPC的“/opt/devkitpro/devkitPPC” ,4) 名称为DEVKITPRO的“/opt/devkitpro”。
如果检查无误还是不行,可以试试卸载重装orz
配置开发环境
我也不知道怎么配置一个既可以一键编译,又可以进行调试的开发环境。我只能介绍一下我摸索出来的勉强能用的方法。
我使用的是VisualStudio 2019,好像很多人觉得vs不适合嵌入式和Linux开发,但我vs用惯了,能不换就不换。vs2017后加入了Linux的开发组件,我觉得还是很好用的。如果你使用的不是vs,可以直接看文章末尾的TONC教程和附录里的其他方法。
首先我们需要安装VS2019的c/c++开发组件,还有Linux开发组件(为了可以建立makefile项目)
安装完成之后启动vs,新建一个makefile项目(翻译为生成文件项目)。
之后我们需要在项目属性的NMake里设置include文件的位置和make等命令。
包含搜索路径 设置为 /divkitPro/libgba/include和/libtonc/include的地址。
生成命令行 输入 make
最后一步,我们到devkitPro的examples里把示例文件的makefile复制到我们的项目根目录下。
生成
如果源文件里已经有main.c了,现在按生成->生成*你的项目名称* 或者Ctrl + B 应该就可以编译代码生成.gba文件了。
新建源文件
之后如果我们要新建一个源文件,在解决方案资源管理器的源文件里新建项,名称为xxx.c ,后缀为c,目录为项目里的/source
新建头文件
解决方案资源管理器的头文件里新建项,选择.h文件,并新建一个include文件夹。如果新建了include文件夹,要记得把这个文件夹地址加入项目的包含搜索路径。此外我们还要修改添加makefile里的include路径,不然编译器不知道。
由于makefile已经写好了模板,所以我们只需要在INCLUDES := 后面写include,他就会自动识别为项目目录/include。如果项目目录里有多个include文件夹,可以在include后加空格,再写名称。
makefile模板里有3处include地址:
1、我们写的 INCLUDES := xxx ,是项目目录里的。
2、devkitPro自带的两个库里的include
3、项目编译后产生的Build目录
到这里应该已经介绍完配置环境的问题了,之后要学的就是如何编程使用GBA上的硬件。在下一篇文章之前,我先推荐一些对学习GBA编程很有帮助的内容。
开发资料推荐
GBA编程手册。这个好像是官方的手册,中文版翻译到第六章就没了。里面说明了GBA的硬件和功能,相当于GBA的说明书,应该是最有用的资料。
GBA教程TONC。非常全面,很有深度,但有些地方难度也比较大。这个教程也讲了如何配置环境,包括visual c++ 和 NP2编辑器的配置。此外还讲了makefile的原理和编写方法。(可惜中国打不开)
GBA开发网站。存了很多开发的软件和资料,还有别人做好的游戏。
下一篇文章我会再讲讲GBA的硬件和基本运行原理,之后就开始写光线追踪程序。
如果有机会我会再写一篇文章讲讲如何调试GBA程序。
附录
用C在GBA上写光线追踪(0)配置开发编译环境的更多相关文章
- 在cocos code ide的基础上构建自己的lua开发调试环境
对于一种语言,其所谓开发调试环境, 大体有以下两方面的内容: 1.开发, 即代码编写, 主要是代码提示.补齐, 更高级一点的如变量名颜色等. 2.调试, 主要是运行状态下断点.查看变量.堆栈等. 现在 ...
- WebStorm 8.0安装LESS编译环境的教程
WebStorm是一个非常棒的Web前端开发编辑器,被程序猿们成为“最智能的JavaScript IDE”.对HTML5.Bootstrap框架.Node.js等都有完美支持.目前最新版本为WebSt ...
- 如何在Windows系统上基于Sublime搭建Python的编译环境
刚刚接触到Python,直接在计算机上编译时不能正确的运行,所以将一些有关编译环境调试的知识总结了一下. 环境搭建: Python在 windows系统上编译的时候可能会出现一些编译无法运行的情况,我 ...
- VC++6.0 配置CppUTest测试环境
最近看<软件项目成功之道>,书中无数次提及到“单元测试”对于项目成败的重要性,看到同事将CppUTest用于Linux动态库测试,于是在VC++6.0环境下搭建一个基于CppUTest的单 ...
- ubuntu18+gtx1060 +cuda9+cudnn-v7+opencv3.1.0 配置深度学习环境
将笔记本的ubuntu系统更新到18版本后重新配置深度学习环境,在此记载方便日后参考 具体配置为 Ubuntu18.04+gtx1060+opencv-3.1 第1步 安装依赖包 sudo apt-g ...
- [dart学习]第一篇:windows下安装配置dart编译环境,写出helloworld
前言 博主非科班出身,平时多用C语言,最近想了解学习一门第二语言,看上了可用于移动开发的目前还小众一点dart,准备用一段比较长的时间来慢慢学习.理解. 关于dart语言不再详细介绍了,大家可以访问 ...
- 搭建Hadoop2.6.0+Eclipse开发调试环境(以及log4j.properties的配置)
上一篇在win7虚拟机下搭建了hadoop2.6.0伪分布式环境.为了开发调试方便,本文介绍在eclipse下搭建开发环境,连接和提交任务到hadoop集群. 1. 环境 Eclipse版本Luna ...
- 搭建Hadoop2.6.0+Eclipse开发调试环境
上一篇在win7虚拟机下搭建了hadoop2.6.0伪分布式环境.为了开发调试方便,本文介绍在eclipse下搭建开发环境,连接和提交任务到hadoop集群. 1. 环境 Eclipse版本Luna ...
- CAS 4.0 配置开发手冊
1 下载 地址http://downloads.jasig.org/ cas-server-4.0.0-release.tar.gz cas-client-3.3.3-release.tar.g ...
随机推荐
- windows下安装nginx和基本配置
1.下载并安装nginx 到nginx官网上下载相应的安装包,http://nginx.org/en/download.html: 下载之后进行解压,将解压后的文件放到自己心仪的目录下,如下图所示: ...
- P中值选址问题的整数规划求解
P中值选址问题的整数规划求解 一 .P-中值问题 p-中值选址问题是一个常见的选址问题. 问题是给定I个需求结点和J个待选设施地点, 要求选择p个地点建立设施, 使得运输成本最低. 下面是个英文的问题 ...
- 比较一下inner join(可直接简写为join)和where直接关联
SELECT * FROM A ,B WHERE A.ID = B.ID 是比较常用的2个表关联.之前一直用这个,后来换了家公司发现这家公司的报表大多数都是用inner join,稍微研究了一下.查阅 ...
- Batch批处理获取当前时间
这不是一个新问题,但是由于网上写的都是针对自己的电脑设置,没有通用性,而我呢,又需要在不同电脑上使用,因此,这命题一个问题了.其实也没有什么好说的,直接上代码. @ECHO OFF set split ...
- 导入maven项目pom报错
打开window->preferences->maven->user settings更换settings.xml即可
- idea2017建立jsp工程及tomcat等配置
1:建立工程,选择Java Enterprise,可能需要选择tomcat路径和jdk路径: =============================== 以下作为第二种方式参考: 1:创建新工程 ...
- SpringBoot 源码解析 (六)----- Spring Boot的核心能力 - 内置Servlet容器源码分析(Tomcat)
Spring Boot默认使用Tomcat作为嵌入式的Servlet容器,只要引入了spring-boot-start-web依赖,则默认是用Tomcat作为Servlet容器: <depend ...
- 力扣(LeetCode)平方数之和 个人题解
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c. 示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 示例2: 输入: 3 ...
- python:爬虫2——隐藏自己
一.添加浏览器 方法一: head['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, li ...
- 初识JVM内存模型
计算机内存模型 在程序运行时,CPU通过访问主存获取数据,但随着CPU的快速发展,CPU访问速度越来越高,硬件无法满足CPU的条件下,大多内存加入了高速缓存机制,不同CPU都有对应的多级(一般为三)缓 ...