本連載では、小学生向きのプログラミング教育などに使われているBBC micro:bit(以下「micro:bit」)の上で動くようになったµT-Kernel 3.0をご紹介している。連載第3回の本号では、いよいよ、Eclipseを使ってコンパイルしたµT-Kernel 3.0のオブジェクトプログラムをmicro:bitに転送して実行する。
連載第2回(前号)の[Step-3]から再開する。micro:bitの実機を用意して、開発用ホストPCとUSBケーブルで接続し、以下の[Step-3]の手順を実行する。
(8) micro:bitのFlash ROMの消去
(9) 端末ソフトの起動とmicro:bit実機への接続
(10)デバッグ実行用のEclipseの設定
(11) micro:bit実機での実行
図1 コマンドプロンプトの画面でmicro:bitの
Flash ROMを消去
micro:bitの通常の状態では、連載第1回で説明したように、開発用ホストPCのMakeCodeで開発したプログラムを転送してすぐに実行できるようになっており、転送や実行のためのプログラムがmicro:bitのFlash ROMの中に入っている。しかし、このプログラムがµT-Kernel 3.0の実行環境と競合することになるため、これを消去してmicro:bitをクリーンな状態にする必要がある。
Flash ROMを消去するには、(4)でインストールしたpyOCDを使う。micro:bitの実機を開発用ホストPCとUSBケーブルで接続した状態で、Windowsのコマンドプロンプトの画面を開き、以下のコマンドを入力する。
pyocd erase --mass |
この操作によって、micro:bitのFlash ROMが消去される。実行した結果を図1に示す。
µT-Kernel 3.0が動くのはmicro:bitの中のTarget MCUであり、Target MCUのUART(シリアル入出力)をµT-Kernel 3.0のコンソールとして使用する。UARTの入出力データはmicro:bitの中にあるInterface MCUでUSBに変換され、USBケーブル経由で開発用ホストPCに接続される。この接続は、Eclipseから呼び出されたpyOCDがプログラムを転送するための接続(CMSIS-DAPによる接続)と共通のUSBケーブルを経由するが、論理的な回線としては別であり、それぞれ独立してデータを転送できる(連載第1回の図8を参照)。開発用ホストPCでは、USB経由でµT-Kernel 3.0のコンソールに接続されたシリアル入出力の表示や操作を行うために、何らかの端末ソフト(ターミナルエミュレータ、通信ソフトウェア)を使用する。
ここでは、端末ソフトとしてTera Termを利用した。開発用ホストPCにTera Termが入っていない場合は、表1のG行のURLの画面を開き(図2)、teraterm-4.106.exeをクリックしてダウンロードし、ダウンロードしたファイルをダブルクリックしてTera Termのインストールを実行する。通常の設定では、デスクトップにTera Termのアイコンが追加される。
名 称 | 説 明 | URL | |
---|---|---|---|
G | Tera Term | 端末ソフト(ターミナルエミュレータ、通信ソフトウェア) | https://ja.osdn.net/projects/ttssh2/releases/74780 |
H | micro:bitのOut of box experience | micro:bitを購入時の状態に戻すファイル | https://microbit.org/get-started/user-guide/out-of-box-experience/ |
端末ソフトの設定では、micro:bitのUARTが接続された開発用ホストPCのCOMポート番号を知る必要がある。このため、micro:bitと開発用ホストPCとをUSBケーブルで接続したままの状態で、Windowsの検索窓に「デバイスマネージャー」と入力する。デバイスマネージャーが開くので、その中の「ポート(COMとLPT)」をクリックして詳細情報を表示する(図3)。今回の実行例では「USBシリアルデバイス(COM4)」が表示されたので、micro:bitのUARTが開発用ホストPCのCOM4に接続されたことが分かる。
次に、Tera TermのアイコンをダブルクリックしてTera Termを起動する。Tera Termの新しい接続の画面が出るので、「シリアル(E)」をクリックし(図4①)、「ポート(R)」としてmicro:bitのUARTに接続されたCOMの番号(今回はCOM4)を選択してから(図4②)、「OK」で閉じる。また、「設定」メニューから「シリアルポート」を選択し、「スピード(E)」として115200を選択する(図5①)。「ポート(P)」は先ほど設定したCOMの番号(今回はCOM4)、「データ(D)」は8 bit、「パリティ(A)」はnone、「ストップビット(S)」は1 bit、「フロー制御(F)」はnoneのままでよい。これらの設定値を確認した後に、「現在の接続を再設定(N)」をクリックすれば設定完了である(図5②)。次回以降の利用のために、「設定」メニューから「設定の保存(S)」を選択してmicro:bit接続用の設定を保存しておく。
EclipseによるµT-Kernel 3.0の実行の前に、デバッガの設定を読み込む必要がある。まず、Eclipseの画面の「File」のプルダウンメニュー(図6①)から「Import...」を選択する(図6②)。インポート対象となる選択肢の画面が出るので、その中の「Run/Debug」の左側の「>」をクリックしてその下の情報を表示し(図7①)、その中の「Launch Configurations」をクリックして選択してから(図7②)、「Next」をクリックする(図7③)。「Import Launch Configrations」の画面が出るので、この中のFrom Directoryの入力欄に、µT-Kernel 3.0のソースコードの中の mtkernel_3/build_make/setting のフォルダのパスを入力する。今回の場合は “C:/mtk3/mbit/mtkernel_3/build_make/setting”を入力する(図8①)。あるいは、右側の「Browse..」のボタンをクリックして(図8②)、PC内にある実際のフォルダを参照しながらフォルダのパスを設定してもよい。この画面の左側に表示される setting の欄にチェックを入れると(図9①)、この画面の右側に mtkernel_3_pyocd.launch という項目が表示されるので、こちらにもチェックが入っていることを確認してから(図9②)、「Finish」をクリックする(図9③)。
いよいよ、Eclipseの操作によりデバッガを起動して、micro:bit上でµT-Kernel 3.0を実行する。まず、Eclipseの画面の「Run」のプルダウンメニュー(図10①)から「Debug Configurations...」を選択する(図10②)。右上に虫のマークを描いたDebug Configurationsの画面が表示されるので、左ペインの中にある「GDB PyOCD Debugging」の左側の「>」をクリックしてその下の情報を表示し(図11①)、その中の「mtkernel_3_pyocd」をクリックして選択する(図11②)。その状態で右下の「Debug」をクリックすると(図11③)、µT-Kernel 3.0のプログラムが再度ビルドされた後に開発用ホストPCからUSB経由でmicro:bitに転送される。Eclipse画面の下方のConsoleには、ビルドや転送の経過を示す多数のメッセージが表示される。
転送が終わると、初回の実行時のみConfirm Perspective Switchのパネルが表示されるので、「Switch」をクリックする(図12)。これによりEclipseの画面(Perspective)が切り替わり、ソースコードや変数を表示するペインが現れる。デバッガが起動してµT-Kernel 3.0のプログラム(OS本体+簡単なサンプルアプリケーション)の実行が始まり、usermain関数の最初に実行するTM_PUTSTRINGという関数の直前のブレークポイントで停止する。左側のペインにはネストして呼び出された関数の履歴(スタックトレース情報)が、中ほどのペインには現在実行中の関数であるusermainのソースコードが、右側のペインにはプログラム中で使用している変数の値が表示されている(図13)。また、端末ソフトの画面には“microT-Kernel 3.00”の起動メッセージが表示されている。
この状態で、Eclipseの画面から強力なデバッグ機能を使うことができる。興味のある読者は、Eclipseの解説書などを参考に、いろいろな操作を試していただくとよいだろう。
図13の画面上部にあるResumeボタンをクリックすると、停止中のブレークポイントから実行を再開し、端末ソフトの画面に “Start Task-1”などのメッセージが表示される(図14)。これは、micro:bitで動作しているµT-Kernel 3.0の上に生成されたタスクから、UART経由でコンソールに出力されたものである。
実行したサンプルプログラムの具体的な動作については、Eclipseの画面に表示されたソースプログラムapp_main.cを見て確認してほしい。ちなみに、usermainの最初にあるTM_PUTSTRING関数は、同じプログラムの中の#defineマクロで定義されており、その実体はtm_putstringというライブラリ関数である。tm_putstringは、µT-Kernel 3.0の仕様で定義されるシステムコールではなく、デバッグ用などの便宜のために提供されるT-Monitor互換ライブラリの一つであり、コンソールへの文字列の出力を行う。コンソールに出力された情報は、開発用ホストPCの端末ソフトの画面に表示される。T-Monitor互換ライブラリについては、ソースコード付属の「µT-Kernel 3.0 共通実装仕様書」という文書の中に説明があり、コンソールからの入出力機能や、C言語のprintfに相当する書式付き文字列出力機能などを提供する(表2)。usermainでは、この中のtm_putstringとtm_printfを使用している。
API名 | 機 能 |
---|---|
tm_getchar | コンソールから1文字入力 |
tm_putchar | コンソールへの1文字出力 |
tm_getline | コンソールから1行入力 |
tm_putstring | コンソールへの文字列出力 |
tm_printf | コンソールへの書式付文字列出力 |
tm_sprintf | 文字列変数への書式付文字列出力 |
このプログラムの最後は、システムコールtk_slp_tskによる永久待ちの状態になるため、これ以上の動きはない。図13の画面上部にあるTerminateボタンをクリックすると、プログラムの実行を終了し、プログラムの転送および実行開始前の状態に戻る。
再度プログラムを実行するには、(11)の最初の手順から繰り返す。デバッグ実行として「Run」の「Debug Configurations...」を選択した場合は(図10)、usermain関数の最初のブレークポイントで停止する。停止させずに実行したいのであれば、「Run」のプルダウンメニュー(図15①)から「Run Configurations...」を選択(図15②)してRun Configurationsの画面を表示し、右下の「Run」をクリックする。実行前にソースコードを修正した場合は、自動的に再コンパイルや再ビルドが行われた後に、再度のプログラム転送と実行が行われる。このとき、前回の実行が途中になったまま、Terminateボタンのクリックを忘れている場合が多いので注意しておきたい。実機でのプログラムの動作確認が終わったら、ソースプログラムの修正や再実行を行う前に、必ずTerminateボタンをクリックしておく必要がある。
実際にプログラムを修正して試してみよう。Eclipseでソースプログラムapp_main.cが表示されている部分はエディタになっているので、この画面を直接編集すればプログラムを修正できる。たとえば、tsk1の中のTM_PUTSTRING関数の引数である“Start Task-1\n”を“Welcome to Task-1\n”に修正する(図16)。その後、再度プログラムを実行するために「Run」の「Run Configurations...」を選択し(図15)、右下の「Run」をクリックすると、修正したソースプログラムがapp_main.cに保存された後に、修正のあったファイルの再コンパイル、µT-Kernel 3.0のOS全体の再ビルドとmicro:bitへの転送、プログラムの実行が自動的に行われる。コンソールに出力されたメッセージが“Welcome to Task-1”に変わった(図17)。
µT-Kernel 3.0を動かしたmicro:bitを購入時の状態に戻す方法についても確認しておこう。
µT-Kernel 3.0を動かすためにmicro:bitのFlash ROMを消去すると、当然のことではあるが、MakeCodeで開発したプログラム(連載第1回参照)は実行できなくなってしまう。これを元の状態に戻すには、micro:bitにOutOfBoxExperience.hexというファイルを書き込めばよい(*1) 。ちなみに、“Out of Box Experience”とは、購入したばかりの商品を箱から取り出して使い始める時の画面や設定などの操作手順、という意味である。
具体的には、まず、表1のH行のURLの画面を開き、「Download the out of box .hex file」と書かれたボタンをクリックしてhex形式(バイナリ形式)のファイルをダウンロードする(図18)。次に、micro:bitと開発用ホストPCとUSBケーブルで接続してから、Windowsのエクスプローラーを開くと、左側のペインに「MICROBIT」というデバイスが現れる(図19)。これは、「MICROBIT」というラベルの付いたUSBメモリを挿した時と同じ状態である。つまり、USBケーブルでPCに接続したmicro:bitは、Windowsから見ると、「MICROBIT」というラベルの付いたUSBメモリと同じように認識される。この「MICROBIT」をクリックして選択すると、その内容、つまりmicro:bitの中に保存されているファイルがエクスプローラーの右側のペインに表示される。ダウンロードしたOutOfBoxExperience.hexのファイルをこの中にドラッグすると、このファイルがmicro:bitに書き込まれて購入時の状態に戻る。
OutOfBoxExperience.hexファイルをmicro:bitに書き込むためのデータ転送は数秒で完了する(図20)。転送が完了すると、エクスプローラーのウインドウが自動的に閉じるとともに、micro:bitが音を出してLEDも光る。購入直後のmicro:bitに初めて電源を入れた時と同じように、micro:bitのデモプログラムの動作が始まったのである。静かな部屋で作業していると、いきなり音が出てびっくりするかもしれない。この後はまた、MakeCodeで開発したプログラムをダウンロードして実行できる状態になる。
* * *
今回は開発用ホストPCとmicro:bitをUSBケーブルで接続し、統合開発環境のEclipseを使って、µT-Kernel 3.0をmicro:bitに転送してから付属のサンプルプログラムを実行した。Eclipseにより、プログラムの再コンパイル、再ビルド、実機であるmicro:bitへのプログラム転送、micro:bit上でのプログラム実行やデバッグなどを簡単なメニュー操作で行うことができた。
次回は、µT-Kernel 3.0のマルチタスクやスケジューリングの動作を確認するための例題プログラムを作成して、micro:bit上で実行する予定だ。