SlideShare a Scribd company logo
mbed fest 2013
- Nagoya, Yokohama, Sapporo JPN
13年9月17日火曜日
軽量Java VMで動かす
Cortex-M0+とその利点
13年9月17日火曜日
• プロセッサ非依存開発環境
• インタプリタを自作すると良い事ひとつも無い
• 主要なVM紹介
• JVMで動くのはJavaだけ?
• RaVem JVM
• 競合するJVM比較
• バイトコードの概要
• メモリ管理とガーベジコレクション
• マルチスレッドに対応する
• オリジナル関数(メソッド)追加方法
Agenda
13年9月17日火曜日
• プロセッサ非依存開発環境
• インタプリタを自作すると良い事ひとつも無い
• 主要なVM紹介
• JVMで動くのはJavaだけ?
• RaVem JVM
• 競合するJVM比較
• バイトコードの概要
• メモリ管理とガーベジコレクション
• マルチスレッドに対応する
• オリジナル関数(メソッド)追加方法
Agenda
13年9月17日火曜日
• プロセッサ非依存開発環境
• インタプリタを自作すると良い事ひとつも無い
• 主要なVM紹介
• JVMで動くのはJavaだけ?
• RaVem JVM
• 競合するJVM比較
• バイトコードの概要
• メモリ管理とガーベジコレクション
• マルチスレッドに対応する
• オリジナル関数(メソッド)追加方法
Agenda
Java VMの仕組みとmbed上での動作確認
13年9月17日火曜日
• プロセッサ非依存開発環境
• インタプリタを自作すると良い事ひとつも無い
• 主要なVM紹介
• JVMで動くのはJavaだけ?
• RaVem JVM
• 競合するJVM比較
• バイトコードの概要
• メモリ管理とガーベジコレクション
• マルチスレッドに対応する
• オリジナル関数(メソッド)追加方法
Agenda
13年9月17日火曜日
• 事の発端
• FPGA + コプロセッサ + 他のシステム
Processor-independent devel environment
FPGA
Co-processor
CAM
x
Command
Config
CameraLink™
CPU +
PowerVR
64bit bus
Peripheral
13年9月17日火曜日
• 事の発端
• FPGA + コプロセッサ + 他のシステム
Processor-independent devel environment
FPGA
Co-processor
CAM
x
Command
Config
CameraLink™
CPU +
PowerVR
64bit bus
Peripheral
C/C++
HDL +
Simulink
Java /
.net CF
13年9月17日火曜日
• 低レイヤーの開発環境を持っていない
• 上位層のテストの為だけにコード変更…
• 単体テスト∼システムテストまで終わっている
• コードを見せたくない or 触らせたくない
• プロセッサ非依存開発環境
Processor-independent devel environment
13年9月17日火曜日
• プロセッサ非依存開発環境
• インタプリタを自作すると良い事ひとつも無い
• 主要なVM紹介
• JVMで動くのはJavaだけ?
• RaVem JVM
• 競合するJVM比較
• バイトコードの概要
• メモリ管理とガーベジコレクション
• マルチスレッドに対応する
• オリジナル関数(メソッド)追加方法
Agenda
13年9月17日火曜日
my own interpreter
• 三重苦
• 文字列認識(対話)型 or 中間コード生成方式
• エラー発生
• 単なるコードエラー?
• 仕様の想定を超えていた?
• 仕様から作り直しだよksg
• 独自インタプリタの使い方を教える必要
• もうだめぽ
13年9月17日火曜日
my own interpreter
• すでにあるVM規格のある言語仕様を活用
Language for embedded requirements
Python P14P(ex.PyMite) Flash:55kB~,RAM:8kB~
Lua eLua Flash:256kB~,RAM:64kB~
Ruby mruby Flash:512kB,RAM:1MB?
Java Java ME and so on... Flash:130kB,RAM:8kB
13年9月17日火曜日
VM
• すでにあるVM規格のある言語仕様を活用
Java
VB
Python
JavaScript
Ruby
Perl
※VMの実装がある言語に限った
13年9月17日火曜日
VM
• すでにあるVM規格のある言語仕様を活用
54%
13%
12%
7%
7%
7%
人気のある言語(Tiobe Programming Community調べ,Aug 2013)
Java
VB
Python
JavaScript
Ruby
Perl
※VMの実装がある言語に限った
13年9月17日火曜日
Variants Java VM
• Java for embedded
JVM System requirements
Oracle Java ME
Embedded for
STM32F
Flash :130kB~
RAM: ?
Binary only
uJ
Flash :64kB~
RAM:192bytes~
thread,runnable,GC,
original String type
nanoVM
Flash :8kB~
RAM: 1kB~
for AVR
Single thread
RaVem
Flash :5kB~
RAM: 256bytes~
thread,runnable,
Integer only
13年9月17日火曜日
• 開発はC言語だけど、それぞれのCPU用のコンパイラが
必要
C compiler
ARM
intel
AVR
PIC
Applica
tion
13年9月17日火曜日
• 開発はC言語だけど、それぞれのCPU用のコンパイラが
必要
C compiler
Compiler
Compiler
Compiler
Compiler
ARM
intel
AVR
PIC
Applica
tion
13年9月17日火曜日
• Java:一度VMをマイコンに実装すればデバイス非依存
•
Java
managed
code
ARM
intel
AVR
PIC
VM
13年9月17日火曜日
• Java:一度VMをマイコンに実装すればデバイス非依存
•
Java
managed
code
ARM
intel
AVR
PIC
VM
device-independent
13年9月17日火曜日
• Java:一度VMをマイコンに実装すればデバイス非依存
•
Java
managed
code
ARM
intel
AVR
PIC
VM
device-independent
write once run anywhere
13年9月17日火曜日
VM
• バイトコードを解釈する機構を実装
•バイトコードって何が書いてあるの?
13年9月17日火曜日
byte code
• バイトコードの中身
• 定数プール(constant pool)
• 命令(Code Attribute)
• 例外(Exception)
• big endian
CA FE BA BE........
...........................
...........................
...........................
...........................
...........................
...........................
...........................
...........................
13年9月17日火曜日
byte code
• バイトコードの中身
• 定数プール(constant pool)
• 命令(Code Attribute)
• 例外(Exception)
• big endian
CA FE BA BE........
...........................
...........................
...........................
...........................
...........................
...........................
...........................
...........................
13年9月17日火曜日
byte code
• バイトコードの中身
• 定数プール(constant pool)
• 命令(Code Attribute)
• 例外(Exception)
• big endian
CA FE BA BE........
...........................
...........................
...........................
...........................
...........................
...........................
...........................
...........................
13年9月17日火曜日
byte code
• バイトコードの中身
• 定数プール(constant pool)
• 命令(Code Attribute)
• 例外(Exception)
• big endian
CA FE BA BE........
...........................
...........................
...........................
...........................
...........................
...........................
...........................
...........................
13年9月17日火曜日
byte code
• 具体例(hello world)
• 例:定数プール(20)→”hello
world”
• 命令
• 定数プール20番をスタック
• printlnメソッドを呼び出せ
cp[1]=........
........
cp[20]=”hello world”
........
load cp[20],stack
call “println”
System.out.println(“hello world”);
13年9月17日火曜日
byte code
• 具体例(hello world)
• 例:定数プール(20)→”hello
world”
• 命令
• 定数プール20番をスタック
• printlnメソッドを呼び出せ
cp[1]=........
........
cp[20]=”hello world”
........
load cp[20],stack
call “println”
13年9月17日火曜日
stack
• スタック(Operand Stack)
• 積み木(順番に積み上げて、上から取る)
13年9月17日火曜日
stack
• スタック(Operand Stack)
• 積み木(順番に積み上げて、上から取る)
data1
data2
data3
13年9月17日火曜日
stack
• スタック(Operand Stack)
• 積み木(順番に積み上げて、上から取る)
data1
data2
data3
13年9月17日火曜日
example: add
• 具体例(加算)
int x, y, z;
x = 10;
y = 20;
z = x + y;
System.out.println(z);
13年9月17日火曜日
example: add
• 具体例(加算)
13年9月17日火曜日
example: add
• 具体例(加算)
10
20
13年9月17日火曜日
example: add
• 具体例(加算)
30
13年9月17日火曜日
Java VM
• Java VMは
• 定数プールを引用する仕組み
• スタックを管理する仕組み
• 命令を実行する仕組み
があれば作れてしまう
13年9月17日火曜日
Java VM
• Java VMは
• 定数プールを引用する仕組み
• スタックを管理する仕組み
• 命令を実行する仕組み
があれば作れてしまう
なのでCortex-M0+でJavaVM作ってみた
13年9月17日火曜日
RaVem JVM
RaVemRaVem
Rapid VM embbededRapid VM embbeded
• Flash 5kbytes~
• RAM 128bytes
• int type only
• all code written in C (about 700 sloc)
• github (for LPC812)
• https://github.com/lynxeyed-atsu/RaVem
• port on mbed
• http://mbed.org/users/lynxeyed_atsu/code/FRDM_RaVem_JVM
13年9月17日火曜日
blink LEDs with JVM
• GPIOを操作するメソッド: portWrite(bit, value)
• 一定時間でLEDをon/offするコードを書く
• 上記を4-thread化
13年9月17日火曜日
blink LEDs with JVM
• GPIOを操作するメソッド: portWrite(bit, value)
• 一定時間でLEDをon/offするコードを書く
• 上記を4-thread化mbed.portWrite(port_bit, 0);
Thread.sleep(time);
mbed.portWrite(port_bit, 1);
Thread.sleep(time);
13年9月17日火曜日
blink LEDs with JVM
• GPIOを操作するメソッド: portWrite(bit, value)
• 一定時間でLEDをon/offするコードを書く
• 上記を4-thread化mbed.portWrite(port_bit, 0);
Thread.sleep(time);
mbed.portWrite(port_bit, 1);
Thread.sleep(time);
BlinkLED LED1 = new BlinkLED(0, 90);
BlinkLED LED2 = new BlinkLED(1, 100);
......
Thread th1 = new Thread(LED1);
Thread th2 = new Thread(LED2);
......
th1.start();
th2.start();
13年9月17日火曜日
blink LEDs with JVM
• mbedにRaVem JVMのVM(.bin)ファイルを書き込み
• javaコードをjavacでコンパイル
• .classファイル生成(byte code)
• Test.claにリネーム
• mbedにコピー
• リセット後スタート
public static
void main(){int a, b;........
}
CA FE BA BE
00 00 00 32
00 22 07 00
02 01 00 05
48 65 6c 6c
6f 07 00 04
01 00 10 6a
javac
copy
13年9月17日火曜日
まとめ
• Java VMをmbedやLPC81xに移植した
• mbed:D&DでJavaのバイトコードをコピー、実行
• others:バイトコードを配列にしてコンパイル
• 利点:デバイス依存なC環境が用意できない環境でも
Javaである程度の開発ができる
• ブログ:
• http://lynxeyed.hatenablog.com/
13年9月17日火曜日
ご清聴ありがとうございました
13年9月17日火曜日
ここから質疑応答用スライド
13年9月17日火曜日
RaVem JVM
• 新しいメソッドfoobarの追加
• invokestatic_callFunction (in ravem.c)
• if(strncmp(func_name,"foobar",6) == 0){.... }
• クラスファイルにフェイクでメソッドを追加
• 実動作は書かなくてよい(戻り値あるなら適当に
return NULLとでも)
13年9月17日火曜日
byte code
• バイトコードの中身
• 命令(Code Attribute)
• main method
• run method in thread
• RaVem JVMでは以下を管理
• vm_object
• start address
• end address
• num. of stack
• local registor
• thread number
CA FE BA BE........
...........................
...........................
...........................
...........................
...........................
...........................
...........................
...........................
13年9月17日火曜日
rights of Java VM
• Copyright law does not confer ownership over any and
all ways to implement a function or specification, no
matter how creative the copyrighted implementation or
specification may be.
• The Act confers ownership only over the specific way in
which the author wrote out his version. Others are free to
write their own implementation to accomplish the identical
function, for, importantly, ideas, concepts and functions
cannot be monopolized by copyright.
-- William Alsup, the judge Google v. Oracle.
13年9月17日火曜日

More Related Content

PDF
Vimから見たemacs
PDF
Vim = VM
PDF
neovim = VM
PDF
暗黒美夢王とEmacs
PDF
我が evil-mode を嫌いな理由 〜evil-mode の闇〜
PDF
Unite vim
ODP
Ultimate completion environment with neocomplcache in vim
PDF
JasmineによるJavascriptテスト駆動開発
Vimから見たemacs
Vim = VM
neovim = VM
暗黒美夢王とEmacs
我が evil-mode を嫌いな理由 〜evil-mode の闇〜
Unite vim
Ultimate completion environment with neocomplcache in vim
JasmineによるJavascriptテスト駆動開発

What's hot (20)

ODP
modern X86 environment
PDF
neobundle.vimについて+おまけ
PDF
うわ…私のEmacs力、低すぎ...?
PDF
Php beginnerが beginner + になるための話
PDF
ほんとにあったphantomjsのコワい話
KEY
WebRTCでドラゴンボールごっこ
PDF
Shougoの開発環境
PDF
Zoom上にタイマーを表示させる
PDF
すごいVimでhaskellを書こう@なごやまつり
PDF
WebAssemblyの紹介
PDF
Vim の開発環境
PDF
Ad stirの裏側
PDF
20150523
PPT
Flash Playerの作り方
KEY
EmitJSの環境をちょこっと調べた
PDF
PDF
かなりすごい発表(かなり) at VimConf2014
PDF
コンパイラ指向ReVIEW
PDF
RVM with Server Environment
PDF
Javaに這いよる.NET
modern X86 environment
neobundle.vimについて+おまけ
うわ…私のEmacs力、低すぎ...?
Php beginnerが beginner + になるための話
ほんとにあったphantomjsのコワい話
WebRTCでドラゴンボールごっこ
Shougoの開発環境
Zoom上にタイマーを表示させる
すごいVimでhaskellを書こう@なごやまつり
WebAssemblyの紹介
Vim の開発環境
Ad stirの裏側
20150523
Flash Playerの作り方
EmitJSの環境をちょこっと調べた
かなりすごい発表(かなり) at VimConf2014
コンパイラ指向ReVIEW
RVM with Server Environment
Javaに這いよる.NET
Ad

Viewers also liked (20)

PPT
Desenvolvimento ágil de software
PDF
Anais_2008
DOCX
Propuesta final trajo final
PPTX
Presentation barreiro
PPTX
1VC TAILAN ENERGIA
PPTX
1VC RAYELLI MUSEU GEOLOGICO
PDF
SERVICOS AZLOGICA PORTUGUES
PPT
PATOGENOS DEL TRACTO URINARIO
ODP
Aplicacions portables
PPTX
Power educar
PPT
Estrategias de comunicación
PPT
Ideb2009 coletiva
PPTX
La economía
PPT
Perspectiva històrica OpenOffice
PPTX
1VF CULTURA - DIOGO
PPTX
Movimento de tierras
PPSX
Correfoc mercè 2010
 
PPT
Fotos feria UPC montaje
PPTX
Formato de audio
PPSX
T1 adaptación de cursos with audio
Desenvolvimento ágil de software
Anais_2008
Propuesta final trajo final
Presentation barreiro
1VC TAILAN ENERGIA
1VC RAYELLI MUSEU GEOLOGICO
SERVICOS AZLOGICA PORTUGUES
PATOGENOS DEL TRACTO URINARIO
Aplicacions portables
Power educar
Estrategias de comunicación
Ideb2009 coletiva
La economía
Perspectiva històrica OpenOffice
1VF CULTURA - DIOGO
Movimento de tierras
Correfoc mercè 2010
 
Fotos feria UPC montaje
Formato de audio
T1 adaptación de cursos with audio
Ad

Similar to Mbed2013 (20)

PDF
JVMの中身を可視化してみた
PDF
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
PPTX
Javaで簡単にgpgpu aparapi
PPTX
もしも… Javaでヘテロジニアスコアが使えたら…
PDF
mbedではじめる組み込みHaskellプログラミング
PDF
Var handles jjug_ccc_spring_2018
PDF
Java仮想マシンの実装技術
PDF
Maxwell と Java CUDAプログラミング
PDF
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
PPTX
x86-64/Linuxに独自メモリ空間を勝手増設
PPTX
x86-64/Linuxに独自メモリ空間を勝手増設
PDF
NPAPIを使ったandroid標準ブラウザの拡張方法
PDF
20160924 mbed elementary Workshop
PDF
Xbyakの紹介とその周辺
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
PDF
Let's play with Goldfish
PDF
Versatil Javaチューニング
PDF
Android binder-ipc
KEY
関東GPGPU勉強会 LLVM meets GPU
PDF
JVMの中身を可視化してみた
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
Javaで簡単にgpgpu aparapi
もしも… Javaでヘテロジニアスコアが使えたら…
mbedではじめる組み込みHaskellプログラミング
Var handles jjug_ccc_spring_2018
Java仮想マシンの実装技術
Maxwell と Java CUDAプログラミング
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
NPAPIを使ったandroid標準ブラウザの拡張方法
20160924 mbed elementary Workshop
Xbyakの紹介とその周辺
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Let's play with Goldfish
Versatil Javaチューニング
Android binder-ipc
関東GPGPU勉強会 LLVM meets GPU

Mbed2013