66
Daniel Bovensiepen Shrink To Grow

Shrink to grow

Embed Size (px)

DESCRIPTION

Presentation for RubyKaigi 2013 in Tokyo.

Citation preview

Page 1: Shrink to grow

Daniel BovensiepenShrink To Grow

Page 2: Shrink to grow

mruby

Page 3: Shrink to grow

m for ...

Page 4: Shrink to grow

m for ...minimal

Page 5: Shrink to grow

Binary Size< 100kB

Page 6: Shrink to grow

Memory Footprint< 40kB RAM

Page 7: Shrink to grow

m for ...

Page 8: Shrink to grow

m for ...embedded

Page 9: Shrink to grow

https://github.com/matsumoto-r/mod_mruby

mod_mruby

Page 10: Shrink to grow

LoadModule mruby_module modules/mod_mruby.soAddHandler mruby-script .rb

backends = [ "http://192.168.0.101:8888/", "http://192.168.0.102:8888/", "http://192.168.0.103:8888/", "http://192.168.0.104:8888/",]

# write balancing algorithm here.

r = Apache::Request.new()

r.handler = "proxy-server"r.proxyreq = Apache::PROXYREQ_REVERSEr.filename = "proxy:" + backends[rand(backends.length)] + r.uri

Apache::return(Apache::OK)

https://github.com/matsumoto-r/mod_mruby

mod_mruby

Page 11: Shrink to grow

https://github.com/spiritloose/sqlite3ext-mruby

sqlite3ext-mruby

Page 12: Shrink to grow

$ cat test.rb

def fib(n) n < 2 ? n : fib(n - 1) + fib(n - 2)end

create_function :fib do |n| fib(n)end

$ LD_LIBRARY_PATH=. sqlite3

sqlite> .load libsqlite3ext_mruby.so.1.0.0;sqlite> SELECT mrb_load('test.rb');sqlite> SELECT fib(30);832040sqlite>

https://github.com/spiritloose/sqlite3ext-mruby

sqlite3ext-mruby

Page 13: Shrink to grow

EmbedArangoDB , Redis,

mobiruby, Android, SMC

ArangoDB: http://www.arangodb.org Redis: https://github.com/antirez/redis/pull/848mobiruby (iOS): http://mobiruby.orgAndroid: http://podtynnyi.com/2012/11/29/build-mruby-for-android/SMC: http://www.secretmaryo.org, https://github.com/Quintus/SMC

Page 14: Shrink to grow

m for ...

Page 15: Shrink to grow

m for ...modular

Page 16: Shrink to grow

Add/Remove Features(i.e. Fiber, stdio, ObjectSpace, etc.)

Standard Library

Page 17: Shrink to grow

$ ./bin/mirb mirb - Embeddable Interactive Ruby Shell

This is a very early version, please test and report errors.Thanks :)

> ThreadNameError: uninitialized constant Thread> FiberNameError: uninitialized constant Fiber> eval "puts 'hello world'"NotImplementedError: eval not implemented> print "Test"NotImplementedError: print not available> ObjectSpaceNameError: uninitialized constant ObjectSpace> require 'file'NoMethodError: undefined method 'require' for main

Add/Remove Features(i.e. Fiber, stdio, ObjectSpace, etc.)

Standard Library

Page 18: Shrink to grow

RegExpOniguruma & Henry Spencer Engine

Overview: http://blog.mruby.sh/201302190729.htmlOniguruma: http://www.geocities.jp/kosako3/oniguruma/Henry Spencer Engine: http://www.arglist.com/regex

Page 19: Shrink to grow

Howis this possible?

Page 20: Shrink to grow

Implementationrewritten in C99

Page 21: Shrink to grow

ImplementationISO 30170:2012

Page 22: Shrink to grow

EXECUTING RUBY CODE

Five Ways to execute mruby: http://blog.mruby.sh/201207020720.html

mrbc, mruby and mirb

Page 23: Shrink to grow

Build SystemMakefile, cmake and ...

Page 24: Shrink to grow

Rake

Build System

Page 25: Shrink to grow

MRuby::Build.new do |conf| # load specific toolchain settings toolchain :gcc

# include the default GEMs conf.gembox 'default'end

# Define cross build settingsMRuby::CrossBuild.new('32bit') do |conf| toolchain :gcc conf.cc.flags << "-m32" conf.linker.flags << "-m32"end

Rake

Build System

Page 26: Shrink to grow

mrbgems

Page 27: Shrink to grow

mrbgemsmgem is like RubyGem but incompatible

Page 28: Shrink to grow

mrbgems

Page 29: Shrink to grow

mrbgems

mruby.c CC mruby

Page 30: Shrink to grow

mrbgems

mruby.c CC mrubymgem activate+mgem +Fiber(i.e. Fiber)

Page 31: Shrink to grow

What can we do now?

Page 32: Shrink to grow

mruby on Arduino

Page 33: Shrink to grow

C++ Code

Arduino

Page 34: Shrink to grow

C++ Code

Arduino

// Pin 13 has an LED connected on most Arduino boards.// give it a name:int led = 13;

// the setup routine runs once when you press reset:void setup() { // initialize the digital pin as an output. pinMode(led, OUTPUT); }

// the loop routine runs over and over again forever:void loop() { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second}

Page 35: Shrink to grow

Workflow

Arduino

Page 36: Shrink to grow

Workflow

Arduino

code.cpp

Page 37: Shrink to grow

Workflow

Arduino

code.cpp a.binCross-CC

Page 38: Shrink to grow

Workflow

Arduino

code.cpp a.binCross-CC .Upload

Page 39: Shrink to grow

Cross-Compile

Page 40: Shrink to grow

Atmel SAM3X8E (ARM Cortex-M3 based)

Cross-Compile

Page 41: Shrink to grow

Atmel SAM3X8E (ARM Cortex-M3 based)

Cross-CompileMRuby::CrossBuild.new("Arduino Due") do |conf| toolchain :gcc

ARDUINO_PATH = '/home/daniel/Downloads/arduino-1.5.2' BIN_PATH = "#{ARDUINO_PATH}/hardware/tools/g++_arm_none_eabi/bin" SAM_PATH = "#{ARDUINO_PATH}/hardware/arduino/sam" TARGET_PATH = "#{SAM_PATH}/variants/arduino_due_x"

conf.cc do |cc| cc.command = "#{BIN_PATH}/arm-none-eabi-gcc" cc.include_paths = ["#{SAM_PATH}/system/libsam -I#{SAM_PATH}/system/CMSIS/CMSIS/Include/", "#{SAM_PATH}/system/CMSIS/Device/ATMEL/", "#{SAM_PATH}/cores/arduino -I#{TARGET_PATH}", "#{MRUBY_ROOT}/include"] cc.flags << '-Os -w -ffunction-sections -fdata-sections -nostdlib ' + '--param max-inline-insns-single=500 -Dprintf=iprintf ' + '-mcpu=cortex-m3 -DF_CPU=84000000L -DARDUINO=152 ' + '-D__SAM3X8E__ -mthumb -DUSB_PID=0x003e -DUSB_VID=0x2341 -DUSBCON' cc.compile_options = "%{flags} -o %{outfile} -c %{infile}" end

conf.archiver do |archiver| archiver.command = "#{BIN_PATH}/arm-none-eabi-ar" archiver.archive_options = 'rcs %{outfile} %{objs}' end

conf.bins = []end

Page 42: Shrink to grow

Arduino Ecosystem

Embed

Page 43: Shrink to grow

Arduino Ecosystem

Embed

#include "Arduino.h"#include "../mruby_src/include/mruby.h"

mrb_state *mrb;

/* Init phase of Microcontroller */voidsetup() { }

/* Process Loop */voidloop() { mrb = mrb_open();

/* Use mruby here */

mrb_close(mrb);}

Page 44: Shrink to grow

Arduino Ecosystem (API)

Embed

Page 45: Shrink to grow

Arduino Ecosystem (API)

Embed

/* ... */

mrb_valuemrb_ar(mrb_state *mrb, mrb_value self) { mrb_int pin; mrb_get_args(mrb, "i", &pin); return mrb_fixnum_value(analogRead(pin));}

/* ... */

/* Integrate into mruby */ RClass *am = mrb_define_module(mrb, "Arduino"); mrb_define_module_function(mrb, am, "analog_read", mrb_ar, ARGS_REQ(1));

/* ... */

Page 46: Shrink to grow

Shrink

Page 47: Shrink to grow

available 96kB SRAM and 512kB Flash

Shrink

Page 48: Shrink to grow

available 96kB SRAM and 512kB Flash

Shrink

0

16000

32000

48000

64000

80000

96000

112000

128000

144000

160000

nothing mrb_open wrd box nan box flt seglist heap khash mrblib ALL (-flt -wrd) ALL (-nan)

Image (bytes) Free Memory (bytes) Execution Time (µs)

Page 49: Shrink to grow

Shrink96kB SRAM available (~31kB used)512kb Flash available (~86kB used)

Page 50: Shrink to grow

Workflow (mruby)

Arduino

Page 51: Shrink to grow

Workflow (mruby)

Arduino

mruby.c

Page 52: Shrink to grow

Workflow (mruby)

Arduino

mruby.c mruby¹(host)cc

Page 53: Shrink to grow

Workflow (mruby)

Arduino

mruby.c mruby¹(host)cc

mruby²(target)cross-cc

Page 54: Shrink to grow

Workflow (mruby)

Arduino

code.rb

mruby.c mruby¹(host)cc

mruby²(target)cross-cc

Page 55: Shrink to grow

Workflow (mruby)

Arduino

code.rbarray.c(Array)

mruby.c mruby¹(host)cc

mruby²(target)cross-cc

mrbc¹

Page 56: Shrink to grow

Workflow (mruby)

Arduino

code.rbarray.c(Array) code.cpp

mruby.c mruby¹(host)cc

mruby²(target)cross-cc

mrbc¹ integrate

Page 57: Shrink to grow

Workflow (mruby)

Arduino

code.rbarray.c(Array) code.cpp

mruby.c mruby¹(host)cc

mruby²(target)

code.cpp+

mruby²

cross-cc

mrbc¹ integrate

Page 58: Shrink to grow

Workflow (mruby)

Arduino

code.rbarray.c(Array) code.cpp

mruby.c mruby¹(host)cc

mruby²(target)

code.cpp+

mruby²a.bin

cross-cc

mrbc¹ integrate

cross-cc

Page 59: Shrink to grow

Workflow (mruby)

Arduino

code.rbarray.c(Array) code.cpp

mruby.c mruby¹(host)cc

mruby²(target)

code.cpp+

mruby²a.bin .

cross-cc

mrbc¹ integrate

cross-cc upload

Page 60: Shrink to grow

Workflow (mruby)

Arduino

code.rbarray.c(Array) code.cpp

mruby.c mruby¹(host)cc

mruby²(target)

code.cpp+

mruby²a.bin .

cross-cc

mrbc¹ integrate

cross-cc uploadOMG

Page 61: Shrink to grow

Port mirb to Arduino Due

Arduino

Page 62: Shrink to grow

Port mirb to Arduino Due

Arduino

.enter .rb

Page 63: Shrink to grow

Interactive Arduino Shell (LED Switch)

Arduino

Page 64: Shrink to grow

Interactive Arduino Shell (3D Printer)

Arduino

Page 65: Shrink to grow

Coming Next“Webruby”

byXuejie Xiao

Page 66: Shrink to grow

THX

@bovensiepen

http://mruby.sh