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: 蕎麦と旨酒と 亀蔵 - 福井県鯖江市

平成最後の一日一創、ついに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地域コミュニティ創造部会にて情報提供&体験会

Rubyのまつもとさん、Ruby on IchigoJamを思案!

IchigoJamのCPU、LPC1114FN28/FDH28は、Flash32KB, RAM4KB、mrubyがターゲットとするRAM400KBとは100倍の開きあり。
でも、ぎゅっとプログラミングの楽しさにフォーカスすれば、きっと、大丈夫!

まずは、IchigoJamで人気の「かわくだりゲーム」をRubyでコンパクトに書いていてみて、コンソールで動かしてみました。

「かわくだりゲーム in Ruby」 ターミナルのフォントはIchigoJamフォントに!
できたRubyのプログラムはこんな感じ。

require "./ichigoruby" 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

こちらIchigoJam BASIC版と比べてみてください。簡単にステップアップできそうですね!

10 CLS:X=15 20 LC X,5:?"O" 30 LC RND(32),23:?"*" 35 WAIT 3 36 X=X-BTN(28)+BTN(29) 37 IF SCR(X,5) END 40 GOTO 20

かわくだりゲームを手軽に動かすために、エスケープシーケンスから探し始めましたが、リアルタイムなキー入力や、画面表示場所のチェックなどで、行き詰まり、Cursesというライブラリを使いました。

gem install curses

で、cursesをインストールし、なんちゃってIchigoJam風ライブラリ「ichigoruby.rb」と共にお試しください!
IchigoRuby src on GitHub

IchigoJamでRubyを動かす、2つのアプローチ
1. IchigoJam BASIC や、IchigoLatte 同様、スタンドアローンで動かす。
2. PCでコンパイルした中間言語をIchigoJamへ転送して、動かす。

1は、エディタやコンパイラも含めて実装する必要があるので、制限が強めのRuby。 2は単純にLPC1114を使い切るC言語より手軽な中規模組み込み開発まで使えるくらいを目指せるかも?

なんと、IchigoJam / IchigoLatte でForthが動く!
LED Blinking with Forth!? Do you want “IchigoLatte Forth” which is uncompromising programming environment for IchigoJam machine? / ForthでLチカ!?IchigoJam用 超絶硬派プログラミングOS「IchigoLatte Forth」はいかが? – about yrm

きっと、まったさんが1をやってくれそうな気がするので、こちらは2の実装、やってみます!

links
- 100円マイコンを使い倒そう!たった28byteから始めるマシン語アプリ開発
- Create Happy! Ruby City Matsue 三度目の訪問

ver 1.3、ちょっとメモリの使い方を誤り、ver 1.2.3 で動いていた数式で動かない問題が発覚。

P=PEEK([0]) Complex expression

このエラーは、数式が複雑すぎる時にでるエラー。

例えば 3+(2*5) という計算をする場合、
1. まず3と、足し算する必要あり、と覚える
2. 括弧があるので、さらに2と、かけ算する必要あり、と追加で覚える
3. 5とかけ算し、10と覚える
4. 覚えていた3と足し算し、答は13
という感じのプログラムが IchigoJam BASIC というOS(オーエス、基本ソフト)の中で動いてます。

計算と記憶が得意なコンピューターくんですが、無限に記憶できるわけではありません。
IchigoJamで使える容量は、4kbyte、32768bit。3万個ちょっとの0か1のデータを記憶できます。
(4kbyte = 4 x 1024byte = 4096byte = 4098 x 8bit = 32768bit)

メモリをどのように使っているか表す図をメモリマップといいます。
IchigoJam BASIC on LPC1114 RAM メモリマップ (ver 1.3 beta 6)


計算式の中で、後から使うものはどんどんスタックに積んで、一時的に覚えていきます。
LPC1114では、スタックを末尾のアドレス 10000FDF から、小さくなる方向に向かって使っていきます。

一次記憶がどんどん溜まっていくと・・・、そう、この図でいうとI2Cバッファ、コマンドラインバッファの順に浸食していってしまうのです。 ちょっといいCPUだと、このような浸食を防ぐための仕組みがありますが、シンプルなCPU LPC1114にはありません。

そこで計算途中にスタックの今使ってるポイントをチェックして、溢れそうなら Complex expression エラーを出すように作ってあるわけです。 ver 1.3.0 では、IchigoJam BASIC OS用変数領域がちょっと大きく、そのメモリ位置をスタックのすぐ上にしてしまったことで、フリーズリスクが高まってしまっていました。 (ARM 関数呼び出し引数の渡し方 - Qiita

こちら、ver 1.3 beta 6は、上記のようにOS用のメモリの使用量をちょっと削減し、物理メモリの先頭に配置、万が一のスタック溢れにも最悪I2Cバッファやコマンドラインバッファの破壊までにとどめて、フリーズすることがある不具合を解消しました。
IchigoJam 1.3b06.zip

このようにメモリギリギリの戦いにはArmマシン語を含むコンピューターそのものの知識は欠かせません。興味がでた方、こちらからどうぞ!
Armマシン語入門

IchigoJamで活躍、100円だけど1秒に5000万回も計算しちゃうCPU、NXP社のLPC1114FN28/FDH28。

32KBのFlashROMという書き換えも可能な記憶装置を内蔵していて、そこにIchigoJam BASICというOSを書き込むことで、IchigoJamとして動いています。(別のOS、IchigoLatteを入れるとJavaScriptが使えます!)

通常は、FlashROMに書き込むプログラムをC言語を使って開発しますが、Armマシン語を使って最小の開発環境づくりに挑戦、一応エルチカすることに成功!

FlashROMの先頭、アドレス0番から4byteにスタックの初期アドレス、その後にリセット時(電源投入時)に実行するアドレス、更に様々な割込に対応するアドレスが続く、192byteのvectorsという領域があり、その後プログラムが通常続きます。

リセット時以降、割込を使わなければその領域もプログラムに使っても大丈夫かも?ということで、実験してみました。

DATA L #10001000 DATA L #00000009 R1=[@GPIO1DIR]L R0=`100000 [R1]=R0 R1=[@LED]L [R1]L=R0 GOTO 0 @GPIO1DIR DATA L #50018000 @LED ' PIO1_5 DATA L #50010080

RAMは#10000000からの4KBなので、後ろから順に使うスタックをその一番後ろ、#10001000と設定します(ISPコマンドを使う場合は32byte空けましょう)。

続いての#9は、その後アドレス8から始まるプログラムの先頭にマシン語のThumb-2として呼び出すことを示すために1を足した、アドレス9を指定します。

以後は、通常通りマシン語でプログラムを作りますが、起動直後LEDが接続されているPIO1_5は入力になっているので、GPIO1DIRを使って出力に切り替えるコードを追加します。 これでLEDを光らせるプログラムができました!

リセットされた時に呼び出されるプログラムは帰る場所がないので、終了はRETではなくGOTO 0と無限ループにしておきます。

asm15 assemblerにhex出力機能を追加したので、hex fileとして出力したものを、lpc21ispなどを使って書き込むと点灯成功!

:100000000010001009000000024920200870024979 :0C0010000860FEE70080015080000150F5 :00000001FF

わずか28byteととってもコンパクトに開発できるので、IchigoJamを開発機として、マイコンや別のIchigoJamに書き込んで使うこともできそうです!

せっかくなのでマシン語でエルチカしてみましょう。もっとすっきり書けそうですが、何かの不具合で短くするとうまくいかない点は要調査です。(誤り発覚、最小は32byteでした

DATA L #10001000 DATA L #00000009 R1=[@GPIO1DIR]L R0=`100000 [R1]=R0 R2=0 R1=[@LED]L @LOOP [R1]L=R0 R7=[@WAITCNT]L R6=R7 R6-=1 IF !0 GOTO -1 R2=0 R1=[@LED]L [R1]L=R2 R6=R7 R6-=1 IF !0 GOTO -1 GOTO @LOOP @GPIO1DIR DATA L #50018000 @LED ' PIO1_5 DATA L #50010080 @WAITCNT DATA L 3000000

クロックは初期設定時は内蔵IRCを使った12MHz動作なので、1回4cycleかかるループを、300万回まわすことで、1秒置き点滅が実現できました!

LPC1114ベアメタルなエルチカ!アフリカ上空にて

普通の開発環境を一切使うことなく、マイコン開発ができたので、次は、IchigoJamだけで行うマイコン開発に挑戦です!

IchigoJam-FANにて、IchigoJamの拡張版にほしいものを大募集した結果、たくさんのご要望いただきました!

1. プログラム領域拡大 112票
2. HDMI 69票
3. USBキーボード(HIDサポート) 69票
4. カラー化 30票
5. キーボードUS/JP切替 29票
6. 浮動小数点 25票
7. 長い変数名 17票
8. グラフィック描画機能 16票
9. バッテリーバックアップの時計 15票
10. ネットワーク 15票
*アンケートよりトップ10を抜粋、複数回答あり

断トツナンバーワンだった、プログラム領域拡大。
ちょっといいCPU「NXP LPC1114FHN33/333」を使って作ってみました。

IchigoJam 1.3beta!?(仮称)

プログラムサイズ拡大:1KB → 4KB
配列サイズ拡大:102 → 614

いつものIchigoJamへのバージョンアップはできません。
ROMが56KB以上、RAMが8KB以上のLPC1114またはLPC1115へ書き込んで使ってみてください。
LPC11Uシリーズは、GPIOの扱いなどに互換性がなく未対応です。

links
- IchigoJam-FAN (ファイルからβ版ファームウェアダウンロード可能)
- LPC1115評価ボード (未確認ですがきっと動くはず)

I2C is good protocol to connect devices just 2 wires (except power and GND).
IchigoJam has commands I2CR and I2CW to access via I2C.
I try to change for the future version.

This is one of application to connect Wii Nunchuck, but I couldn't get value yet...

10 POKE#700,#40,0,0,0,0,0,0,0 20 IF I2CW(#52,#700,2,#700,0) ERR 30 @LOOP 50 IF I2CW(#52,#701,1,#700,0) ERR 70 IF I2CR(#52,#700,0,#702,6) ERR 80 FOR I=0 TO 5:?PEEK(#702+I);" ";:NEXT:? 90 WAIT 30 100 GOTO @LOOP

I have a plan to be I2CR/I2CW command simply.
Try the beta version firmware on IchigoJam-FAN.

*I did it! It's works!

links
- “WiiChuck” Wii Nunchuck Adapter Available – todbot blog
- Wiiヌンチャクの動作確認しました: 猫にコ・ン・バ・ン・ワ

Fukui KOSEN is my alma meter and there are 57 KOSEN in Japan.
Japan exported KOSEN to Mongolia already! I went there 2 years ago. (report)


Last year, 2 Japanese people in charged of Mongol KOSEN got the conferment from Mongolia president. Congratulations!
"西山明彦先生、 モンゴル国「ナイラムダル勲章」を受勲 !! | モンゴルに日本式高専を創る支援の会"


In that celebration party connected to Mongol KOSEN!


I update IchigoJam ap (IchigoJam as PC/Mac application) to support Mongolia.
You can download beta version at IchigoJam-FAN.
And I posted to IchigoJam club at Mongol KOSEN.


IchigoJam for Monglia 1.2b37 firmware supported the mini LCD monitor!
Let's challenge to make it! (for Mongol KOSEN students)
"schematic of LCD shield for IchigoJam"


Assemblage at Akihabara our first IchigoJam workshop on September 2014.
This is the beginning.


This day I enjoyed soldering with many kids!

Kids and KOSEN are our Hope!

links
- モンゴルに日本式高専を創る支援の会 - IchigoJam report at Mongolia

Happy New Year!

I updated IchigoJam beta firmware. You can download on IchigoJam-FAN.
Updated command: VIDEO n, SWITCH(0:TV/1:LCD)
VIDEO 0: video off
VIDEO 1: video on (32x24)
VIDEO 2: video on (32x24) inverted
VIDEO 3: video on (16x12)
VIDEO 4: video on (16x12) inverted
VIDEO 5: video on (8x6)
VIDEO 6: video on (8x6) inverted
VIDEO 7: video on (4x3)
VIDEO 8: video on (4x3) inverted

※VIDEO4 on IchigoJam 1.2 beta 34


Web for all!

Programming for all kids!
"PCN Kids Programming Contest 2016 in Winter | PCN Programming club network"

links
- Kid's PC IchigoJam - first programmable computer ($15)

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