C#コードでMT3620を動かしてみた

Seeed UG Advent Calendar 2018の23日目に誰をも寄せ付けないクレイジー面白そうな記事が投稿されました。

www.kekyo.net

MT3620セットアップに始まり、Cサンプルコードの解説、C#で開発するためのビルド環境の整備、C#からCのInterop、疑似イベント駆動と、すげー長いので、、、

「とりあえず、ビルドして動かしてみたい」

というライトなユーザー向けに、ブログを書いておこうと思いました。

MT3620でC#を動かすテクノロジー「IL2C」

現在、MT3620の開発言語はC言語だけです。
じゃあ、どうやってC#を動かすのか?ですが、C#コードをビルドした結果のMSILを、IL2C.Coreを使ってCコードを生成して、そのCコードをCコンパイラでビルドして、実行のバイナリイメージを作成、MT3620で実行します。(下図の右側)

C#コード -> ビルド -> MSIL -> IL2C.Core-> Cコード -> ビルド -> バイナリイメージ

IL2C.Coreが生成したCコードは、それ単独をビルド、実行することができません。IL2C.CoreでCコードを生成するときに、IL2C.Runtimeを呼び出すCコードを出力しているからです。そのため、Cコードのビルド時にIL2C.Runtimeも加える必要があります。(下図の左側)

大きく、

  • IL2C.Core
  • IL2C.Runtime

の2つが重要!

f:id:matsujirushix:20181229155302p:plain

IL2C.CoreIL2C.Rumtimeがどこから来るのかというと、、、kekyoさんが鋭意開発していて、全ソースが彼のgithubに上がっています。

github.com

あと、上図の「IL2C」はIL2C.Buildという名前でnugetに上がっているので、実際に必要になるものは、

  • IL2C.BuildIL2C.Coreが含まれている)
  • IL2C.Runtime

ってことになります。

MT3620のサンプルコードを動かす

それでは、用意されているサンプルコードを動かしてみましょう。

MT3620の開発に必要な、ボード購入やらAzureSphereSDKインストール、デバイスのクレームなどは省略で。ググってください。Visual Studioを使って、(C言語で)MT3620を開発、実行ができている前提で。

必要なファイルをコピー

kekyo/IL2CリポジトリIL2C.Runtimeライブラリとサンプルコードが含まれています。ローカルにクローンしてください。

git clone https://github.com/kekyo/IL2C.git

サンプルコードのソリューションを開く

Visual Studioで、samples/AzureSphere/AzureSphere.slnを開いてください。
3つのプロジェクトが含まれているはずです。 f:id:matsujirushix:20181229171806p:plain

デフォルトでスタートアッププロジェクトが不適切なので、、、
Mt3620Appプロジェクトを右クリックして、スタートアッププロジェクトに設定を選択してください。Mt3620Appが太字で表示されればOKです。

ビルド&実行

PCにMT3620を接続して、デバッグ実行してください。

すると、自動的にnugetからIL2C.Buildをダウンロードしてきて、あれやこれやをやった後に、MT3620へデプロイ、プログラムが実行されます。

おまけ

C#コードでブレークポイントやステップ実行ができるぅ!!!
謎技術。 (さすがに、変数ウォッチはできません。) f:id:matsujirushix:20181229173449p:plain

<kekyoコメント>
デバッグ時の変数の参照は、プリミティブ型であれば見えると思う。オブジェクト参照は、frame__の下に入ってるけど、コードが抽象型で書かれていて、実際のインスタンスが具象型の場合は正しく見えない可能性がある あとラムダ式で変数キャプチャすると、クロージャ型の中を見ないと見えないけど、ローカルスタックフレームのどれがそのクロージャ型のインスタンスなのかを特定するには、いくつかツリーを開いて中身確認してみないとわからないかも知れない

今回、MT3620視点で書いていますが、、、 サンプルコードに、AzureSphere以外のmicro:bitやWio LTE、M5Stackもあるので、今後が楽しみですね。