2011年2月13日日曜日

eLuaをLPC1768で手軽に試してみる。mbedとLPCXpressoでお手軽eLuaライフ。

eLuaとはLuaプログラミング言語のフル実装版を組み込みの世界に持ち込むというもの。
Embedded Luaを略してeLuaと呼ばれています。


従来、スクリプト言語をマイコンに移植する場合、機能を削減した仕様で実装されることが多いのですが、eLuaは「フル実装」が一つの特徴になっています。
これによって例えば、パソコン上である程度の機能を実装した後で、ターゲットデバイス上で最終的なデバッグをするなど、様々な開発スタイルをとることもできます。

今回はeLuaをソースコードからコンパイルして実行させてみることにしました。
ホストの環境はUbuntu 10.10を使用しました。

まずはソースコードをSubversionリポジトリから取り出します。

svn checkout svn://svn.berlios.de/elua/trunk

ビルドにはmakeではなく、sconsを使います。
Ubuntu 10.10でsudo apt-get install sconsを試みましたが、私の環境ではパッケージのインストールができませんでした。
そこでhttps://launchpad.net/ubuntu/maverick/+source/scons/2.0.0-1からscons_2.0.0.orig.tar.gzをダウンロードしてインストールします。

sudo python setup.py install

sconsはツールチェインを自動的に見つけてコンパイルしてくれるので楽ちんです。
(うまく行くときは。)

ちなみにcpu=lpc1768とした場合、ターゲットボードはmbedが選択されるようになっています。

scons cpu=lpc1768

上記でビルドが完了すると思います。
elfができますので、binに変換します。

arm-none-eabi-objcopy -O binary elua_lua_lpc1768.elf elua_lua_lpc1768.bin

これで準備完了。
まずはmbed LPC1768にコピーして試してみます。
ターミナルにはminicomを使用しました。
eLua側の通信速度設定はデフォルトで115200になっています。
minicomもこれに合わせます。


mbedのリセットボタンを押して以下のような表示が出てくれば動作しています。

eLua v0.8  Copyright (C) 2007-2011 www.eluaproject.net                          
eLua# 

試しにlsと打ってみてください。


eLua# ls /rom Total on /rom: 0 bytes /semi MBED.HTM 340 bytes ELUA_L~1.BIN 189860 bytes LIFE.LUA 2684 bytes Total on /semi: 192884 bytes eLua#

/romと/semiというディレクトリが見えます。
/semiはmbedのローカルファイルシステムです。

LIFE.LUAはライフゲームのスクリプトです。
試しに実行してみます。

eLua# lua /semi/LIFE.LUA

テキストベースのライフゲームが実行されます。
このライフゲームは2000世代までになると終了するようになっています。


それではこれをLPCXpresso LPC1768上で実行してみます。

LPCXpresso LPC1768上には外付けのフラッシュストレージは存在しません。
先程の/semiに該当する部分です。
そこでプラットフォーム設定からこれを除外します。
trunk/src/platform/lpc17xx/platform_conf.hの#define BUILD_SEMIFSをコメントアウトします。


// #define BUILD_SEMIFS

実行したいファイルはtrunk/romfsに予めコピーしておきます。
再度コンパイルを実行して書き込みます。
出来上がったバイナリはLPCXpressoの128KB制限を超えてしまいます。
そこでここではJTAGKey2P + OpenOCDで書き込みます。



shinta@greenpad:~$ telnet localhost 4444
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> halt
> flash probe 0
flash 'lpc2000' found at 0x00000000
> flash write_image erase /home/shinta/Projects/elua/trunk/elua_lua_lpc1768.bin
auto erase enabled
wrote 196608 bytes from file /home/shinta/Projects/elua/trunk/elua_lua_lpc1768.bin in 28.987883s (6.623 KiB/s)


それでは確認してみましょう。
と思いましたが・・・
LPCXpressoのデバッガとターゲットを切り離してJTAGKey2Pを接続したのでシリアルが使えません。

あ、なるほど。

LPCXpressoのデバッガとターゲット間が切り離し辛いにも関わらず2.54mmピッチの間隔しかあいていません。
かといって、安易に切り離してしまうと、シリアル経由で何かやりたい時に不便です。
これを考えると、半田ジャンパを取り除いた後で2列ピンヘッダを立てると良いかもしれません。
書き込み時はジャンパを取り除いて他のツールでできるし、デバッグはジャンパを付けてシリアル経由でできます。

それでもジャンパを付けたり取ったりするのは面倒ですね。
やっぱりシリアルインターフェースを付けますかね。

2 件のコメント:

  1. You don't need the arm-none-eabi-objcopy line.
    Just add the "prog" word to the scons line:

    scons cpu=lpc1768 prog

    and it will generate the .bin for you =)

    返信削除
  2. Hi. Thiago-san
    Oh. Sounds great.
    Thank you for your comments.
    Shin. :)

    返信削除