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

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マシン語入門

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