デバッガがハングする場合
デバッガは、semihostという機能を使用しており、アプリケーションもこの機能を使っているとバッティングしてデバッガがハングしてしまうことがあります。もしもアプリケーション・デバッグ中にsemihost_uidという関数でハングしてしまった場合は、おそらくこれが原因です。アプリケーションでsemihost機能を使用する例として、EthernetのMACアドレス取得があります。この場合は次のように対処すると良いでしょう。
1)自分のmbedのMACアドレスを調べる
簡単なのはQuickStartを実行することです。連載第2回の図21を参照してください。
2)自分のアプリケーションの中でmbed_mac_address関数を上書きします
extern "C" void mbed_mac_address(char * mac) { mac[0] = 0x00; // この6つの値を、Macアドレスに置き換えます mac[1] = 0x01; mac[2] = 0x02; mac[3] = 0x03; mac[4] = 0x04; mac[5] = 0x05; };
この関数はweak linkされているので、アプリケーションで定義がなければデフォルトのもの(semihost機能を用いてMACアドレスを取得する機能)が、定義されていれば(二重定義にはならずに)、アプリケーションで定義した関数が使用されます。関数内の6つの値は、1)で調査したMacアドレスを上位から2桁ずつ取り出したものです。
なお当然ですが、このような状態のアプリケーションを他のmbed(異なるMACアドレスを持つ)で使用すると、MACアドレスの重複が起きてしまうので、十分に注意してください。
printfデバッグ
最後にデバッグの王道(?)、printfデバッグの方法について解説します。デバッガは便利な機能ですが、実行速度が低下するためタイミングに依存したバグは、うまくデバッガ内では再現できないことがあります。こうしたケースでは、printfデバッグを試してみると良いでしょう。mbedのライブラリでは、標準出力がUSB CDCデバイス(USBシリアルポート)に出力されます。このため、mbedを接続したPC側でターミナル・ソフトウェアを起動してUSBシリアルポートを読み出せば、mbedで標準出力に表示した内容を参照することができます。
今回はMacでの方法について解説しますが、Windows、Linux用の方法もWeb上で検索(キーワード「USBシリアル」などで検索)すれば数多く見つかりますので、他のプラットフォームの場合はそちらを参照してください。まずmbedを接続していない状態でターミナルを起動して、「ls /dev/tty.*」の結果を確認しておきます(図42)。
次に、mbedを接続してから、もう一度結果を確認します(図43)。
今回の環境では新しく増えている、「/dev/tty.usbmodem1422」がUSBシリアルポートのデバイス名になります(今後、この部分をご自分のデバイス名に読み替えてください)。あとはターミナル・ソフトウェアでこのポートを開けば表示することができます。Macの場合、標準で入っているscreenが利用できます。
$ screen /dev/tty.usbmodem1422 9600
最後の引数は通信速度です。これで、mbedで標準出力に表示したものが見えるはずです(図44)。
screenの終了は、[control]+[a]キー(Windowsでは[Ctrl]+[a]キー)です。なお改行コードに\nのみを使っていると、この例のように行の折り返しが見づらくなるので、mbedでの出力の際に"\r\n"を指定するか、Mac側でCRを付加すると良いでしょう。Mac側でのCRの付加には、本来はsttyというコマンドを使用するのですが、どうやらMacでは、このsttyが正しく動作しないという問題が昔からあるようです。Mac brewでminicomが提供されているので、これを使用すると良いでしょう(誌面の都合からMac brew自体のインストールについては割愛します)。
$ brew install minicom
minicomをインストールしたら、以下で起動します。
$ minicom -D /dev/tty.usbmodem1422 -b 9600
[option]+[z]キーでメニューを出して、Add Carriage Returnの機能である[u]キーを押します(図45)。
これでCRが付加されて、きちんと行が折り返されるようになるでしょう(図46)。
minicomの終了は[option]+[z]キーでメニューを呼び出して、[q]です。なおデバッガに比べれば速いですが、シリアルへの出力もそれなりに重い処理なので注意してください。デバッグ出力文はマクロ定義しておいて、製品としての出荷時には削除するのが一般的です。
まとめ
Web IDEを用いることで、mbedのアプリケーションを非常に簡単に試してみることが可能ですが、そのかわり提供される機能は簡単なものに限られてしまいます。ある程度の規模のソフトウェア開発には、オフラインのIDEを用いることでより効率良く開発を進めることが可能です。オフラインのIDEとしてLPCXpressoを使用し、そのインストール方法、Web IDEからLPCXpressoにプログラムを移動する方法、また逆にLPCXpressoからWeb IDEにプログラムを戻す方法について解説しました。
「mbedには、CMSIS-DAPと呼ばれるデバッグ・プローブが標準で組み込まれているため、USBケーブルを接続しておくだけで、対話的にプログラムをデバッグできます。
mbedが提供する、USBメモリからのプログラム書き込み、デバッグ・プローブ(CMSIS-DAP)によるデバッグ・サポートといった機能は、mbedにあらかじめ書き込まれているファームウェアによって実現されています。実際に使用する際には、ファームウェアを最新にしておきましょう。
最後にデバッガではタイミングの問題でバグが発生する条件がうまく再現できない場合のために、USBシリアルポートを用いたデバッグ方法について解説しました。
次回からは再びクラウドを用いたIoTプログラミングに戻ります。お楽しみに。