chibi:bitの050エラー問題を調べてみた 

2018年9月中旬頃から、MakeCode for micro:bitで作成したプログラムを[chibi:bit](https://www.switch-science.com/catalog/2900/)で動かしたときに、050エラーが発生するようになりました。この問題について気になったので、調べてみました。

この記事は、2018年の9月末の情報です。

2019年12月にポストした解決編もご覧ください。
https://qiita.com/toyowata/items/8301cb8efdbd852741ce

## 結論

素直にchibi:bit専用の開発環境を使いましょう。この環境で作成したプログラムでは、050 エラーは出ませんし、特に問題なく動作します。
http://chibibit.io/ide/

[追記](https://qiita.com/toyowata/items/19a434d59f4276b9e23c#20181010-%E8%BF%BD%E8%A8%98)もご覧下さい。

以下の記事は、私が調べたことを書いただけなので、技術的な興味があれば参考にしてください。

## MakeCode のバージョン
MakeCode本家で提供しているサービス　https://makecode.microbit.org を使うと、chibi:bitに書き込んだプログラムは実行時に 050 エラーが出て停止します。一方、chibi:bit用のサービス http://chibibit.io/ide/ を使った場合は、特に問題なくプログラムが実行されます。

設定メニュー（歯車のアイコン）から「このアプリについて…」を選択すると、以下のように表示されました。

* http://chibibit.io/ide/ の場合

```
makecode.microbit.orgのバージョン： 0.13.47
Microsoft MakeCodeのバージョン： 0.14.22
C++ runtimeのバージョン： v2.0.0-rc11
```
* https://makecode.microbit.org/ の場合

```
makecode.microbit.orgのバージョン： 0.14.52
Microsoft MakeCodeのバージョン： 0.19.16
C++ runtimeのバージョン： v2.1.0
```

MakeCodeや、ランタイムで使用されるライブラリのバージョンが異なっているようです。これらのサービスのバージョンをユーザがブラウザ内から直接設定・変更することは出来ないので、別の方法で調べてみます。

## DAPLink interface firmware

最初に思いついたのは、DAPLinkファームウェアでした。micro:bitとchibi:bitには、ハードウェア的な差異はほぼ無いはずですが、DAPLink interfaceが異なっているので、最初はこれを疑いました。以下のレポジトリから、最新のリリースを取ってきてchibi:bit用のDAPLink interface firmwareを書き込みましたが、050 エラーは解消されませんでした。

https://github.com/ARMmbed/DAPLink/releases/tag/v0250

## C++ランタイム

次にC++ランタイムのバージョンが異なるので、この部分を調べてみました。micro:bitは、`microbit-dal`というランタイムライブラリを使用しています。これは主に、UKのLancaster大学が開発・メンテナンスしているオープンソースのプロジェクトです。
https://github.com/lancaster-university/microbit-dal

MakeCodeでJavaScriptのプログラムを作る場合も、このランタイムライブラリが使用されます。このライブラリを使った[C++サンプルコード](https://github.com/lancaster-university/microbit-samples)があるので、それをコマンドラインからビルドしてみます。ビルド環境には、Macを使用しました。

まず、以下の情報を参考にしてビルドツールをインストールします。

http://docs.yottabuild.org/#installing-on-osx
https://lancaster-university.github.io/microbit-docs/offline-toolchains/#installation-on-mac-osx

次に、サンプルのソースコードをダウンロードしてビルドを行います。microbit-dalを含んだ必要なモジュールは、サンプルコードのビルド時にダウンロードされます。

```
$ git clone https://github.com/lancaster-university/microbit-samples
$ cd microbit-samples
$ yt target bbc-microbit-classic-gcc
$ yt build
```
ビルドが完了したら、HEXファイルをchibi:bitに書き込みます。

```
$ cp build/bbc-microbit-classic-gcc/source/microbit-samples-combined.hex /Volumes/CHIBIBIT/
```
リセットボタンを押してプログラムを起動すると、050エラーが発生しました。

次に、chibibit.io で使用されている C++ランタイムと同じバージョンを使ってみます。エディタで module.json を編集します。

変更前：

```
"microbit": "lancaster-university/microbit#v2.1.0"
````
変更後：

```
"microbit": "lancaster-university/microbit#v2.0.0-rc11”
```

microbit-dalモジュールは、microbitモジュールからリンクされており、上記設定でmicrobit-dal v2.0.0-rc10が使用されます。
https://github.com/lancaster-university/microbit-dal/releases/tag/v2.0.0-rc10

変更後、再度モジュールをリロードしたいので、ビルドディレクトリとモジュールのディレクトリを削除します。

```
$ rm -rf build/ yotta_modules/
```

ビルドして、HEXファイルをコピーします。

```
$ yt build
$ cp build/bbc-microbit-classic-gcc/source/microbit-samples-combined.hex /Volumes/CHIBIBIT/
```

リセットして実行します。今度は問題なくプログラムが実行され、LEDに```HELLO WORLD! :) ```が表示されました。

これで、問題はMakeCodeとchibibit.io から使われている C++ランタイムのバージョンの差異にあることが推測されます。

因みに、050 エラーは、ここで定義されています。

https://github.com/lancaster-university/microbit-dal/blob/f385db52d5ba32cd7895d7cd2056a7f28e2bb157/inc/core/ErrorNo.h#L87

実際にそのエラーコードを発生している場所はこちらです。

https://github.com/lancaster-university/microbit-dal/blob/14f4c0e64e1e0aa180d7cb478d4f395057c4bb11/source/drivers/MicroBitAccelerometer.cpp#L115

microbit-dalのv2.0.0-rc10と、その後にリリースv2.1.0-rc1は、かなりの量の差分があり、細かく調査することはできませんでしたが、おそらく`CHANGELOG`に記載されている以下の変更が原因ではないかと思います。

```
 - Autodetection algorithm for I2C based accelerometer/magnetometer sensors.
```

https://github.com/lancaster-university/microbit-dal/compare/v2.1.0-rc1...master#diff-d3bb3391c79904494c60ee2ac2f33070R9

加速度センサなどのデバイスはchibi:bitでも同じものを使っていると思うので、なぜ実行時に挙動が異なるかは不明です。

もう少し何か分かれば追記したいと思います。

## 追記

### (2018/10/10 追記)

Firefox 62以降で[chibi:bit用開発ページ](http://chibibit.io/ide/)は、以下の変更の影響でアクセス出来なくなりました。

https://www.fxsitecompat.com/ja/docs/2018/application-cache-can-no-longer-be-used-on-insecure-sites/

Google Chrome等の他のブラウザを使うことで引き続き利用可能です。