鳥なき里のマイコン屋(50) ARM Mbed その8、Mbed Simulator

マイコン向けの開発環境では、ホスト(大抵はパソコン)の上でオブジェクトをビルドした後、開発用のターゲットボードに刺した「エミュレータ」とか「プローブ」とか呼ばれるハードウエアの箱を通してターゲットボードにオブジェクトを「ダウンロード」して実行することが多いと思います。またエミュレータにはターゲットをデバッグするための支援機能が内蔵されており、これを呼び出して(多くはホスト上のデバッガが裏で操作しているのですが)デバッグを行います。最近の「お手軽」開発ボードでは、従来独立した箱だったエミュレータに相当する部分までボード上に搭載してしまい、直接パソコンにUSB接続してダウンロードもデバッグも行えるものが増えています。

しかし、多くの開発プロジェクトでは、ターゲットとなるハードウエアの開発と並行してそれを制御するソフトウエアも開発しないとスケジュール的に間に合わないことも多く、ソフトウエアに着手した時点ではまだターゲットボードが存在しない、という状況も多いと思います。そんな時に使われたりするのが「シミュレータ」です。多くのマイコン向け開発環境に、マイコンメーカなどが開発した「ソフトウエア・シミュレータ」が含まれており、ターゲットのハードウエア無に、ホスト上でマイコン用のオブジェクトプログラムを動作させ、テストできるようになっています。

※「鳥なき里のマイコン屋」投稿順Indexはこちら

さて、そんなシミュレータですが、従来型のマイコン開発環境で搭載されているのは、

命令セットシミュレータ

でした。これはターゲットのマイコンの「機械語命令レベル」の動作をホストパソコン上でシミュレートするプログラムです。ホスト上のクロス環境で作成したバイナリオブジェクトを1命令、1命令読み込んでターゲットマイコンではこんな動作をする、ということでシミュレートするわけです。もちろん、ターゲットマイコンだけではなく、メモリや周辺機器もシミュレートします。通常、ホストPCはターゲットとなるマイコンよりは巨大な主記憶メモリを積んでいるので、メモリをシミュレートすることはなんでもありません。しかし、周辺回路については、いろいろな回路を積んだ多数のマイコン品種全てに対応できているようなものはまずなく、代表的なもののみ、といった感じじゃないかと思います。また、シミュレータの動作も

サイクル・アキュレート

と呼ばれるような、CPUのクロックサイクルの1つ1つの動作まで正確にシミュレートするようなものはなかなか無く、多くのシミュレータはシミュレートした結果のメモリやI/Oへの読み書きデータは正しいけれど、タイミングまではね。。。といった感じであることが多いです。

さて、ようやく本題の Mbedのシミュレータに入ります。クラウドを使ったWeb開発環境であるMbedのシミュレータもまた、Web上にあります。

Mbed Labs

というプロジェクトの先頭に、Arm Mbed OS Simulator というものが見えると思います。これをクリックすれば、「あなたの」インスタンスが立ち上がってきます。非常に簡単なので使ったことが無かったらお試しを勧めます。

画面はいたってシンプルで、左半面がプログラムを入力するエディタ、右半面が結果を表示する領域です。左の上部に Demoプログラム を選択するためのプルダウンメニューと Load demoというボタンがあるので、これを使えばデモプログラムを選択して即座に動作させることが可能です。Blinkyのような「Lチカ」系のデモであれば、動作させると、右側のボードの絵の上のLEDが点滅します。printfは、右側のSerial outputに向いているので、任意の出力も可能です。

これだけだと、デモをロードしてブラウザの中で見るだけに思えますが、この環境が面白いのは、ソースコードを書き換えて、Runボタンを押すと、ちゃんとコンパイルされて動作が変わることです。適当なデモプログラムを出発点にしてプログラムを書きかえてその動作を画面上で確認できるわけです。

また、ターゲットボードは極めてシンプルなボードですが、+Add componentというボタンがあり、端子にいくつかの周辺デバイスを接続することができます。単純なLEDもありますが、SHT31(センシリオン社の高性能温度湿度センサ)なども含まれます。

こうしてブラウザの上で動作が確認できて良いね、でもちょっとおもちゃっぽいかも。しかし、Arm Mbed OS Simulatorの本当にカッとんでいるところはその裏側にありました。

Download offline version

というリンクがあり、Webベースでなく、ローカルでシミュレートできるようです。そこでリンクをたどると、このシミュレータをローカル動作させるために事前にインストールしておくべきソフトウエアが列挙されていました。

    1. Mbed CLI
    2. node.js
    3. Emscripten SDK

まあ、Mbed CLIは分かります。Mbedのローカルなツールチェーンです。なければMbed用のソースをローカルでビルドできません。そして当然私の環境でもインストール済。しかし、node.js なぜいるのでしょう? node.js は、定番のJavaScriptの実行環境で、私もインストールしてはあります。しかし、なぜ突然JavaScriptと疑問がわきます。その疑問は、3つめの要インストールソフトを調べたら氷解です。

Emscripten SDK

すいません、Emscripten SDK、勉強不足で知りませんでした。サイトにいって説明を読めば、どうもコンパイラのインフラであるLLVM(私もたまにお世話になっております。なお、そのフロントエンドはClangという名なので、コマンド名としてはClangで使っていることが多いかも)を応用し、

C/C++のソースからJavaScriptを自動生成する

という凄いツールでした。通常のLLVMであれば中間言語表現に変換した後、実際のマシンコードに落とすバックエンドを起動するのですが、このツールではJavaScriptに変換するようです。非常に高速に動作するJavaScriptを生成できるのだそうです。どうも、Web上で動作している Arm Mbed OS Simulator も含め、このシミュレータは、

入力されたC++のコードをJavaScriptに変換し、それを動作させることでMbed OS搭載ボードの動きをシミュレートさせる

ものだと理解しました。従来の命令セットシミュレータに慣れ親しんだ頭からするとかなりビックリ。考え方が根本から違う。しかしね、Emscripten SDK、みれば見るほど面白そうなのでハマると抜けられなくなりそう。当面、インストールは見合わせておくことにいたします。

鳥なき里のマイコン屋(49) Arm Mbed その7、classの行方 へ戻る

鳥なき里のマイコン屋(51) USBシリアルの準備 へ進む