用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 ...
随机推荐
- js中关于执行的顺序及变量存放方式的一点记录
Markdown在线编辑器 - www.MdEditor.com 1 首先关于数据类型,有基本数据类型,和引用数据类型 基本数据类型有:number,string,boolean等:引用数据类型一般指 ...
- 伪紫题p5194 天平(dfs剪枝)
这题作为一个紫题实在是过分了吧...绿的了不起了.—————————————————————————— 看题第一眼,01背包无误.2min打好一交全屏紫色(所以这就是这题是紫色的原因233?) re原 ...
- Project Euler 56: Powerful digit sum
一个古戈尔也就是\(10^{100}\)是一个天文数字,一后面跟着一百个零.\(100^{100}\)更是难以想像的大,一后面跟着两百个零.但是尽管这个数字很大,它们各位数字的和却只等于一.考虑两个自 ...
- python中字符串的常见操作(一)
如有字符串: str1 = '192.168.1.1' str2 = 'asdfghjk' str3 = 'Asd fg hj ki' str4 = ' ' str5 = '' 以下是常见操作:# i ...
- 使用vue-cli搭建项目开发环境
一.前言 本篇文章主要是使用vue-cli搭建一个简单的vue项目,这个项目在其他文章中作为代码演示的环境会一直使用. 注意:默认大家的电脑已经安装nodejs,所以这里不总结nodejs的安装. 二 ...
- maven打包记录1
在需要打包的项目目录下找到pom.xml文件 (过程中可能遇到 :-Dmaven.multiModuleProjectDirectory system property is not set. Che ...
- UML简明使用
1.继承 空心三角+实线 2.实现接口 空心三角+虚线 3.关联 箭头+实线 4.聚合 空心菱形+实线+箭头 5.组合 实心菱形+实线+箭头 6.依赖 虚线+箭头 7.关联.聚合.组合.依赖的区别 关 ...
- 【持续更新】【pat】pat刷题技巧记录
修改code completion快捷键位CTRL+ENTER,帮助提示函数名称 修改命令行提示符的属性,开启快速编辑模式,方便调试 添加c++11语言标准支持 开启代码调试功能 对输入的字符串进行切 ...
- C++中对C的扩展学习新增语法——lambda 表达式(匿名函数)
1.匿名函数基础语法.调用.保存 1.auto lambda类型 2.函数指针来保存注意点:[]只能为空,不能写东西 3.std::function来保存 2.匿名函数捕捉外部变量(值方式.引用方式) ...
- nyoj 66-分数拆分 (Java,暴力)
66-分数拆分 内存限制:64MB 时间限制:3000ms 特判: No 通过数:7 提交数:9 难度:1 题目描述: 现在输入一个正整数k,找到所有的正整数x>=y,使得1/k=1/x+1/y ...