コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

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に置き換えていきたいと思います。