2016年7月13日水曜日

Visual Studio で Raspberry Pi のリモートデバッグ ( ApplePi の例)

 ずっと以前に Raspberry Pi のクロス開発環境構築 というのをやったんですが、実際に自分でC/C++でRaspberry Piの開発を行うときは VisualGBD というツールを使って Visual Studio でリモートデバッグ or クロス開発をしています。この VisualGDB はとってもおすすめなんですが、有料で決して安くはない価格です。
 そこで、今回は Visua C++ for Linux Development という 無料で利用できるMicrosoft純正の Visual Studio用 Linuxリモートデバッグ開発ツールを試してみようと思います。

 まずは、拡張機能のインストールです。Visual Studio 2015 の「ツール」→「拡張機能と更新プログラム」を選択して、「オンライン」の「Visual Studio ギャラリー」で右上の検索ボックスに「Visual C++ for Linux」的な言葉を入れて検索します。「Visual C++ for Linux Development」というのが見つかるはずなので「ダウンロード」ボタンをクリックしてダウンロードして、インストールを行います。Visual Studioの再起動が必要かと思います。


 Visual Studio の「ファイル」→「新規作成」→「プロジェクト」で新しいプロジェクトダイアログが表示されたら、右側のテンプレートから「インストール済み」→「テンプレート」→「Visual C++」→「クロスプラットフォーム」→「Linux」を選択、右側の「Blink(Raspberry Pi)」を選択して、プロジェクト名を入力してプロジェクトを作成します。


 WiringPi を使って、17pin に接続したLEDを 0.5秒間隔で点滅させるサンプルコードが main.cpp として作成されるようです。
 
 今回はサンプルとして トラ技2016年8月号に基板(だけ)が付録としてついてきた ApplePi をターゲットにしてみたいと思います。まずはターゲットの接続情報を設定します。Visual Studioの「ツール」→「オプション」でオプションダイアログを表示して、左のツリーで「Cross Platform」→「C++」→「Linux」→「Connection Manager」と選択して、右側の「Add」ボタンをクリックすると接続情報を設定するダイアログが表示されるので、ApplePiへの接続情報を入力します。


  例えば、ホスト名が "ApplePi"とすると以下のような感じになります。SSHログインが出来るようにRaspberry Pi側を設定しておく必要があるかと思います。自分は以前に設定してあったので、特にその部分を気にすること無く接続できてしまいました。


 SSHサーバや gcc(g++)の開発環境自体まだ使っていない場合は、

     sudo apt-get install -y openssh-server g++ gdb gdbserver freeglut3-dev

として、SSHと開発ツールをインストールして下さい。
 以下、接続設定が成功した場合の表示例です。



 次に Raspberry Pi 側の include ファイルのフォルダを共有して Visual Studio の include 参照先に設定することで intellisense等を有効にします。この辺の設定は こちらを参考にしています。

 まず、sambaをまだインストールしていない場合は、

     sudo apt-get install -y samba

 共有フォルダを追加するために /etc/samba/smb.conf の末尾に記述を追加します。

     sudo vi /etc/samba/smb.conf

 以下を追記。

     [share]
     path = /home/pi
     writable = yes
     guest ok = yes
     guest only = yes
     create mode = 0777
     directory mode = 0777
     share mode = yes
     force user = pi

     [usr_include]
     path = /usr/include
     writable = no
     guest ok = yes
     guest only = yes

 [share]フォルダは pi ユーザのホームディレクトリをWindows側から操作できるようにするのと、このホームディレクトリをに ApplePi のインストールファイルを展開してあるので、その中に bcm2835.h , bcm2835.c 等のApplePi のプロジェクトで参照したいファイルが存在するために共有しました。[usr_include]は一般的なincludeファイルを参照するための共有でリードオンリーに設定しています。ここで、サービスを再起動します。

     sudo service smbd restart

 これで Windows 側から Raspberry Pi の /home/pi = "share" と /usr/include = "usr_include" が参照可能になります。



 Raspberry Pi 側で Avahi を設定していない、あるいは、Windows 側が Windows 10 ではない(Win 7とか)だと名前ではアクセス出来ないかもしれません。その場合はIPでアクセスします。

 次にプロジェクトの各種設定を行っていきます。プロジェクトのプロパティ画面を開いて、「構成」を「すべての構成」(またはDebug)を選択して、「構成プロパティ」の「General」の「Configuration Type」を「Application (.out)」を選択します。


 次に Includeパスに Raspberry Pi の共有フォルダを追加します。同プロジェクトのプロパティ画面の「VC++ Directories]の「Include Directories」に共有フォルダのパス、この例では、「\\ApplePi\usr_inclue」と「\\ApplePi\share\bcm2835-1.50/src」(ここに bcm2835.h がある)を設定します。


 次はリンクするライブラリの設定です。作成されたプロジェクトでは wiringPi のライブラリが設定されていますが、今回は ApplePi を使うので bcm2835 をライブラリに指定します。



 念のため、「Remote settings」の「Target machine」が正しく設定されていることを確認しておきます。選ばれていない場合はプルダウンで選択します。


 main.cpp の内容をそっくり全て置き換えます。

 これで「Remote GDB Debugger」ボタン(「デバッグの開始」)でクロスコンパイルが行われ、プログラムが実行されます。ApplePiのボード上の2つのLEDが交互に点滅します。
 ブレークポイントを置いてステップ実行したり、ブレーク中に変数にマウスを合わせて値をポップ表示させたりもできます。下記は条件ブレーク(条件 i==5)を設定してブレークをかけたところです。