SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

IoTをかじってみよう

IoTをかじってみよう(5)
~オフラインIDEを使ってmbedアプリケーションをデバッグする

  • X ポスト
  • このエントリーをはてなブックマークに追加

デバッガがハングする場合

 デバッガは、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)。

図42 シリアルポートの確認
図42 シリアルポートの確認

 次に、mbedを接続してから、もう一度結果を確認します(図43)。

図43 USBシリアルポートの確認
図43 USBシリアルポートの確認

 今回の環境では新しく増えている、「/dev/tty.usbmodem1422」がUSBシリアルポートのデバイス名になります(今後、この部分をご自分のデバイス名に読み替えてください)。あとはターミナル・ソフトウェアでこのポートを開けば表示することができます。Macの場合、標準で入っているscreenが利用できます。

$ screen /dev/tty.usbmodem1422 9600

 最後の引数は通信速度です。これで、mbedで標準出力に表示したものが見えるはずです(図44)。

図44 screen実行画面にprintfの出力が表示されたところ
図44 screen実行画面にprintfの出力が表示されたところ

 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)。

図45 minicomで復帰コードの付加を指定
図45 minicomで復帰コードの付加を指定

 これでCRが付加されて、きちんと行が折り返されるようになるでしょう(図46)。

図46 きちんと行が折り返された状態
図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プログラミングに戻ります。お楽しみに。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
IoTをかじってみよう連載記事一覧

もっと読む

この記事の著者

花井 志生(ペンネーム 宇野るいも)(ハナイ シセイ(ペンネーム ウノルイモ))

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9253 2016/04/05 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング