2013年01月31日

[解決] mrubyがRakeでコンパイルできない orz   2013/01

しばらく、遠ざかっていたmruby。
久しぶりに、変更差分を更新したらビルドがMakeからRakeに変更になっていて、
別世界だった :D

Windows7/MinGWコンソール/Ruby-1.9.1上

$ make
ruby ./minirake
(in mruby)
rake aborted!
undefined method `cc' for nil:NilClass


れ、Rake一発コンパイルができないっ!!

この「cc」がどうも、
export cc=gccとか
export CC=gccとか
make CC=gccとか
ruby ./minirake cc=gccとか
alias cc='gcc'とか
全部だめだった。(爆
cc自体はgccのシンボリック、あっ!!
MinGWは、シンボリックリンクの概念がないのだった。
でもccコマンドを打つとgccがちゃんと起動する。
gccをccに物理コピーしてみるとか、
もう何をやってもだめなので、

第1次遭遇失敗、確定。(爆

手ごわいな。

どうもこちらの方々のページがヒントになりそうだけど、
http://ror.hj.to/r/blog/blog/1
http://onmessage.ws/wordpress/?p=745


探査は続く......

(2013/02)
ubuntu上でやってみたら無問題でコンパイルできた。 orz
MinGW上はしばらく様子を見よう。

(2013/02)(2)
山ちゃんさんに教えていただいて、解決しました。
Rubyのバージョンをv1.9.1からv1.8.7に下げたら、(実行パスを切り換えただけです)
Rake一発コンパイルOKになりました。
しかもMS-DOS窓からもMinGWコンソールからもコンパイルOKになりました。
(^^)/
posted by Copyright (C) avrin All Rights Reserved. at 00:01| Comment(2) | mruby | このブログの読者になる | 更新情報をチェックする

2012年09月10日

mrubyメモ 2012/09

* mruby-nxt
mrubyのコードが公開されて1ヶ月程度の時点で、すでに組み込み用ARMマイコンで
動いているらしいと言われていたもの?。

NXTのSRAMが64kbyteしかないので、mrubyのSRAM使用量を98kbyteから
41kbyte程度まで減らしているらしい。

mruby-nxt ETロボコン2012九州大会でデモ走行

http://www.youtube.com/watch?v=r83udJaQ4Is

* lpc2388
IF誌付録のlpc2388でmrubyを動かそうとやってみたが、mruby初期化中にSRAMが
足りなくなって失敗。あきらめる。
上記NXTの説明だと素の状態ではSRAM98kbyte程度必要。

* STM32F4Discovery / gr-sakura
SRAMが98k以上あれば良いなら、これらのマイコンボードなら動く。
両方とも持ってない。orz
IF誌付録のSH-2Aがあるけど、やる気なし。:D
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | mruby | このブログの読者になる | 更新情報をチェックする

2012年06月24日

mrubyでNative関数を作るメモ 2012/06

mrubyでNative関数を作るメモ 2012/06
* はじまり
以下の方々のページを参考にさせて頂いて、
2. MRuby 探索
http://www.oki-osk.jp/esc/mruby-oa/02.html
mrubyにクラスとメソッドを組み込んでみた(Windows 7)
http://akasata.hatenablog.com/entry/2012/05/30/202432
mruby で自前の組み込み関数を呼び出してみた。Add Star
http://mattn.kaoriya.net/software/lang/ruby/20120420141103.htm

mrubyスクリプトからNative関数(C言語関数)を呼び出す簡単なプロジェクトの雛形を作ってみました。
(MinGW上の簡単な実行ファイルを生成します)

これができると超組み込みマイコン用の雛形の原型ができたような感じになります。 :D

*コンパイル
makeの実行はMinGWのコンソール上で行います。(注1)

用意する物
(1)このファイル mruby_native_c_test_v01_201206.tar.gz
(2)mrubyのコンパイル済み(MinGW上で)のソースフォルダ。

(1)をMinGW環境コーンソルで適当なワークフォルダに解凍します。
$ tar zxvf mruby_native_c_test_v01_201206.tar.gz

Makefileの
MRUBY_ROOT = ../../mruby-lf
の部分を各自の環境に合わせて変更します。
指定は絶対パスか相対パスにします。「~/」(ホーム相対表現)を含んだパスだとうまくコンパイルできない様です。
(MRUBY_ROOTにmrubyのソースコードフォルダ名を指定します)

ワークフォルダでmakeを実行すると、
$ make
cat mod_easy_io.rb test.rb  > _tmp.rb
../../mruby-lf/bin/mrbc -Cmain_rb  _tmp.rb
gcc -MMD -MF "dep/main.d" -c -Os -I../../mruby-lf/include -I. -L../../mruby-lf/lib -Wl,-Map=target.map -Wl,--cref main.c -o main.o
gcc -MMD -MF "dep/_tmp.d" -c -Os -I../../mruby-lf/include -I. -L../../mruby-lf/lib -Wl,-Map=target.map -Wl,--cref _tmp.c -o _tmp.o
gcc -MMD -MF "dep/easy_io.d" -c -Os -I../../mruby-lf/include -I. -L../../mruby-lf/lib -Wl,-Map=target.map -Wl,--cref easy_io.c -o easy_io.o
gcc -Os -I../../mruby-lf/include -I. -L../../mruby-lf/lib -Wl,-Map=target.map -Wl,--cref main.o _tmp.o easy_io.o -lmruby -o target.exe
   text    data     bss     dec     hex filename
 296252    2840    2612  301704   49a88 target.exe
という感じで「target.exe」ができるので実行します。 黄色い部分がArduino風の名前のNative関数を呼び出したところ。 この例では関数名と引数を表示するだけのNative関数。 
$ ./target.exe
-- Start ---
Init test --- [ added the string of local variable ]
pinMode( 13, OUTPUT )
pinMode(  1, OUTPUT )
delay_ms( 100 )
digitalOut( 13,  1 )
Direct call from user Class  --- testsub string
Default argument ! --- [ added the string of local variable ]
15.5
Object method call  --- testsub string
digitalOut(  1,  0 )
以下が、メインのmrubyスクリプト。実験用なのでプログラム自体に大きな意味はないです。 Native関数は「EasyIo」(2行目)というモジュール名で定義してあるのでincludeする。
class Msg
	include EasyIo
	def initialize( str )
		@instr = "[ added the string of local variable ]"
		msg( str )
		pinMode( 13, 1 )
		pinMode(  1, 1 )
		delay_ms( 100 )
		digitalOut( 13, 1 )
		test_sub( "Direct call from user Class" ) 
	end

	def msg( str="Default argument !")
		print "\n",str, " --- " + @instr
	end

end

def func_main()
	print "\n--- Start ---"
	obj = Msg.new("Init test")
	obj.msg()
	x =  3.1 * 5
	print "\n", x
	obj.test_sub( "Object method call" )
	obj.digitalOut( 1, 0 );
end

func_main()
以下の「easy_io.c」でモジュール「EasyIo」を定義、登録して、 モジュールメソッドとしてdigitalOut()などのNative関数を定義しました。
#include <mruby.h>
#include <mruby/proc.h>
#include <stdio.h>

struct RClass *mod_easy_io;

static mrb_value delay_ms( mrb_state *mrb, mrb_value self )
{
	mrb_int ms;
	mrb_get_args( mrb, "i", &ms );
	printf("\ndelay_ms( %d )", ms); 

	return self; 
}

static mrb_value digitalOut( mrb_state *mrb, mrb_value self )
{
	mrb_int pin, level;
	mrb_get_args( mrb, "ii", &pin, &level);
	printf("\ndigitalOut( %2d, %2d )", pin, level ); 

	return self; 
}

static mrb_value pinMode( mrb_state *mrb, mrb_value self )
{
	mrb_int pin, mode;
	char *str_mode;
	char *in = "INPUT";
	char *out= "OUTPUT";
	mrb_get_args( mrb, "ii", &pin, &mode);
	str_mode = ( mode == 0 ) ? in : out ;
	printf("\npinMode( %2d, %s )", pin, str_mode ); 

	return self; 
}

void init_easy_io( mrb_state *mrb )
{
	mod_easy_io = mrb_define_module( mrb, "EasyIo");
	mrb_define_method( mrb, mod_easy_io, "delay_ms", delay_ms, ARGS_REQ(1)); 
	mrb_define_method( mrb, mod_easy_io, "digitalOut", digitalOut, ARGS_REQ(2)); 
	mrb_define_method( mrb, mod_easy_io, "pinMode", pinMode, ARGS_REQ(2)); 

}
以下が仮想コードを実行するトップレベルの関数「main.c」。
#include "mruby.h"
#include "easy_io.h"

extern void main_rb( mrb_state* mrb);

int main()
{
	mrb_state* mrb = mrb_open();

	init_easy_io( mrb );
	main_rb( mrb );

	mrb_close( mrb );
	return 0;
}
*超組み込みマイコン用(注2)に変更する ここまでくると上の雛形を基にして、 (1) gccを「arm-none-eabi-gcc」等に変更。 (2) リンカスクリプトの追加。 (3) syscall.c 系の関数追加。 で、いけると思う。 (注1) Linux上でも同様なやり方でコンパイル可能です。 (注2)超組み込みマイコンをSRAMが極小のマイコンと定義してみた。(動くかどうかは別として) Information technology -- Programming languages -- Ruby http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=59579
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | mruby | このブログの読者になる | 更新情報をチェックする

2012年06月15日

mrubyのサイズが激減した件 2012/06

mrubyのサイズが激減した件 2012/06
* 1ヶ月でmrubyのコードサイズが激減した
* ARMのThumb2コードはもっとスゴかった !! 
* 機能カットで遂に200kbyteを切る !!!

* 1ヶ月でmrubyのコードサイズが激減した
前回、mrubyをコンパイルしてみた 2012/05 
http://avr.paslog.jp/article/2462064.html
で、初めてmrubyをコンパイルした時のmrubyの実行サイズはMinGW上で
Makefile内の最適化オプションをすべて「-Os」にして,stripかけて(注3)
720kbyte(717,200)くらいだった。

それから1ヶ月。精力的な改良が行われているようで、
作者の方の談によるとソースコードが1万行以上減ったらしい。
という話を聞きつけて今日の時点でもう一度コンパイルしてみた。

どゎ〜〜〜〜〜〜〜〜〜〜〜〜っ!!

サ、サイズが半分以下になったのだった。

MinGWは事前に最新バージョン化しておいた。
$ mingw-get update
$ ming-get upgrade
今回は最初MinGW上でなぜかコンパイルできなかったので、(注1) Linux(Ubuntu)上でもコンパイルしてみた。結果はどちらも同等のコードサイズであることが分った。 arm-none-eabi-gccの「Thumb2」コードだとさらに10%程度減少して300kbyte程度になる と思われる。 「さらにコード効率の良い」RX62Nなら300kbyteを下まわる可能性もある。 以下、取得したリビジョンはhg-git(mercurial-hg)したTortoiseHG(mercurial)上のリビジョン。 (rev.NNNの部分はmercurial用。 gitのコードバージョンは"git hush"で特定できる)
(x86) lib/libmryby.aのコードサイズの変遷 , gcc最適化(-Os)
コミット日付(hg rev.)SizeTool versiongit hush(先頭から)
2012/06/21(rev.918)319 kbyteMinGW gcc v4.7.0, bison v2.4.22109556188
2012/06/14(rev.833)318 kbyteMinGW gcc v4.7.0, bison v2.4.2d118724872
2012/06/14(rev.833)344 kbyteubuntu gcc v4.6.3, bison v2.5d118724872
2012/05/12(rev.316)701 kbyteMinGW gcc v4.7.0, bison v2.4.2e274382aca7
これからは、上の表の様に「lib/libmruby.a」のコードサイズを比較していくことにする。 超組み込みマイコンの場合「mruby.exe」などの実行ファイルを作るわけではないのと、 各種「*.exe」と大きさがほぼ同じだからだ。 最近のmrubyは、最適化オプション「-Os等」がトップレベルのMakefileで選択できるように、 改良されていて非常に助かりました。m(__)m * ARMのThumb2コードはもっとスゴかった !! 最近、超組み込みマイコンで流行りの、ARM Cortex-M3マイコン用の 無料のgccクロスコンパイラ(YAGARTO)、「arm-none-eabi-gcc.exe」でコンパイルしてみた。 コードサイズの表示は、x86用なら
$ size -t lib/libmruby.a
で、Totalのところを読む。(注2) ARMならsizeのかわりに、「arm-none-eabi-size」を使う。
lib/libmryby.aのコードサイズの比較 , gcc最適化(-Os)
CPUコミット日付(hg rev.)SizeTool versiongit hush
ARM Cortex-M3
Thumb2
2012/06/21(rev.918)226 kbyteYAGARTO gcc v4.7.0, bison v2.4.22109556188
x862012/06/21(rev.918)319 kbyteMinGW gcc v4.7.0, bison v2.4.22109556188
ぬぁにぃ〜〜〜〜〜〜〜〜〜〜〜っ!!! 当初のx86に比べて10%程度コードサイズが減るという予測だったものの、 実際にやってみると30%、なんと「約100kbyte」もコードサイズが縮んだのだった。 (^^)/ (^^)/ ちなみに、RX62N系だともっと小さくなって、200kbyte以下になる可能性もある。スゴ *必要なRAM容量 まだ、詳細は不明なものの Rubyで書かれた内部ライブラリを仮想マシンコードに変換した物が、 mrblib/mrblib.ctmpファイル。このファイルの仮想マシンコード部分約17kbyteが 初期化時にヒープに読み込まれるのでこの時点で最低でも17kbyte。 これに、 (1)アプリケーションを仮想マシンに変換した分。 (2)アプリケーション内で確保されるRAM。 (3)仮想マシンを動作させるためのシステム側のスタックやヒープ。 (4)その他もろもろ。 を加えてトータルでさていくつ? (謎 SRAM 32kbyteじゃ無理な気がするので、SRAM 64kbyte〜128kbyteでどうかなぁ。 * 機能カットで遂に200kbyteを切る !!! 以下の記事や、 mrubyのライブラリ構成とは?― まつもとゆきひろ氏インタビュー第2弾 以下の方のブログから、 コンデンサの隣からひとこと mrubyのメモリ使用量 http://d.hatena.ne.jp/machaut/20120624/1340547112 "include/mrbconf.h"で機能の有無を選択できる事を知りました。 中を見てみると、 デフォルト状態では、正規表現ライブラリが除外されているだけで、 残りは全て有効状態だったので、全て無効にしてみた。 すると、さらに約30kbyte減り遂に196kbyteになりました。 (上記のARM Cortex-M3でコンパイルしたリビジョン, hg:rev.918) ただし、2012/06/27時点で取得したリビジョン(hg:rev.970)では10kbyteほどコード量が 増えていた。 従ってコード量については、数十キロバイトオーダで日々変動があると思われる。 一旦大きくコード量が減ったものの、エラー処理やバグ対応、機能追加などで 今後、数年かかってゆっくりとした増加傾向になるような気がする。 機能選択「include/mrbconf.h」について: 2012.06.26 23:17 (hg:rev970) (git hush: 2c7b9faba6ebd38d) (注4) このファイル(このリビジョン)についていえば、 「#undef MRB_USE_FLOAT」 があるために、コメント通りには機能しなかったり、 (コンパイルオプションに指定しても#undefされてしまう) 明示的に禁止定義をしない限り、全てデフォルトで有効だったり(regexpを除く) 上の「MRB_USE_FLOAT」だけロジックが逆だったりと、 ハマリがちなので、注意した方が良い、 そのうち修正が入ると思う。 (#undef をやめて、ロジックもDISABLE方式に統一した方が良い) (注1)MinGWのコンソールではなく、MSーDOSのプロンプトでmakeしたのが原因だった風。 orz (注2)libmruby.aのファイルサイズ自体は、アーカイバで圧縮されているので"ファイルサイズ"を比較する意味は薄い。 (注3)実際のコードサイズを見るならstripをかける必要はなくて、sizeコマンドで見た方が良い。 (注4)日時は日本時間(Local time)表現
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | mruby | このブログの読者になる | 更新情報をチェックする

2012年05月14日

mrubyをコンパイルしてみた 2012/05

mrubyをコンパイルしてみた 2012/05
このブログ的には、mrubyって「ムルビー」って読みがち。 (オイ

軽量Rubyへの取り組み
http://www.iij.ad.jp/company/development/tech/activities/mruby/

* mrubyをコンパイルしてみた 2012/05
2012/04/20あたりにgithubでアップされていたらしい。
git://github.com/mruby/mruby.git
https://github.com/mruby/mruby
ググってみると、まだアップされて20日くらいしか経っていないのに
多くのフォロアがいて驚いた。さすがに国産だけあって注目度が高いのが伺える。

自分の環境ではMinGWにbisonを追加するだけでコンパイルと動作確認出来た。
mingw-get install msys-bison

gccはv4.6.2でデフォルトの「-O3」オプションで920kbyteくらいだった。(stripかけて)
これを、いわゆる超組み込み向けの「-Os」オプション :D に変更すると
720kbyteまで減った。(注1)
mruby\bin>size mruby.exe
   text    data     bss     dec     hex filename
   717200    2992    2680  722872   b07b8 mruby.exe
このブログ的なターゲットマイコンとしては、 IF誌付録のSH-2Aマイコン(DRAM 1Mbyte) STM32F4Discoveryボード(Flash 1Mbyte/ SRAM 192kbyte) 等が考えられる。 上のコンパイル結果(x86用)をみると、上記マイコンではシステム的に アンバランスなもののFlashが720kbyteで収まったのはちょっと予想外だった。 (I/Oモジュールなしなので、これだけではアレだけど) 動作に必要なヒープ量が100kbyte〜200kbyte程度なら何とか上記マイコンでも動きそうな 気がするが今のところ必須最低ヒープ量は未調査。 フォロアが多いのでそのうち誰かが... (オイ (注2) ちなみに、このブログ的な物件としては、ざっくり PyMite(p14p) Flash 30kbyte〜 , SRAM 8Kbyte〜 Pawn Flash 64kbyte前後〜 , SRAM 32kbyte程度? 探査中 eLua Flash 200kbyte前後〜, SRAM 32kbyte〜 というのが今までの経緯なので、 mrubyはやはり「別カテゴリ」に属するのは明らかなわけだけど。 * PC上で動かしてみた 上でコンパイルした「mruby.exe」でスクリプトを動かしてみた。 スクリプトを「hello.rb」とすると bin/mruby.exe hello.rb とすれば動く。 以下は、実験用のスクリプトなので深い意味はない。
class Msg
    def initialize( str )
        @instr = "internal"     # ---- ここが正解
        msg( str )
        @instr = "internal" # ---- これバグってた。 2012/06/23 orz
    end

    def msg( str="Hello mruby !")
        puts str + " --- " + @instr
    end

    def rx( txt )
        for i in 0..txt.length do
            puts txt.upcase[i] 
        end
    end
end

def func_main()
    obj = Msg.new("Init hello")
    obj.msg()
    obj.rx("nbnbnb")
    obj.rx("abcdefg"[1..4])
    puts 3.1 * 5
end

func_main()
上は、一応意図通り動きました。 正規表現比較の「=~」が使えなかった。 orz と、いうか、 ドキュメントがなさそうなので、どういう予約語が使えるとか使えないとか、 「素のruby」の言語仕様ってなに? とか、今のところ不明な点は多い。(メーリングリストがあるらしい) 予約語については「src/keywords」で大まかにわかる。 仮想マシンコードを実行: bin/mrbc.exe hello.rb とすると「hello.mrb」という仮想マシンモジュールが生成される。 これを、実行するには bin/mruby.exe -b hello.mrb とする。 仮想マシンモジュールのC言語配列を出力 上のスクリプトのメイン関数「func_main()」をC言語の配列として出力できるみたい。 bin/mrbc.exe -Bfunc_main hello.rb とすると以下の様な仮想コード配列「hello.c」が出力される。
const char func_main[] = {
0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x39,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x39,
0x30,0x30,0x30,0x30,0x4d,0x41,0x54,0x5a,0x20,0x20,0x20,0x20,0x30,0x30,0x30,0x39,
......
ARMコンパイラでコンパイル irukaさんのページで、armコンパイラを使って実際のサイズが出た様です。 http://hp.vector.co.jp/authors/VA000177/html/2012-04.html なんと、Flashサイズ640kbyteまで来ました。 (注1)x86系のコンパイルサイズとARM Cortex-M系のコンパイルサイズはだいたい     同じだろうという予測に基づく。(±数十%程度と予測) (注2)gdbで見ればいいわけだけど。 参考: 2. MRuby 探索 http://www.oki-osk.jp/esc/mruby-oa/02.html Big Sky システム開発屋がひっそり語るぼやき http://mattn.kaoriya.net/software/lang/ruby/20120420121729.htm mruby を Ash エミュレータ上の Linux (uClinux) 環境で動かしてみる http://pylone.jp/blog/mruby_on_qemu_ash rubyco(るびこ)の日記 Windows XPでmrubyをビルドして動かすAdd Star http://d.hatena.ne.jp/rubyco/20120424/mruby mrubyコンパイルできなかったけど-std=gnu99つけてコンパイルした。 http://kimoto.hatenablog.com/entry/2012/05/01/155911
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | mruby | このブログの読者になる | 更新情報をチェックする