Cross-compiling your eLua programs(交叉編譯你的eLua程序)

交叉編譯就是爲了避免同的硬件平臺而在一個硬件平臺上編譯程序的過程。好比,在PC機上編譯eLua二進制鏡像文件,可是使用此二進制文件在eLua開發板上的過程就是交叉編譯。Lua也能交叉編譯。經過在PC機上交叉編譯Lua生成最終的二進制文件運行在你的eLua開發板上你將得到下面兩個重要的好處:shell

  • 速度:在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:lua

 ./luac [options] [filenames]. spa

Available options are: debug

- process stdin 調試

-l list code

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

-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中,而且你的開發板支持它的話,就能夠從中執行它。

水平有限,若有錯誤,給出指正。

相關文章
相關標籤/搜索