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

100円マイコンを使い倒そう!たった28byteから始めるマシン語アプリ開発

2017/10/14 23:55:00
#IchigoJam #lpc1114 #maker 

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として呼び出すことを示すために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だけで行うマイコン開発に挑戦です!

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