新发布的AngelScript 2.30.1在Linux和Android上添加了MIPS CPU支持

上周,AngelScript负责人安德鲁•琼森在GameDev.net上发表声明,宣布当下流行的脚本语言(2.30.1)推出了新版本,并通过Creator CI20微机,增加了对MIPS Release 2 CPU的支持功能。为使对基于MIPS的AngelScript感兴趣的开发人员获取更多资讯,我们联系了安德鲁,并向他咨询了详细的信息。

为Linux基于MIPS 的本地调用规范添加支持

当我开始操作基于MIPSAngelScript的Linux版本时,第一步就是对ABI上找到的文档进行一些研究。我找不到任何最新的官方技术规范,但却从以下链接中找到了一些有用的信息:
• 系统V应用二进制接口—MIPS RISC处理器附录
• MIPS调用规范总结
• MIPS EABI 文件

但如你所见,这些文件已经很久未更新,且甚至没有一份文件提及到C++是如何工作。

接下来的一步便是确定哪些编译器的预定义适合将MIPS自动检测为目标处理器,同时又可对库进行编译。在GNUC上,这一步可通过运行以下命令完成:
$ echo . | g++ -dM -E –

这可打印出所有默认的预定义,其中一些还可以清楚识别OS和CPU。我选择以下设置来为基于MIPS的Linux识别GNUC编译器:
#define __GNUC__ 4
#define __linux__ 1
#define __mips__ 1
#define _ABIO32 1

随后,我便使用以上代码在as_config.h页眉文件中配置目标平台。我将99%的平台相关配置放在AngelScript库中,以尽可能降低对其余代码的混淆。

早在2006时,由于马努•埃文斯(来自制造厂商)作出的贡献,AngelScript在便携式游戏站上已可支持MIPS,因此,如果这段代码也可用于Linux,那么进行第一个测试便是有意义的。尽管编译完毕,但不幸的是我却没有较好地运行回归测试套件,并且便携式游戏站上使用的ABI与Linux使用的不相同。

因此,我不得不在ABI上做一些逆向工程,以找出差异之处。我编写了一些简单的函数来生成汇编码,如下:
$ g++ -S -c test_cdecl_return.cpp

函数如下:
asINT64 reti64()
{
return 0x102030405L;
}

生成了以下汇编码:
.cfi_startproc
.set nomips16
.ent _ZN15TestCDeclReturnL6reti64Ev
.type _ZN15TestCDeclReturnL6reti64Ev, @function
_ZN15TestCDeclReturnL6reti64Ev:
.frame $fp,8,$31 # vars= 0, regs= 1/0, args= 0, gp= 0
.mask 0x40000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-8
.cfi_def_cfa_offset 8
sw $fp,4($sp)
move $fp,$sp
.cfi_offset 30, -4
.cfi_def_cfa_register 30
li $2,33751040 # 0x2030000
ori $2,$2,0x405
li $3,1 # 0x1
move $sp,$fp
lw $fp,4($sp)
addiu $sp,$sp,8
j $31
nop
.set macro
.set reorder
.end _ZN15TestCDeclReturnL6reti64Ev
.cfi_endproc

有了先前的研究,加之又找到MIPS指令参考,那么以上的汇编代码则不难理解,即函数返回的64位值在返回前将加载到寄存器$2和$3中。

使用相同的技巧可以看到寄存器如何加载函数调用参数。

有了先前专门为验证平台可移植性而写的测试案例,我可以对代码进行测试。测试可从简单的调用函数,再转向越来越复杂的脚本。最简单的测试是调用不接受任何参数且不返回任何值的全局函数。接下来的测试便是添加传入一个整数值,然后依次添加2个整数值、3个整数值等;之后测试添加返回整数值。

一旦测试通过,测试案例要添加一个在独立的寄存器组中使用的浮点值,之后再混合不同大小和顺序的基元来获取合适的寄存器及使堆栈对齐。

然后,回归测试进入测试传入对象阶段,将测试传递对象的值代入函数,并返回值。这里的测试使用了各种大小不同的对象,且成员不同,行为也不同,因为这些操作组合可以使ABI决定传递对象是在寄存器上、堆栈上还是在堆上。到这一步止,MIPS ABI都非常简单(目前为止,我操作ABI最糟糕的情况是PowerPC ABI。PowerPC ABI由成员进行了分解,以根据对象使之在不同的CPU寄存器上传递到每个成员)。

最后,测试还对不同类型的方法如何工作进行了验证,包括:标准的非虚拟类方法、虚拟类方法、多重继承类方法等。

为平台可移植性验证编写的所有测试一旦通过,我便开始运行完整的回归测试套件。

这当然涉及到大量的反复试验,且调试会话会通过逐步执行代码的指令来验证CPU寄存器在特定的场景中是如何进行修正等。

总言之,这项工作并没有超出标准的工作周时间,我只是利用零散的几个晚上和周末来完成,当然,这也是由于AngelScript是我的兴趣所在。

Android的使用使Ci20大放异彩

要在Creator Ci20上安装Android,需遵循elinux.org上的指导。然而,从他们所推荐的编写图像文件到SD卡的win32diskimager工具,于我而言都并不适用。由此,我改用免费的ImageUSB工具。这款工具运行非常顺畅(且其操作更人性化)。

Android安装完毕并在Ci20上运行时,有必要做一些适当的调整,使未知的APP及调试APP得以进行安装。为此,我参考了以下指南:
• 如何使Android的未知资源在安卓市场之外安装APP
• 启用设备上的开发人员选项

当然,还需要将Ci20开发板连接到PC上,这样便可轻松部署APP。本文也展示如何来做以上工作。

为Android基于MIPS 的本地调用规范添加支持

添加Android支持于我而言是完全不一样的工作体验,但这也是由于我缺乏Android方面的经验。我从未写过Android的APP,由此我不得不大量涉猎,学习如何使用Google提供的各种不同的工具。所幸的是,Android SDK和Android NDK的相关文档非常全面,减轻了我不少的工作负担。开始在Android设备上运行APP时,需要完成大量的前期准备工作,特别是如果用C++编写及需要使用NDK的APP时更是如此。

为测试Android版本库,我使用的回归测试套件与在Linux及其它平台中使用的套件相同。其使用轻量级JAVA shell进行了覆盖,没有任何图形界面,且其标准输出流路由到了Android logcat系统日志。

尽管NDK文件中提到可以调试本机代码,但我却没有将其成功运行。不过我没必要进行调试,因为APP运行进展顺利时,Android使用的是与Linux完全相同的MIPS ABI。

原文链接:
http://blog.imgtec.com/powervr-developers/angelscript-2-30-1-is-out-adds...

--电子创新网--
粤ICP备12070055号