LoginSignup
5
5

More than 1 year has passed since last update.

FreeBSDでmruby

Last updated at Posted at 2016-02-14

mruby with ZRouter.org

mrubyは組み込みを対象にしているので、クロスビルドの機能があります。またhttpなどの通信スタックも用意されています。

FreeBSDのルータ向けビルドシステムのZRouterとmrubyのクロスビルドを組み合わせて環境を作ります。ZRouterとmrubyは極めて親和性が高いです。

もちろんターゲットの機器はハードオフで入手した無線ルーターのジャンクを利用します。

デフォルトでprofileのmrubyを選択すれば素のmruby入りがつくれます。ビルドにはホスト側にrubyとbisonをpkgでインストールする必要があります。ネットワークアクセスが出来るようにビルドしてみます。

スクリーンショット(2019-01-31 9.38.56).png

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はほんとよくできていると思います。

mruby_freebsd.png

ターゲットの機器は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が遅い原因はわかっていません。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5