mruby with ZRouter.org
mrubyは組み込みを対象にしているので、クロスビルドの機能があります。またhttpなどの通信スタックも用意されています。
FreeBSDのルータ向けビルドシステムのZRouterとmrubyのクロスビルドを組み合わせて環境を作ります。ZRouterとmrubyは極めて親和性が高いです。
もちろんターゲットの機器はハードオフで入手した無線ルーターのジャンクを利用します。
デフォルトでprofileのmrubyを選択すれば素のmruby入りがつくれます。ビルドにはホスト側にrubyとbisonをpkgでインストールする必要があります。ネットワークアクセスが出来るようにビルドしてみます。
ports/lang/mruby/build_config.rbをベースにzrouterのターゲットに以下を入れます。
conf.gem :git => 'https://github.com/mattn/mruby-uv.git'
conf.gem :git => 'https://github.com/mattn/mruby-http.git'
conf.gem :git => 'https://github.com/luisbebop/mruby-polarssl.git'
conf.gem :git => 'https://github.com/matsumoto-r/mruby-simplehttp.git'
conf.gem :git => 'https://github.com/matsumoto-r/mruby-httprequest.git'
上記のmebgemsに依存したライブラリなどをvendor/Buffalo/vendor.mkなどに以下を追加します。
WORLD_SUBDIRS_PORTS+=${ZROUTER_ROOT}/ports/devel/libuv
WORLD_SUBDIRS+= secure/lib/libcrypto
WORLD_SUBDIRS_LIB+=librt libdl
libuvのビルドのためにホスト側にautoconf,automake,libtoolをpkgをインストールしておきます。
修正した、build_config.rbを環境変数のMRUBY_CONFIGに設定してmrubyを追加してZRouterのビルドを流すとその設定でmrubyがビルドされイメージに入ります。
これでインターネットへのアクセスはできたので、LEDやセンサーを使えるようにします。FreeBSDではGPIOが使えるので、これに接続する事にします。ネットで検索してもFreeBSDのGPIOをサポートしたモジュールはなさそうだったので作ってみました。
こんなスタックができました。このスタックを一発でビルドできるZRouterはほんとよくできていると思います。
ターゲットの機器はFlashが8M(空き2Mくらい)でRAMが32Mあれば十分使えます。
後日追記:i2cも使えるようにしてみました。mrubyでi2c
下記のフィブナッチ(Fibonacci)コードでベンチマークとってみました。
def fib n
return n if n < 2
fib(n-2) + fib(n-1)
end
puts fib(32)
SOC | Type | Endian | Clock | 1.2 | 1.3 | 1.4 | 2.0 | 2.1 | 3.0 | 3.1 |
---|---|---|---|---|---|---|---|---|---|---|
AR2312 | MIPS 4K | Big | 180MHz | 121 | ||||||
AR2315 | MIPS 4K | Big | 180MHz | 89 | 118 | 103 | ||||
AR2318 | MIPS 4K | Big | 180MHz | 122 | ||||||
AR7240 | MIPS 24K | Big | 350MHz | 64 | ||||||
AR7242 | MIPS 24K | Big | 400MHz | 45 | ||||||
AR7161 | MIPS 24K | Big | 680MHz | 57 | ||||||
AR9132 | MIPS 24K | Big | 400MHz | 53 | 54 | 62 | ||||
AR9330 | MIPS 24K | Big | 400MHz | 47 | 84 | 88 | 95 | 90 | 58 | 123 |
AR1321 | MIPS 74K | Big | 535MHz | 19 | 16 | 18 | ||||
BCM5356 | MIPS 74K | Little | 333MHz | 24 | 24 | |||||
RT2880 | MIPS 4K | Little | 60 | |||||||
RT3050 | MIPS 24K | Little | 320MHz | 25 | 29 | 33 | 26 | 27 | 29 | |
RT3883 | MIPS 74K | Little | 500MHz | 18 | 18 | |||||
RT5350 | MIPS 24K | Little | 360MHz | 25 | 26 | 29 | 23 | |||
MT7620 | MIPS 24K | Little | 580MHz | 13 | 15 | 16 | 14 | |||
RT1310 | ARM 5T | Little | 300MHz | 145 | ||||||
88E6281 | ARM 5T | Little | 1200MHz | 232 | ||||||
A10 | ARM Cortex-A8 | Little | 1000MHz | 15 | ||||||
QEMU | MIPS 4K | Big | 31 |
AR2315はAtheros(後にQualcommが買収)という会社のチップで2005年くらいに製造されていました。RT3050はRalink(後にMediaTekが買収)という会社のチップで2008年くらいに製造されていました。
fib(32)だったらMac mini 2010では4秒くらいなので、それなりに遅いですが、同じコードが動く事はすごいと思います。
Atherosが遅い原因はわかっていません。