ブロックを積みながら(22) MakeCode、いつの間にmicro:bit v2対応?

Joseph Halfmoon

前回、BBC micro:bit v2用のプログラムをMakeCodeエディタで作成中にメモリ不足に起因するとみられるエラーに遭遇いたしました。その時点ではv2、v1に関わらずv1のメモリ上限で制約されていると推測いたしました。しかし、それからわずか1か月、何もしていないのですが v2の拡張されたメモリを使えるようになってました。

※「ブロックを積みながら」投稿順 index はこちら

MakeCodeエディタは、BBC micro:bitプログラミングのためのプライマリ開発ツールといってもよいでしょう。表側はビジュアル・プログラミングなお道具、裏側にはJavaScript(といいながら実はTypeScript)な環境です。

一方、BBC micro:bitには大きく2つのバージョンがあります。v1.x と v2です。各種センサなど周辺構成はv1.xの中でも微妙に異なっていたりもしますが、大きな違いとしてメインのSoCチップが違い、そしてメモリ容量が違う、ということが挙げられます。こんな感じ。

micro:bit v1.x micro:bit v2
SoC nRF51822 nRF52833
Flash 256KB 512KB
RAM 16KB 128KB

しかし、MakeCodeエディタ自体は、(原則)v1.xでもv2でも「共用可能」なオブジェクトコードを生成します。実際にはハードの違いがあるので、1個のオブジェクトコードの中に v1.x用とv2用の2種類のオブジェクトコードを含んでおり、書き込み時にどちらか適切な方が選択されてロードされるようです。

またMakeCodeエディタ自体は、ベースがオンライン環境なのでターゲット・ボードを認識しなくてもオブジェクトを生成できます。このため、

過去のMakeCodeエディタは メモリ量が小さいv1.x に合わせていた

と考えています。しかし、何時からなのか、それとも私が見落としていただけなのか、現時点では、

v2で新たに追加されたブロックを使用すると「v2モード」に切り替わる

ようになっていました。アイキャッチ画像に掲げましたが、「v2モード」になるとシミュレータ画面のmicro:bit の右下に「白地にV2」という文字が現れます。先月やっていたときにもv2の新規追加ブロックは存在していましたが、そいつらを使ってもモード切り替わらなかった気がするのですが。。。

メモリの制約が緩和されているのかどうか確かめてみた

一番の関心事は、Bluetooth使っているときのメモリの制約が緩和されているのかどうか、という点にあります。なにせ、拡張機能でBluetoothを導入するとちょこっとブロックを置いただけで「満杯」状態になってしまっていたので。

実際に micro:bit v1.5 と micro:bit v2 でほぼ同じ「メモリイーター」プログラムを走らせて、どこまで動作するのか調べてみました。以下のプログラムで V2化と書いてある1ブロックを置くと v2 用となり、取り除くと v1.x用となります(末尾にJavaScript形態全文も掲げました。)

プログラム動作としてはだいたいこんな感じです。

  1. BLE Uartサービスを起動
  2. 動作中は毎秒左肩のLEDをトグル
  3. ボタンAを1回押すと、配列に数値100000を100個追加
  4. BLE Uartにボタンを押した回数を報告
micro:bit v1.5での結果

v1.5にオブジェクトを書き込んだところ、BLEのコネクションから躓きました。報告される実行時エラーは以下です。

O21エラー

エラーコードの解釈は以下のページに説明があります。O21はやはりメモリ不足のエラーのようです。

micro:bit Error codes

micro:bit v2での結果

v2では、期待どおり動作をいたしました。スマホのBLE Uart端末でコネクトして観察していたのですが、

20回ボタン押し(配列要素の数で2000個追加)

まで正常動作しました。その後O21エラーが発生し、コネクションが失われました。この処理系で1要素の記憶に何バイト必要とするか私は知りません。また配列といっても単純なメモリブロックではないと思います。しかし数値的に最低1要素4バイトは必要な筈なので2000要素の記憶だけでも最低8Kバイト、倍精度の8バイトとすると16Kバイトは必要な計算。またBluetoothを使用すると8KバイトほどBluetooth側で確保しているようです。v2でのRAM増量にくらべると使用できている量は限られているように感じられますが領域毎の割り当ての関係でしょう。ともかくv1.xよりか、メモリ的には緩和されていると考えられます。

このところ、micro:bit v2のメモリを使い切るべく、C/C++の開発環境、Arduino、Mbed、Zephyr など試しておったのですが、どれも帯に短し襷に長しで、唸っていたところ、いつの間にやらMakeCodeエディタが v2メモリを使えるように進化してました。ほんといつの間に?

ブロックを積みながら(21) MakeCode、Compilation failed へ戻る

ブロックを積みながら(23) BBC micro:bit v2とラズパイでサウンドモニタ へ進む

メモリを使う実験コード(micro:bit v2用)
bluetooth.onBluetoothConnected(function () {
    images.iconImage(IconNames.Yes).showImage(0)
})
bluetooth.onBluetoothDisconnected(function () {
    images.iconImage(IconNames.No).showImage(0)
})
input.onButtonPressed(Button.A, function () {
    aryTest(100)
    count += 1
    bluetooth.uartWriteLine(convertToText(count))
})
function aryTest (num: number) {
    for (let index = 0; index < num; index++) {
        testARY.push(100000)
    }
}
let count = 0
let testARY: number[] = []
soundExpression.giggle.playUntilDone()
testARY = []
count = 0
bluetooth.startUartService()
basic.forever(function () {
    led.toggle(0, 0)
    basic.pause(1000)
})