福野泰介の一日一創 - create every day

進む、jigインターン2019の選考プロセス。面接で好きなプログラミング言語を聞いて、C言語と答える高専生は割と多い。 黒い画面にテキストで動く地味なプログラム、それで楽しさは伝わるのだろうか?

中学生の頃、その頃のパソコン好きが辿った、BASIC、Z80マシン語の次のC言語。妙に気に入ったのが、ファイル変換プログラム。バイナリデータをテキストに変換するプログラム(matsumoto)や、K&Rスタイルしか対応していなかったMSXのC言語をモダンに使えるように変換するプログラムなど、BASICでは遠かった実用性を感じて感動。

時は現代、IchigoJamβのバグフィックス。C言語なくてはありえない24KBのOSづくり。スクリプト言語ではランタイムが収まらず。マシン語で書くには複雑すぎる。 C言語の魅力は、生成されるマシン語が想像でき、コンピューターの本来の力をほぼ最大限に引き出してあげられてる感にある。

コンパイラが生成したLPC1114用24KBのバイナリをAPI追加するポストプロセス。インテルHEXファイルに反映し忘れていた不具合を直すため、変換プログラムを書く。 RubyでもPythonでもJavaでもJavaScriptでも書けるが、エコなC言語が気持ちいい。このくらいの規模だと、自作コンパイラでも手が届く。


「bin2hex.c - バイナリデータからインテルヘックスファイルへの変換プログラム in C」

このプログラムを使ってできあがったもの
IchigoJam 1.3.2β15 - 「ichigojam-1.3b15.zip
(USキーボードで効かないキーがあった不具合修正、HEXファイルでAPIが使えない不具合修正)

API呼び出しサンプルプログラム RNDを使ったサイコロプログラム(for IchigoJam 1.3.2b15)

10 LET[0],#21C0,#8809,#4708:?USR(#800,6)+1 RUN 5

地味ゲー好きだとカミングアウトしてくれた鯖江の少年に後押しされて誕生したIchigoJam。 自動運転、キラキラVR、ロボット、ドローンなど、派手な応用領域も地味なファイル変換も根っこは同じ、コンピューターとの対話、プログラミング。


福井県小中学生 プログラミング・フェス
福井新聞との取り組み、小中学生プログラミングフェスも4年目!
今年の舞台は禅のふるさと、福井県永平寺町の曹洞宗の大本山、永平寺。
座禅とプログラミングで、自分自身をアップグレードし続ける楽しさに気づけるか!?

去年大活躍した、自分でプログラミングする自動運転車「らでぃっしゅ」今年も登場!


プログラミングフェス2018の様子を、福井県町の岩田さんが取材してくれた様子。
体当たり撮影「すごい」県庁職員 福井県広報課の岩田早希代さん | 政治・行政 | 福井のニュース | 福井新聞ONLINE

伝えよう、世界中のどこにもないものを創り出せるワクワク感。

links
- 福井県小中学生 プログラミング・フェス

bin2hex.c

#include <stdio.h> void out(int address, char* buf, int nbuf) { int crc = nbuf + address + (address >> 8); printf(":%02X%04X00", nbuf, address); for (int i = 0; i < nbuf; i++) { printf("%02X", buf[i] & 0xff); crc += buf[i]; } printf("%02X\n", -crc & 0xff); } int main(int argc, char** argv) { char buf[16]; int nbuf = 0; int address = 0; for (;;) { int c = getchar(); if (c == EOF) { if (nbuf > 0) { out(address - nbuf, buf, nbuf); } printf(":00000001FF\n"); break; } buf[nbuf++] = (char)c; address++; if (nbuf == 16) { out(address - nbuf, buf, nbuf); nbuf = 0; } } return 0; }

IchigoJamのCPU、LPC1114 Arm Cortex-M0のマシン語には、割り算命令がありません。
参考:マシン語表Cortex-M3以降にはあります SDIV/UDIV)

無いものは作ればOK!(IchigoJamでのR3はここでは封印

N / M = A ... R(A:商、R:あまり、ただしNもMも正の整数とする)という割り算をする場合、割り算記号を使わずに作成できればOKです。何か、得意な言語で作ってみましょう。

例えば、IchigoJam BASICなら

10 INPUT N 20 INPUT M 30 A=0 40 N=N-M:IF N>=0 A=A+1:CONT 50 N=N+M 60 ?A;"...";N RUN ?300 ?7 42...6

割り算記号を使わない割り算、できました!

これをasm15マシン語にします(USRでは引数が1つなので、割る数R1に7と設定)

R1=7 R2=R0 R0=0 @LOOP R0+=1 R2=R2-R1 IF GE GOTO @LOOP R0-=1 R1=R2+R1 RET

アセンブルしたバイナリ(18byte、R1設定を除くと16byte)を使って、動かしてみましょう

POKE#700,7,33,2,70,0,32,1,48,82,26,252,218,1,56,81,24,112,71 ?USR(#700,300) 42

これで完成! ・・・としてもいいのですが、割られる数が大きくて、割る数が小さい時、何万回もループすることになって遅そうです。

例えば、30000/1を計算する場合、1ループ5cycle3万回で15万cycle。CPUの周波数48MHzの逆数、21nsecが1cycleにかかる時間なので、63万nsec = 630usec = 0.63ミリ秒かかります。 足し算引き算かけ算の15万倍も遅いとなると、高速処理が命のゲームで使うには厳しいこともありそうです。

そこで登場、アルゴリズム(問題解決手法)!

ひとまず簡単に思いつくところで、2進数を使った筆算アルゴリズムで高速化してみます。 割り算を手で計算するときに筆算を使うように、大きな桁からかけ算して引いてを繰り返して答を求めます。 幸い、2進数の筆算は0か1かしかないので、とってもシンプル。何か書きやすいプログラミング言語でアルゴリズムを確かめます。

10 INPUT N 20 INPUT M 30 A=0 40 FOR I=10 TO 0 STEP -1 50 L=M<<I 60 IF N>=L N=N-L:A=A+1<<I 70 NEXT 80 ?A;"...";N RUN ?300 ?7 42...6

(変数が16bit用に、IchigoJam BASIC桁溢れ防止のため10bitシフトからスタート)
前の手法に比べて速くなったことが体感できましたね?では、こちらをマシン語にします。

R1=7 PUSH {LR,R4} R2=R0 R0=0 R3=16 @LOOP R4=R1 R4<<=R3 R2-R4 IF LT GOTO @SKIP R2=R2-R4 R4=1 R4<<=R3 R0+=R4 @SKIP R3-=1 IF !MI GOTO @LOOP R1=R2 POP {PC,R4}

ループ回数が16回にまで劇的に減り、先の最悪の場合と比較し、約1000倍高速です!

ただし、その代償として、マシン語の量が32byteと16byte増えてました。これが多いか少ないかは状況次第です。 また、割る数と割られる数が近い場合は毎回150cycleかかる今回の手法と違って、単純ループの実装の方が速かったりします。 状況によって使い分けましょう。

OSとしてのIchigoJamとしては、汎用的に使われることを想定して、あまりに遅い除算は残念なので、第二案でいきたいです。 ただ容量は極力小さくしたいので、かけ算が1cycleで動くことを利用して、もうひと工夫縮めてみます。

R1=7 PUSH {LR,R4} R2=R0 R0=0 R3=1 R3=R3<<16 @LOOP R4=R1 R4*=R3 R2-R4 IF LT GOTO @SKIP R2=R2-R4 R0+=R3 @SKIP R3=R3>>1 IF !0 GOTO @LOOP R1=R2 POP {PC,R4}

2byte縮み、引き算する場合のcycleが2減りました!
たった2byteと笑うかもしれませんが、その2byteを削るのに結構苦労したりするんです。

POKE#700,7,33,16,181,2,70,0,32,1,35,27,4,12,70,92,67,162,66,1,219,18,27,24,68,91,8,247,209,17,70,16,189 ?USR(#700,300) 42

実は、まだ落とし穴があります。マイナスの値で割り算の計算をさせてみてください。
おかしくなりますね。また、割る数に0を指定した時にどんな動きをしてほしいですか?
すべては、あなたの思い次第!

より高速で効率良いアルゴリズムを探してみるのも楽しそうです。Wikipediaの「除算」を見てみると、懐かしの割り算バグありPentiumの話がでてました。 試行錯誤の積み重ねで、今のコンピューター社会ができていることがわかります。

- 連載、IchigoJamではじめる、Armマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語
8. アセンブラを使って楽しよう
9. マシン語で高速SPI
10. マシン語を制するもの時間を制す
11. 画面をイチゴで埋め尽くす12の方法
12. レジスタ不足に上位レジスタとスタック操作
13. コンパイラはじめのいっぽ、EVAL実現法とマシン語生成
14. サイズを取るかスピードを取るか、割り算のアルゴリズムとマシン語実装
15. マシン語化で1万倍速!? セットで学ぶアルゴリズムとコンピューター

IchigoJam 1.3で容量を使い切ってしまって不具合修正もできず困っていた中、C言語で書く例外処理を学んだ結果、容量の大幅圧縮に成功。なんと、864byte空きました。


複雑な計算式で計算用のメモリが溢れた際「Complex expression」の代わりに「Segmentation Fault」が発生します。たまに、当たりどころが悪く(?)固まってしまうことがあるようなので、要調査。割込中の割込じゃないかと予想。

?((((15)))) Segmentation Fault

マシン語でROM領域であるアドレス0へ無理やり書き込んでみます。 [R0]=R0; RET (asm15)

10 POKE #700,0,112,112,71 20 ?USR(#700,0) RUN Segmentation Fault

落ちません!マシン語の敷居がちょっと低くなりました。
はじめてのマシン語 - IchigoJamではじめるArmマシン語その1

LPC1114の4KBのRAMの使い方が変わって、スタック、仮想RAM、システム用データ、IAP用領域の順となっています。詳細は、以前のバージョンのメモリマップも合わせてご参照ください。
IchigoJam BASIC RAM 4kbyte のつかいかた(メモリマップ)


先日、IchigoJamでプログラミングを紹介に伺った、ネパールの学校「SHREE MADAN-AASHIRIT ADARSHA BASIC SCHOOL」より、ステキな証明書が届きました! ありがとうございます!
Let's get smiles of kids! Programming for students of Tribhuvan University in Nepal
世界中のこども達向けに、もう一弾、更なる改善が図れそうです!

IchigoJam 1.3 beta 7 のダウンロードはこちらからどうぞ。
ichigojam-1.3b07.zip
問題報告やご要望、ぜひお送りください! → IchigoJam-FAN on Facebook / #IchigoJam on Twitter

24KBに、ギリギリまで詰め込んだOS、IchigoJam BASIC。でも、もうちょっとだけ改善したい!

ということで、気になっていた4KBのRAM、特にスタックの使い方にメスをいれてみました。

普段使うMacやWindowsやLinuxに組み込まれている、怪しいアプリに大事な情報をアクセスさせないための基本機能。 RAM(LPC1114FDH28では4KB)の範囲を超えると一般保護違反として、例外「HaldFault」が発生します。

プログラマーなら押さえておきたい、基本データ構造のひとつ、後入れ先出し(LIFO)のスタック。 IchigoJamのCPU、LPC1114のアーキテクチャ、Cortex-M0のスタックは、使うほどにアドレスが小さい方向に動いていきます。 現状のIchigoJamの実装では、スタックがどのくらい使われるかはBASICで記述する数式に依存するので、超えないように時々監視しながら、Comprex expression エラーを出しています。ただ、やり口、速度面、プログラム量の面で、ちょっと不格好な点、実は気にしていました。

そこで今回、スタックの領域を一般的なRAMの後ろではなく、先頭側におき、RAMの領域を超えた際に発生する例外をうまいこと使おうという作戦。


ということで、まずはミニマムに実験! 再帰呼び出しでスタックを使い切ったら、soft_entryからリスタート!成功です。 スタート直後、わざとROM領域に書き込もうとして、例外を発生させ、スタックポインタを初期化してスタートする雛形ができました。

#include "LPC1100.h" static inline void led(int n) { GPIO1MASKED[1 << 5] = n << 5; } static inline void wait(int n) { for (volatile int i = 0; i < 50000 * n; i++); } void job(int n) { for (;;) { led(1); wait(1); led(0); wait(1); job(n++); // 再帰でstack溢れ -> HardFault -> soft_entry } } void soft_entry() { // ここからリスタートする wait(10); job(0); } void main() { // Reset_Handlerから呼び出される IOCON_PIO1_5 = 0x000000d0; GPIO1DIR = 1 << 5; *(char*)0 = 0; // アクセス違反 -> HaldFault -> soft_entry } void HardFault_Hander() { // 一般保護違反 RAMの範囲を超えたアクセスなど uint32_t* sp; // = 0x10000000 + 1024 - 32 __asm( "mov r1, #1\n" "mov %0, r1\n" "lsl %0, %0, #18\n" "add %0, %0, r1\n" "lsl %0, %0, #10\n" "sub %0, %0, #32\n" "mov sp, %0\n" : "=r" (sp) ); *(sp + 6) = (uint32_t)(void*)soft_entry; // set PC *(sp + 7) = (1 << 24); // need to set PSR, Thumb mode }

スタックを使い切ってしまっているので、通常の割り込み時にセットされているはずのデータはありません。なので、スタックを初期化して、復帰用のデータを捏造しています。 副次的に、Armマシン語でミスした際にも、復帰できる確率が上がって、よりプログラミングを楽しめるかも!? IchigoJamへの組み込み、がんばります。
はじめてのマシン語 - IchigoJamではじめるArmマシン語その1

子供も大人も楽しい学びの場、地域ICTクラブ!
入り口は広くやさしく、でも、とんでもなく深く広いIT/プログラミングの世界、じっくりみんなで楽しみましょう!


今年の福井こどもプログラミング協議会、ますます楽しくなりそうです!
Thanks: 蕎麦と旨酒と 亀蔵 - 福井県鯖江市

Maker Faire Kyoto 2019の戦利品、IchigoJam Things の組み立て方、紹介!
ただし、うっかり黄色い5Pピンソケットの向きを逆にする失敗をしたときの写真になっているので、要注意!

IchigoJam Things とは、Raspberry Pi Zeroの発表にインスパイアされて 2017年に発表。
IchigoJam Zero the World's Lightest PC 0g 150yen for IchigoJam Things!
チーム伊勢から晴れて、製品化となりました!


IchigoJam Things パーツ一式。はんだづけしやすい、DIP部品ばかりでこどもにもやさしい!


こちら IchigoJam Things! 表面実装のCPU、LPC1114FDH28ははんだづけ済み!


まずは抵抗、R1からR5をはんだづけ。(向きはないですが、揃えておくと気持ちいい)
R1 黄紫茶金 470Ω
R2 茶黒茶金 100Ω
R3 赤赤橙金 22kΩ (I2C用プルアップ抵抗、IchigoJamでは未実装)
R4 茶黒赤金 1kΩ (LED用電流制限抵抗、IchigoJamでは330Ω)
R5 茶黒緑金 1MΩ


次に低い部品、microUSBをはんだづけ。挿して、手で押さえつつひっくり返し、押さえつけながらはんだづけ。はんだを多めに流し込む。 またひっくり返して、伸びた足2本もはんだづけ。microUSBの側面、表からもはんだづけで補強しておくと安心。


15pFのコンデンサ(1uFのコンデンサと間違い注意)とクリスタル12MHzをはんだづけ。


10uFのコンデンサ、足をペンチで伸ばしてあげると、基板にぴったりつけられます!
(曲げずに広い方の穴を使うのもOKですが、CN5のピン名が見えづらい? 106は、10x10の6乗(pF)の意味)

LCDと書かれた、液晶用ピンをピンヘッダーや、L字ピンヘッダー、ピンソケットなどをつける場合は、USB端子を付ける前に!
低いピンソケットがオススメ! シングルピンソケット 低メス 14P20Pを8Pにカットし裏面からはんだづけし、ショートしないように、表面のはみだした分をカットしておく。


USBコネクタは基板面に水平に、基板に接しない用に注意!
3端子レギュレーターは、向きと差し込む場所に注意!
2列ピンソケットは、シールが貼ってあるので向き注意!2つ並んだ3.3VがmicroUSB側を向けます。


タクトスイッチ(BTN)とリセットスイッチをはんだづけ。
ぴったりサイズなのでひっくりかえしても安定、はんだづけしやすい!


LEDは向きに注意、足の長いほうが +。電源用スライドスイッチをはんだづけ。
そして、CN5の5ピン、ピンソケットのはんだづけ。
実はこの時は気がついてませんでしたが、上下逆です。写真は間違ってます!!


キーボード、テレビ、電源をつないでスイッチON、動いた!エルチカできた!
・・・その後、I2C端子にVFDをつないで、コンパクトなカウントダウンタイマーを・・・と思って、間違って接続して、CPUを壊してしまいました。

10 [0]=180 20 R=I2CW(8,#800,2):WAIT60 30 [0]=[0]-1 40 IF [0]>=0 GOTO 20 50 PLAY "L16CDEFG"

IchigoJamから操る4桁7セグVFD表示器、はじめてのArduinoでI2Cスレーブ開発

壊してしまった IchigoJam Things、残念ですがせっかくなので後付液晶改造を紹介。

任意長ピンソケットの作り方。必要なピン数のとなりをニッパーかペンチでひっこぬく。


ひっこぬいてプラスチックだけになった部分をニッパーでまっすぐカット、できあがり!


ピンソケットにはんだをのせて(予備はんだ)


IchigoJam Things 裏面に乗せて、はんだづけ!


液晶ピン付き IchigoJam Things のできあがり!

LCDモジュール「FSTN液晶モジュール(SPI) - aitendoと接続すれば、使えるとのこと!
Maker Faire Kyotoの戦利品:IchigoJam Thingsの組み立てとLCD接続|JO3GBD - ブログ

ついに動いた、かわくだりゲーム in Ruby on Jam!

ひとまず画面出力のみ接続して、いろいろ試験中です。
mruby-L1VM、クラス対応した level 2(?) でも2.5KBで実装できました!(mruby VM level 1 in 2KB

LPC1114 IchigoJam OSが24KB、BASICプログラムの保存領域の余り3KBにmruby VMと、IchigoJam OS用のマシン語コードが収まっています。

4KBごとの書き換えに対応しているLPC1114、OSの後ろ、sector6だけ書き換えられたら速くて、OSを用意する必要もなく便利そう。

お世話になっている、lpc21ispというオープンソースな書き込みツールに、-sector オプションを追加して、プルリクも送ってみました。
taisukef/lpc21isp: lpc21isp - Portable command line ISP for Philips LPC family and Analog Devices ADUC70xx
(おまけに、うちの環境ではうまく動かない -control 用に、-controlwithoutwait オプションも追加)

バイナリデータにした軽量mrubyVM「mruby.bin」を sector6 に書き込み、IchigoJam で、LOAD0、RUNで、かわくだりゲームっぽいものを見ることができます。(カーソルがまだ効きません)

また、こちらのRubyのコード、mruby2.0.1のmrbcでコンパイルし、

cls lc 5,10 print "Hello Ruby on Jam!"

bin2basでPOKE文に変換

10 POKE#700,82,73,84,69,48,48,48,54,51,70,0,0,0,133,77,65,84,90,48,48,48,48,73,82,69,80,0,0,0,103,48,48 20 POKE#720,48,50,0,0,0,182,0,1,0,5,0,0,0,0,0,29,16,1,46,1,0,0,16,1,11,2,3,3,10,46,1,1 30 POKE#740,2,16,1,79,2,0,46,1,2,1,55,1,103,0,0,0,1,0,0,18,72,101,108,108,111,32,82,117,98,121,32,111 40 POKE#760,110,32,74,97,109,33,0,0,0,3,0,3,99,108,115,0,0,2,108,99,0,0,5,112,114,105,110,116,0,69,78,68 50 POKE#780,0,0,0,0,8

これをUSBシリアル経由でIchigoJamへ書き込み、RUNすると、画面にでます!

Let's play with Ruby on Jam!

I implemented mruby VM level 1 in 2KB ROM! Also runs on IchigoJam.
ROM2KBで動く極小 mruby-L1VM を作りました! IchigoJam でも動きます。


C言語で拡張するIchigoJam BASIC」と組み合わせて Ruby on Jam! IcihgoJam上でもこのRubyプログラムのバイナリ版、ROM容量2KBで動きました。
Ruby on Jam in ROM2KB! with bas2bin for 3KB asm

a = 100 sum = 0 while a > 0 sum += a a -= 1 end sum

sum.rb として保存したRubyファイル。mruby-2.0.1 のコンパイラ、mrbc を使って、mrbファイルを作って、mruby-L1VMへセットすればOK。(localvariableは不要なので、 --remove-lv オプションを付けて軽量化しておきましょう)
make mrb by mrbc (mruby 2.0.1), and set to mruby-L1VM.

mrbc --remove-lv sum.rb

とっても短いので、VMやコンパイラ学習用にもオススメ! メモリはすべてスタック管理なので組込の長時間運用にも向いてます。
I recommend you to learn about the VM and the compiler. No dynamic alloctations.

src on GitHub
mruby-L1VM: mruby VM implementation in 2KB ROM

人気のかわくだりゲームのRuby版はVM的には動作OK! IchigoJamと接続トライしてみます。
"Kawakudari (Rafting game)" famous game on IchigoJam also works it. I'll try to connect to IchigoJam.

cls; x=15 while true lc x,5; print "O" lc rnd(32),23; print "*" wait 3 k=inkey() x=x-(k==28?1:0)+(k==29?1:0) if scr(x,5)!=32 break end end

まったさん、スタンドアローン型Rubyの第一バージョン公開!
Mr. Matta publish the Ruby on Jam standalone edition!

- IchigoJam機で動く Ruby 、Lチカ成功! – about yrm

links
- Ruby on Jam! IchigoJamで動くROM8KBのミニ Ruby VM と、mruby ver2.0対応はじめのいっぽ - mmruby for LPC1114

mrubyのmgemのように、IchigoJamをC言語で拡張する方法をつくりました。
最大バイナリサイズ、なんと3KB!

IchigoJamのプログラムは、USBシリアル経由でターミナルなどで接続すれば、PS/2キーボードやテレビを用意することなく、らくらく開発! 完成したプログラムをサクっと転送するのに便利なツール「bas2bin for IchigoJam

これを使えば、BASICのファイルをIchigoJamに書き込むバイナリファイルにできるので、4ファイルまとめて書き込めるので、ワークショップ用などでまとめて準備する時、実製品として出荷するときなどに便利です。(初公開は2016/2/28

今回、C言語でつくったマシン語プログラムをIchigoJamのファイル1〜3へ書き込み、呼び出すマシン語プログラムを追加開発!

bas2bin/src/main.c の、main関数を使って開発し、ファイル1-3の3KBへ書き込んだプログラムを、ファイル0に書き込んだ起動用マシン語が入ったBASICプログラムから呼び出します。

__attribute__ ((section(".MAIN"))) int main(int param, int ram, int rom, int (*divfunc)()) { //return param + 1; return divfunc(100, param); // == 100 / param }

* 割り算はIchiogoJam内のバイナリを使えるので、400byte節約できます。

呼び出し用、ファイル0におかれる IchigoJam BASICプログラム (entry.bas)

1 '3KB asm 10 POKE#700,3,180,5,73,8,120,1,40,0,208,4,73,5,49,139,70,3,188,88,71,112,71,0,0,0,100,0,0,0,116,0,0 20 ?"100/3=";USR(#700,3)

実行すると、100/3の「33」と表示され、無事マシン語が呼び出されたことを確認できます。

IchigoJamはOSサイズ24KB、LPC1114FDH28のROMサイズ32KBの後ろ8KBをユーザーファイル用としています。 残念なことに4KB単位でしか消去できないので、1KB x 4のユーザープログラムを交互に書き込む仕組みになっています。

この後ろ3ファイル、3KBにマシン語をおき、25KB目か29KB目のどちらかマシン語がある方を呼び出しています。 FILESで見ても、1-3は何もでなかったりおかしな表示になる部分が、マシン語です。 先頭4byteを使って、マシン語が書き込まれているかどうかを判定しているので、厳密には3068byte(3KB-4B)まで。 利便性を削って、ファイル0の領域にも食い込ませれば、約4KB使ったオールマシン語プログラムも!

IchigoJam、どんな拡張しましょう!?
初回起動時に動く、すごいデモプログラムを作るのも楽しいかも!

bas2bin for IchigoJam - src on GitHub

呼び出し用のマシン語プログラム、asm15ソースがこちら (entry.bas)

PUSH {R0,R1} R1=[@FILE1A]L R0=[R1] R0-1 IF 0 GOTO 2 R1=[@FILE1B]L R1+=5 R12=R1 POP {R0,R1} GOTO R12 @FILE1A DATA L (24+1) * 1024 @FILE1B DATA L (24+4+1) * 1024

ファイル1の場所にマシン語があるかどうかチェックして、破壊可能なレジスタR12を使って呼び出し!

links
- USB-シリアルモジュール - ショップのふうせん
- はじめてのマシン語 - IchigoJamではじめるArmマシン語その1
- Ruby on Jam! IchigoJamで動くROM8KBのミニ Ruby VM と、mruby ver2.0対応はじめのいっぽ - mmruby for LPC1114

平成最後の一日一創、ついにIchigoJamで動いた Ruby on Jam!

IchigoJamでかんたんなRubyのコードをmrubyで中間コードにしてLPC1114用に改造したmmrubyを転送して実行! プログラムサイズが8KBしかないので、転送もサクサク。

Rubyのプログラム、転送から実行まで!

led 1 while btn()==0 end led 0 while true out 2,1; wait 10 out 3,1; wait 10 out 4,1; wait 10 out 4,0; wait 10 out 3,0; wait 10 out 2,0; wait 10 end

LEDを付けて、ボタンが押されるまで待つ。
押されたらLEDを消して、PCN金沢フルカラーLEDアクセサリーをOUT2/OUT3/OUT4でコントロール!


プログラムはパソコン上で編集する、パターン2(パソコンを持っている人向けの Ruby on Jam)


ボタン押さなくても光らせたい?
Rubyを編集して、再度コンパイルして、転送すれば、電源オンですぐに動く Ruby on Jam のできあがり!

mmruby IchigoCakeで動いたバージョンでは、52KBあったROMをダイエットして、8KBに!(主に標準ライブラリや、浮動少数ライブラリでした)

ただし、ちょっと複雑なコードになると動かなくなってしまうので、Ruby VMの理解を深めることと併せて、mruby 2.0 対応VMを作りかけてみました。 コンパクトで、コンパイラとかアセンブラとか言語とか、いろいろ勉強になって楽しいです。

src on GitHub
taisukef/micro_mruby_for_lpc1114: micro mruby VM implementation for LPC1114

links
- Ruby on Jam!? micro mruby VM for LPC1114, ひとまずIchigoCakeで動かしてみよう
- IchigoJamでRubyは動くのか?2つのアプローチとPC上試作 kawakudari.rb

IchigoJamでRubyを動かす2つ目のアプローチ、mrubyの中間コードをIchigoJamで動かすトライ、ひとまずプログラムサイズが50KB程度だったので、ROM56KB/RAM8KBのIchigoCakeで動作確認!

点滅しました!

Rubyのコードはこちら

while true led 1; wait 10; led 0; wait 10 led 1; wait 30; led 0; wait 30 end

国産プログラミング言語 Ruby の組込版 mruby、そのサブセット mruby/c を更に削った mmruby for Arduiono One を Arm Cortex-M0 のLPC1114に移植したものです。この連携連鎖こそ、オープンライセンスなオープンソースの真骨頂!

ちょっと複雑なコードにすると落ちてしまうので、まだまだ試験段階ですが、PC/Macでコンパイルして転送する基本的なところ、動きました! どこまで切り詰めてIchigoJamで動くようにするか、どういう機能を盛り込むか、削るかのバランス調整へと進みます。

VM側のコードはそのままに、中間コード(mrbファイル)やそれを変換したものだけを転送すればすばやく試せて便利そう。 使う機能に合わせてVM側のコードが自動的に生成され、小さければIchigoJamでOK、大きければIchigoCakeと変われば便利かも。 さくらインターネットのIchigoSodaと合わせて、RubyでかんたんIoTというプログラミング中級者向け大人向けワークショップも楽しいかも?

名付けて、Ruby on Jam!
Rubyで広げよう楽しいマイコン開発!

src on GitHub
taisukef/micro_mruby_for_lpc1114: micro mruby VM implementation for LPC1114

ちなみに、IchigoJam BASIC でつくるIoTは超簡単。シンプルな実装なら、その場で数行書いてデプロイ可!
大人も手軽にIoT! IchigoJam ver 1.3 は何が違うのか?>」
こどもプログラミング+IoT=大人プログラミング! 総務省 デジタル活用共生社会実現会議 ICT地域コミュニティ創造部会にて情報提供&体験会

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像