Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

あなたの子供の頃の夢は?

Slide 3

Slide 3 text

自由にファミコンで遊びたい!

Slide 4

Slide 4 text

ゲームを作ってみたい!

Slide 5

Slide 5 text

FAMILY BASIC 憧れのファミコンを使ったプログラミング環境

Slide 6

Slide 6 text

無いなら、自分で作 ってみる?

Slide 7

Slide 7 text

あなたも mrubyで 自分のハードウェアを 作れます!

Slide 8

Slide 8 text

自己紹介 Katsuhiko Kageyama “kishima” @ twitter/github • Embedded software engineer in a manufacturing company • Making mruby devices • Personally, producing technical books about mruby and original devices in TechBookFest, Comic Market and Maker Faire(2020 Tsukuba).

Slide 9

Slide 9 text

MY DEVICES MY HOBBY

Slide 10

Slide 10 text

目次 • どうやってコンピュータを作るのか? • なんでmruby? • mrubyを使う上での技術的なポイント

Slide 11

Slide 11 text

開発の目標 • FamilyBasicのように、 Rubyのコードを実行でき るミニマムなコンピュー タを作ること。 • それは“Family mruby”

Slide 12

Slide 12 text

どうやってあなたのコンピュータを作るのか? 用件定義 部品選定 回路設計 基板の製造 ソフトウェア の実装

Slide 13

Slide 13 text

用件定義 部品選定 回路設計 基板製造 ソフトウェアの実装 一つ一つのステップは、ソフトウェアエンジニアなら、 そこまで難しくないはず(と私は思います) それはあなたのアイデア次第 要件を満たせる部品を探します。DigiKeyなどは世界中で 利用できるよいECサイトです。 回路図設計にはフリーで強力なソフトウェアが利用で きます。KiCADはおすすめの一つです。 中国の会社であれば 5$ / 5 枚で基板製造できます (2019頃の話) 最後に基板上で動かすソフトウェアの実装です

Slide 14

Slide 14 text

アプリケーションをRubyで書こう! • Rubyが好きです • Cのコードをコンパイルして、HWに焼き込むのをただ待 つ時間が好きな人はいません • 小さなデバイスには、簡潔に書ける言語がよいでしょう

Slide 15

Slide 15 text

なぜmruby? • mrubyはメモリが少ない環境でも動かすことができま す (>400KB RAMが望ましい@2019)‥2023はさら に進歩してます! • mrubyのVMはCRubyに比べればとてもシンプルなの で、自力での移植も可能です

Slide 16

Slide 16 text

コアプロセッサの選定 Board MCU ROM size RAM size Arduino ATmega328p 32KB 2KB ProMicro ATmega32U4 32KB 2.5KB ESP32 dev board ESP32-WROOM-32 4MB 520KB ESP32 dev board ESP32-WROVER-B 4MB 8MB Raspberry Pi zero ARM1176JZF-S >1GB (external) 512MB (external) *mruby requires >400kB memory

Slide 17

Slide 17 text

要件定義 回路図 基板製造

Slide 18

Slide 18 text

基本的なソフトウェアの実装 • 小さなプロセッサはLinuxのようなリッチなOSをサポ ートしません • C, C++ が一般的なです • C/C++を完全に避けることは難しいです。プロセッ サのSDKなどがC/C++で提供されることが多いため

Slide 19

Slide 19 text

ぼくのかんがえた:システム構成図 Dev host ESP-IDF my device ESP32 Arduino core FabGL mrbgem fro esp32 mruby compiler/VM mruby user App System App (C++) family_mruby Micro SD xtensa tool chain Serial communication PS/2 key board ESP32-WROVER-B Updating software Active speaker VGA monitor

Slide 20

Slide 20 text

ぼくのハードウェア • 中国の会社に製造を 委託 • ケースは自分の3D プリンタで印刷

Slide 21

Slide 21 text

実装の難しさ •限られたメモリ • 常に使えるメモリのことを意識しながら実装しないといけない • Rubyオブジェクトを大量に生成するのはさける、など •限られた性能 • なるべくHWが提供する機能(割り込み、DMAなど)を利用する

Slide 22

Slide 22 text

割り込み HW割り込みは、HWからのイベン トを受け取るのに適した方法 CPU Button 電気的信号 Function A (running) Function B (Interruption handler) 割り込み信号とトリガーとして、CPUが実行中の処理から割 り込みハンドルの処理にスイッチさせます

Slide 23

Slide 23 text

mrubyはハードウェア割り込みを管理 できない • 割り込みハンドから直接VMのリソースを触ることはできない(メソッドの実行など) • ハンドラは高い優先度を持つが、mrubyは割り込みアクセスを想定していない • 簡単なのはポーリング待ち loop do if Input::available if Input::keydown?(Key::K_UP) my=-2 end if Input::keydown?(Key::K_DOWN) my=2 end end sp.move(mx*1,my*1) end Checking inputs in a loop • CPU性能が限られた環境ではベストなやり 方では無い

Slide 24

Slide 24 text

ソフトウェアレベルの割り込み • 妥協案としての割り込み管理 • 似たような発想で、eLuaやMicroPythonも対応している https://github.com/kishima/mruby-interrupt CPU Button 電気信号 Function A (running) Function B (Interruption handler) mruby VM mruby VM がポーリングして イベントを回収 events ハンドラに発生したイベ ントを貯める Example:

Slide 25

Slide 25 text

実装(実験的) * vm.c * #ifndef MRB_SW_INTERRUPT #define CASE(insn,ops) L_ ## insn: pc0=p c++; FETCH_ ## ops (); L_ ## insn ## _BO DY: #else #define CASE(insn,ops) L_ ## insn: pc0=p c++; exec_interrupt(mrb); FETCH_ ## ops (); L_ ## insn ## _BODY: #endif * vm.c * #ifdef MRB_SW_INTERRUPT static void exec_interrupt(mrb_state *mrb){ if(!mrb->interrupt_func) return; while( !(mrb->interrupt_flag & 0x8000) && mrb- >interrupt_flag & 0x7FFF){ for(int i=0;i<16;i++){ int bit = (mrb- >interrupt_flag >> i) & 0x0001; if(bit){ mrb->user_mutex_func(mrb,1); uint16_t backup = mrb->interrupt_flag; mrb- >interrupt_flag |= 0x8000; //Interrupt flag mrb->interrupt_func(mrb,i); mrb->interrupt_flag = backup; mrb->interrupt_flag &= ~(1 << i); mrb->user_mutex_func(mrb,0); } } } } #endif exec_interrupt() がmrubyバイトコード が実行されるたびに呼び出される

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

まとめ •僕たちは自分の欲しいデバイスを作ることが できる! •Family mrubyを作った •ソフトウェア割り込みはmrubyとHWを組み 合わせて使うのにはよいアイデアのはず •DIYを楽しもう! https://kishima.github.io/family_mruby/

Slide 28

Slide 28 text

THANK YOU!