Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Now is the time to create your own (m)Ruby computer

Katsuhiko Kageyama
January 11, 2024
29

Now is the time to create your own (m)Ruby computer

Katsuhiko Kageyama

January 11, 2024
Tweet

Transcript

  1. 自己紹介 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).
  2. 用件定義 部品選定 回路設計 基板製造 ソフトウェアの実装 一つ一つのステップは、ソフトウェアエンジニアなら、 そこまで難しくないはず(と私は思います) それはあなたのアイデア次第 要件を満たせる部品を探します。DigiKeyなどは世界中で 利用できるよいECサイトです。

    回路図設計にはフリーで強力なソフトウェアが利用で きます。KiCADはおすすめの一つです。 中国の会社であれば 5$ / 5 枚で基板製造できます (2019頃の話) 最後に基板上で動かすソフトウェアの実装です
  3. コアプロセッサの選定 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
  4. ぼくのかんがえた:システム構成図 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
  5. 割り込み HW割り込みは、HWからのイベン トを受け取るのに適した方法 CPU Button 電気的信号 Function A (running) Function

    B (Interruption handler) 割り込み信号とトリガーとして、CPUが実行中の処理から割 り込みハンドルの処理にスイッチさせます
  6. 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性能が限られた環境ではベストなやり 方では無い
  7. ソフトウェアレベルの割り込み • 妥協案としての割り込み管理 • 似たような発想で、eLuaやMicroPythonも対応している https://github.com/kishima/mruby-interrupt CPU Button 電気信号 Function

    A (running) Function B (Interruption handler) mruby VM mruby VM がポーリングして イベントを回収 events ハンドラに発生したイベ ントを貯める Example:
  8. 実装(実験的) * 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バイトコード が実行されるたびに呼び出される