GR-SAKURAでmrubyを動かす (4)
GR-SAKURAでmrubyを動かす (3)からの続きです。jjzakさんの「GR-SAKURAでmrubyを使う」にある例を参考に書いています。
今回のプロジェクトはGitHubにアップしています。https://github.com/tarosay/localcompile
rxduino.hの変更
この状態でmakeすると以下のようなエラーがでます。
/cygdrive/c/cygwin/usr/local/tkdn-20110720/rx-elf/bin/../lib/gcc/rx-elf/4.6.1/../../../../rx-elf/sys-include/stdint.h:41:21: error: conflicting declaration 'typedef signed char int8_t' ./gr_common/include/rxduino/rxduino.h:50:25: error: 'int8_t' has a previous declaration as 'typedef char int8_t'
stdint.h で定義されている型定義が、rxduino.hで二重定義となるようです。そこで、gr_common/include/rxduino/下にあるrxduino.hの型定義の部分をコメントアウトします。
/* // 型の定義 typedef bool boolean; //!< @brief 真(true)か偽(false)を表す型 typedef unsigned char byte; //!< @brief 8bitの符号無し数値(0〜255)を表わす typedef unsigned short word; //!< @brief 16bitの符号無し数値(0〜65535)を表わす typedef unsigned char uint8_t; //!< @brief 8bitの符号無し数値(0〜255)を表わす typedef unsigned short uint16_t; //!< @brief 16bitの符号無し数値(0〜65535)を表わす typedef unsigned int uint32_t; //!< @brief 32bitの符号無し数値(0〜4294967295)を表わす typedef unsigned long long uint64_t; //!< @brief 64bitの符号無し数値(0〜18446744073709551615)を表わす typedef char int8_t; //!< @brief 8bitの符号付き数値(-128〜127)を表わす typedef short int16_t; //!< @brief 16bitの符号付き数値(-32768〜32767)を表わす typedef int int32_t; //!< @brief 32bitの符号付き数値(-2147483648〜2147483647)を表わす typedef long long int64_t; //!< @brief 64bitの符号付き数値(-9223372036854775808〜9223372036854775807)を表わす */
gr_sketch.cppの作成
最後にgr_sketch.cppを作成します。mrb_open()して、cdigitalWriteメソッドを定義し、mrb_load_irep()でsample.rbのコンパイルコードを動かします。
/*GR-SAKURA Sketch Template Version: V1.08*/ #include <rxduino.h> #include "mruby.h" #include <mruby/irep.h> #include <mruby/string.h> #include "sample.c" extern const uint8_t code[]; //digitalWrite function mrb_value cdigitalWrite(mrb_state *mrb, mrb_value self){ mrb_int pin; mrb_int val; mrb_get_args(mrb, "ii", &pin, &val); digitalWrite(pin, val); return mrb_nil_value(); } void setup(){ pinMode(PIN_LED0,OUTPUT); pinMode(PIN_LED1,OUTPUT); pinMode(PIN_LED2,OUTPUT); pinMode(PIN_LED3,OUTPUT); mrb_state *mrb = mrb_open(); mrb_define_method(mrb, mrb->object_class, "cdigitalWrite", cdigitalWrite, ARGS_REQ(2)); mrb_load_irep( mrb, code); } void loop(){ }
makeする
あとはmakeするだけです。これで作成したsketch.binをGR-SAKURAに書き込んで、端のLEDが点灯すれば成功です。
minao@tarosa8 ~/gr-sakura/localcompile $ make rx-elf-gcc -Wall -g -O2 -Wl,--no-flag-mismatch-warnings -fsigned-char -I./gr_build -I./gr_common -I./gr_common/include -I./gr_common/include/rxduino -I./gr_common/include/tkdnhal -I./gr_common/lib -I./gr_mruby/include -c -x c sample.c -o sample.o rx-elf-gcc -Wall -g -O2 -Wl,--no-flag-mismatch-warnings -fsigned-char -I./gr_build -I./gr_common -I./gr_common/include -I./gr_common/include/rxduino -I./gr_common/include/tkdnhal -I./gr_common/lib -I./gr_mruby/include -c -x c++ gr_sketch.cpp -o gr_sketch.o rx-elf-gcc -Wall -g -O2 -Wl,--no-flag-mismatch-warnings -fsigned-char -I./gr_build -I./gr_common -I./gr_common/include -I./gr_common/include/rxduino -I./gr_common/include/tkdnhal -I./gr_common/lib -I./gr_mruby/include -c -x c gr_common/intvect.c -o gr_common/intvect.o rx-elf-gcc -Wall -g -O2 -Wl,--no-flag-mismatch-warnings -fsigned-char -I./gr_build -I./gr_common -I./gr_common/include -I./gr_common/include/rxduino -I./gr_common/include/tkdnhal -I./gr_common/lib -I./gr_mruby/include -c -x c gr_common/lowlevel.c -o gr_common/lowlevel.o rx-elf-ld ./gr_common/gstart.o ./sample.o ./gr_sketch.o ./gr_common/intvect.o ./gr_common/lowlevel.o ./gr_common/lib/libc.a ./gr_common/lib/libg.a ./gr_common/lib/libgcc.a ./gr_common/lib/libm.a ./gr_common/lib/librxduino.a ./gr_common/lib/libsim.a ./gr_common/lib/libstdc++.a ./gr_common/lib/libsupc++.a ./gr_common/lib/libtkdnhal.a ./gr_mruby/libmruby.a -Map ./gr_build/sketch.map -L./gr_common/lib/ -lrxduino -lstdc++ -lsupc++ -lc -lsim -lgcc -lm -ltkdnhal -nostartfiles --no-flag-mismatch-warnings -T ./gr_common/gr_sakura.gsi -o ./gr_build/sketch.x rx-elf-ld: warning: section `.bss' type changed to PROGBITS rx-elf-objcopy -O binary ./gr_build/sketch.x sketch.bin rx-elf-objcopy --srec-forceS3 --srec-len 32 -O srec ./gr_build/sketch.x ./gr_build/sketch.mot rm -f *.o
sample.rbを変更してみる
sample.rbのMath.sqrt(4)を変えてみたいと思います。Math.sqrt(3)にしてみました。
HIGH = 1 LOW = 0 cdigitalWrite(100, LOW); cdigitalWrite(101, LOW); cdigitalWrite(102, LOW); cdigitalWrite(103, LOW); k = Math.sqrt(3) if k==2 then cdigitalWrite(100, HIGH); else cdigitalWrite(101, HIGH); end loop do end
それでは、ビルドしてみます。
minao@tarosa8 ~/gr-sakura/localcompile $ ~/gr-sakura/mruby/mruby-master/bin/mrbc -Bcode sample.rb minao@tarosa8 ~/gr-sakura/localcompile $ make rx-elf-gcc -Wall -g -O2 -Wl,--no-flag-mismatch-warnings -fsigned-char -I./gr_build -I./gr_common -I./gr_common/include -I./gr_common/include/rxduino -I./gr_common/include/tkdnhal -I./gr_common/lib -I./gr_mruby/include -c -x c sample.c -o sample.o rx-elf-gcc -Wall -g -O2 -Wl,--no-flag-mismatch-warnings -fsigned-char -I./gr_build -I./gr_common -I./gr_common/include -I./gr_common/include/rxduino -I./gr_common/include/tkdnhal -I./gr_common/lib -I./gr_mruby/include -c -x c++ gr_sketch.cpp -o gr_sketch.o rx-elf-ld ./gr_common/gstart.o ./sample.o ./gr_sketch.o ./gr_common/intvect.o ./gr_common/lowlevel.o ./gr_common/lib/libc.a ./gr_common/lib/libg.a ./gr_common/lib/libgcc.a ./gr_common/lib/libm.a ./gr_common/lib/librxduino.a ./gr_common/lib/libsim.a ./gr_common/lib/libstdc++.a ./gr_common/lib/libsupc++.a ./gr_common/lib/libtkdnhal.a ./gr_mruby/libmruby.a -Map ./gr_build/sketch.map -L./gr_common/lib/ -lrxduino -lstdc++ -lsupc++ -lc -lsim -lgcc -lm -ltkdnhal -nostartfiles --no-flag-mismatch-warnings -T ./gr_common/gr_sakura.gsi -o ./gr_build/sketch.x rx-elf-ld: warning: section `.bss' type changed to PROGBITS rx-elf-objcopy -O binary ./gr_build/sketch.x sketch.bin rx-elf-objcopy --srec-forceS3 --srec-len 32 -O srec ./gr_build/sketch.x ./gr_build/sketch.mot rm -f *.o
出来上がったsketch.binをGR-SAKURAに書き込むと、右から二番目のLEDが点灯しました。
これで、GR-SAKURAでmrubyスクリプトを動作させることができるようになりました。
次は、SakuLuaのLua部分をmrubyに置き換えていきたいと思います。