C#コードでMT3620を動かしてみた
Seeed UG Advent Calendar 2018の23日目に誰をも寄せ付けないクレイジーな面白そうな記事が投稿されました。
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つが重要!
IL2C.CoreとIL2C.Rumtimeがどこから来るのかというと、、、kekyoさんが鋭意開発していて、全ソースが彼のgithubに上がっています。
あと、上図の「IL2C」はIL2C.Buildという名前でnugetに上がっているので、実際に必要になるものは、
- IL2C.Build (IL2C.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つのプロジェクトが含まれているはずです。
デフォルトでスタートアッププロジェクトが不適切なので、、、
Mt3620App
プロジェクトを右クリックして、スタートアッププロジェクトに設定
を選択してください。Mt3620App
が太字で表示されればOKです。
ビルド&実行
PCにMT3620を接続して、デバッグ実行してください。
すると、自動的にnugetからIL2C.Buildをダウンロードしてきて、あれやこれやをやった後に、MT3620へデプロイ、プログラムが実行されます。
おまけ
C#コードでブレークポイントやステップ実行ができるぅ!!!
謎技術。
(さすがに、変数ウォッチはできません。)
<kekyoコメント>
デバッグ時の変数の参照は、プリミティブ型であれば見えると思う。オブジェクト参照は、frame__の下に入ってるけど、コードが抽象型で書かれていて、実際のインスタンスが具象型の場合は正しく見えない可能性がある あとラムダ式で変数キャプチャすると、クロージャ型の中を見ないと見えないけど、ローカルスタックフレームのどれがそのクロージャ型のインスタンスなのかを特定するには、いくつかツリーを開いて中身確認してみないとわからないかも知れない
今回、MT3620視点で書いていますが、、、 サンプルコードに、AzureSphere以外のmicro:bitやWio LTE、M5Stackもあるので、今後が楽しみですね。