Cross-compiling your eLua programs(交叉编译你的eLua程序)

交叉编译就是为了不同的硬件平台而在一个硬件平台上编译程序的过程。比如,在PC机上编译eLua二进制镜像文件,但是使用此二进制文件在eLua开发板上的过程就是交叉编译。Lua也能交叉编译。通过在PC机上交叉编译Lua生成最终的二进制文件运行在你的eLua开发板上你将获得下面两个重要的好处:

  • 速度:在eLua开发板上的Lua编译器不得不编译你的Lua源代码。而交叉编译的话只需执行你编译后的二进制文件。
  • 内存:如果你直接执行二进制文件,因为编译Lua为二进制文件所以对内存浪费很少。但是如果你想直接在eLua开发板上执行Lua源代码的话,你会收到“内存不足”错误,此时你可以通过编译源代码成二进制文件来运行在eLua开发板上来解决此问题。当然,编译大的Lua程序可能导致栈溢出,那样是很难发现错误所在的。

为了使用交叉编译,两个Lua目标(你的PC机和你的eLua开发板)必须能兼容(它们必须有相同的数据类型,同样的字长和同样的内存布局),这不总是正确的。举个例子,一些用于ARM目标的GCC工具链默认使用一种特别的方法来表示双精度数(被称作FPA格式),这样会造成PC机上一般的Lua编译器产生的二进制文件在一些ARM板子上没有用的。其它工具链没有此问题。其他目标(像AVR32)是大端格式存储的,与因特尔的PC机的小端存储方式相反。

为了克服上述的问题,最近一份关于“Lua 交叉编译的补丁”被发送到了Lua官方邮件列表。作为eLua工程的一部分它被进一步的修改为了兼容ARM目标。下面的陈述是怎么使用它(下面的指令在Linux下测试,没有在Windows下,但是它们做轻微的或者不做改动应该也能工作在Windows下)。

  • 首先确保你的PC机已经安装了下面一些软件(gcc.binutils,libc,headers...),当然还需要scons。好消息是你应该已经安装了他们,否则你将不能构建普通的eLua文件。
  • 进入eLua基本目录,输入下面的命令:scons -f cross-lua.py

此后你会在相同目录下得到一个叫做luac的文件。它基本和普通的Lua编译器相同,但是它有一些参数是专门针对不同的目标平台的。显示如下:

usage:

 ./luac [options] [filenames]. 

Available options are: 

- process stdin 

-l list 

-o name output to file 'name' (default is "luac.out") 

-p parse only 

-s strip debug information 

-v show version information 

-cci bits cross-compile with given integer size 

-ccn type bits cross-compile with given lua_Number type and size 

-cce endian cross-compile with given endianness ('big' or 'little')

 -- stop handling options

现在剩下的工作就是当使用编译器根据上面列出的数据选择正确的参数。下面的是分别针对不同ARM编译工具链而具体的参数

eLua image type Architecture Compiler Command

Floating point (lua) ARM7TDMI Cortex-M3 ARM966E-S arm-gcc 

./luac -ccn float_arm 64 -cce little -o <script.luac> -s <script.lua> 

Floating point (lua) ARM7TDMI Cortex-M3 ARM966E-S codesourcery 

./luac -ccn float 64 -cce little -o <script.luac> -s <script.lua> 

Integer (lualong) ARM7TDMI Cortex-M3ARM966E-S arm-gcc codesourcery 

./luac -ccn int 32 -cce little -o <script.luac> -s <script.lua> 

Floating point (lua) AVR32 avr32-gcc 

./luac -ccn float 64 -cce big -o <script.luac> -s <script.lua> 

Integer (lualong) AVR32 avr32-gcc ./luac -ccn int 32 -cce big -o <script.luac> -s <script.lua>

(注意的是某些时候你要为X86平台交叉编译eLua的话,就使用一般的lua编译器。)编辑时你可以省略掉-s参数,但是这会导致产生更大的二进制文件(因为你不使用-s的话Debug调试信息不会被丢掉)。

至少有三种方法你可以此二进制文件:

  • 把它写入ROM文件系统然后在其中执行它
  • 从shell中使用recv命令上传此二进制文件通过串口连接
  • 把它写入到SD/MMC中,并且你的开发板支持它的话,就可以从中执行它。

水平有限,如有错误,给出指正。

你可能感兴趣的:(Cross-compiling your eLua programs(交叉编译你的eLua程序))