例えばIntel EdisonのCアプリをVisual Studio 2015でクロス開発する

こちらも、de:code 2016のDEV-009セッションで紹介したGCC/GDBによるクロスプラットフォーム開発です。セッションでは、Intel Edison上で動くCアプリを、Visual Studio でGCCでコンパイルして、EdisonにSSHで接続してリモートでGDBでデバッグする方法を紹介しました。

以前、https://blogs.msdn.microsoft.com/hirosho/2016/02/21/visual-studiogccgdb/ で紹介した内容の最新情報でもあります。前の投稿は古くなっているのでご注意。

セッションでは、Intel Edisonをターゲットデバイスとして使いましたが、基本現状、SSHで接続できて、gdbserverが動くプラットフォームで、かつ、Windowsで動くクロスコンパイラーがあるなら、Linux系でなくても何でもこの方法で、Visual Studio 2015 Update 2での開発が可能 なので、これに該当する組込み機器プラットフォームを持っている方、是非お試しください。

以下、セッションで紹介したデモ 環境のセットアップ方法を説明します。

Intel Edisonボードのファームウェア更新と、Windows PC へのドライバーインストール
ここではグダグダ書きません。https://software.intel.com/en-us/get-started-edison-windows を見て、忠実にセットアップを行ってくださいね。この一連の作業で、Windows上のツールインストール、デバイスドライバーインストール、Edisonのファームウェアアップデートが行われます。

Windows PC上で必要な関連ツールのインストール
以下のツールが必要です。リンクをたどってPCにインストールをお願いします。

https://www.chiark.greenend.org.uk/~sgtatham/putty/download.html から

  • putty.exe
  • pscp.exe
  • plink.exe
  • puttygen.exe

https://osdn.jp/projects/winscp/からWinSCPをインストール

Windows PC上でPuttyを使って、EdisonにCOM PORT接続し、リモートシェルでEdisonボード上の各種設定を行う
まずは、https://software.intel.com/en-us/get-started-edison-windows-step3 を忠実に行って、USB COM PORT で物理接続されたEdisonにPuttyを使ってリモート接続します。
リモート接続できたら、シェル上で、configure_edison コマンドを使って、ボード名、パスワードの変更、WiFiへの接続を行ってください。WiFi接続ができたら

configure_edison --showWiFiIP

とコマンド入力し、IPアドレスを確認しておきます。

Windows PCからEdisonにSSHで接続可能にする
SSH用の秘密鍵、公開鍵を作成してセットアップします。やり方は、https://www.kuins.kyoto-u.ac.jp/news/47/putty-gen.html が詳しいので参考にしてください。ただし、コンパイル&デバッグでひと手間増えないように、鍵を生成するときはKey Passphraseは空文字にしておきます。この記載に従って公開鍵(Public Key)と秘密鍵(Private Key)を作成し、Puttyのシェルで、rootユーザーのホームディレクトリの下に、./ssh というディレクトリを作成し、WinSCP等で作成した公開鍵をWindows PCからEdisonにコピーして、

cat publickey.txt > ~/.ssh/authorized

で公開鍵をEdisonに設定しておきます。※WinSCPは、EdisonのWiFiのIPアドレス、ユーザー名(root)、パスワードを使って接続可能です。PuttyGenで生成した秘密鍵のファイルは、Windows PC上のどこか適当な場所に保存しておきます。ここまできたら、PuttyでSSH接続可能なをチェックしておきましょう。やり方は、https://www.kuins.kyoto-u.ac.jp/news/47/putty-gen.html に書いてあります。

Windows PCにEdisonのクロスコンパイラツール一式をインストール
https://software.intel.com/sites/landingpage/iotdk/windows-development-kit.html から一式ファイルをダウンロードします。(このリンクをクリックするとダウンロードが開始されます)ファイルの中身を適当な場所に展開します。(展開方法はhttps://nanicananica.blog.fc2.com/blog-entry-43.htmlはこちらを参考にしてください)すると

ExtendDir\iss-iot-win_03-14-16\iss-iot-win\devkit-x86\sysroots\x86_64-pokysdk-mingw32\usr\bin\i586-poky-linux

というディレクトリに、クロスコンパイラ等が用意されます。※ExtendDirは、展開先のディレクトリです
また、

ExtendDir\iss-iot-win_03-14-16\iss-iot-win\devkit-x86\sysroots\i586-poky-linux

の下にコンパイルに必要なヘッダーファイルやライブラリが格納されます。

Visual Studio 2015の拡張機能インストール
既にVisual Studio 2015がインストールされている場合は、メニューの”ツール”→”拡張機能と更新プログラム”を選択し、ダイアログ左の”更新プログラム”→”製品の更新プログラム” カテゴリを選択します。”Visual Studio 2015 Update 2”があるはずなので、それを選択し”更新”ボタンをクリックしてアップデートしてください。まだインストールしていない方、個人お試しなら、https://www.visualstudio.com/ の”Community 2015のダウンロード”をクリックしてインストールしてください。ついでに、Azureの各種サービスが月25ドル分12か月使える、https://www.visualstudio.com/ja-jp/products/visual-studio-essentials-vs.aspx もお試しを。
インストールの際、機能の選択で、”クロスプラットフォームモバイル開発”→”Visual C++モバイル開発”→”Visual C++ Android Development(Update 2)にチェックを入れてください。既にインストール済みの方は、コントロールパネルの”プログラムのアンインストールまたは変更”で、Visual Studio 2015をダブルクリックし、”変更”でこの画面を表示できます。

VSSetupCCAndroidCCPP

インストール・変更が終わったらVisual Studio 2015を起動し、メニューの”ツール”→”拡張機能と更新プログラム”を選択し、ダイアログに”Visual C++ for IoT”と入力して検索・表示される、”Visual C++ for IoT Development”をダウンロード&実行して機能拡張します。

VSExtensionVCPPForIoT

これで準備は完了です。

Cアプリのクロスコンパイルとリモートデバッグ
Visual Studio 2015 Update 2を起動し、メニューの”ファイル”→”新規”→”プロジェクト”を選択し、”Visual C++”→”クロスプラットフォーム”の直下の、”Makefile Project(GDB)を選択してプロジェクトを作成します。

PTCrossPlatform

プロジェクトが出来上がったら、https://software.intel.com/en-us/blinking-an-led-using-c-with-intel-system-studio-iot-editionに記載の方法で作成した、BlinkLED.cをプロジェクトのディレクトリにコピーしてプロジェクトに追加します。
ソリューションエクスプローラーで、プロジェクトを右クリックしてプロパティを選択します。表示されたプロパティ設定で、”デバッグ”を選択し、起動するデバッガーを”Remote GDB”に、Remote Host NameをEdisonのWiFiのIPアドレスに、Private KeyはPuttyGenで作成したPrivate Keyのファイルを、Secure Shell ExecutableはPutty.exeのありかを、Remote Working Directoryは”/home/root/debug"と、Remote Executableは”BlinkLED”に設定します。

GDBOptionDebug

次に、VC++ディレクトリを選択し、インクルードディレクトリとライブラリディレクトリに、それぞれ、

  • インクルードディレクトリ ExtendDir\iss-iot-win_03-14-16\iss-iot-win\devkit-x86\sysroots\i586-poky-linux\usr\include
  • ライブラリディレクトリ ExtendDir\iss-iot-win_03-14-16\iss-iot-win\devkit-x86\sysroots\i586-poky-linux\usr\lib

とセットします。

GDBOptionDir

※厳密にいうと、この後でMakefileのルールでインクルードパスを指定するのでインクルードディレクトリはいじらなくてもよいかも。

さらに、NMakeの項目を選択し、Build Command Lineに”nmake /f Makefile"と、Clean Command Lineには”nmake /f Makefile clean"、Outputには”BlinkLED”と設定します。

GDBOptionNMake

MakefileやOutputのBlinkLED等は、次のMakefileの記述内容と対応しています。一通り記述し終わったら”OK”ボタンをクリックして設定を保存してください。

そして、Makefileという名前でテキストファイルをプロジェクトに追加します。Makefileの中身は、以下のように記述し保存します。

GCC=ExtendedDir\iss-iot-win_03-14-16\iss-iot-win\devkit-x86\sysroots\x86_64-pokysdk-mingw32\usr\bin\i586-poky-linux\i586-poky-linux-gcc.exe
PUTTY_DIR=PuttyDir\putty
REMOTE_HOST=root@xxx.yyy.zzz.www
REMOTE_WORKDIR=/home/root/debug
PRIVATEKEY=SSHKeyDir\helloedison-private.ppk
INCLUDE="-IExtendedDir\iss-iot-win_03-14-16\iss-iot-win\devkit-x86\sysroots\i586-poky-linux\usr\include\mraa"
SYSROOT="--sysroot=ExtendedDir\\iss-iot-win_03-14-16\\iss-iot-win\\devkit-x86\\sysroots\\i586-poky-linux"
TARGET=BlinkLED
BlinkLED: BlinkLED.o
$(GCC) $(SYSROOT) -lmraa -o $(TARGET) BlinkLED.o
$(PUTTY_DIR)\pscp -i $(PRIVATEKEY) $(TARGET) $(REMOTE_HOST):$(REMOTE_WORKDIR)
$(PUTTY_DIR)\plink -i $(PRIVATEKEY) $(REMOTE_HOST) chmod 777 $(REMOTE_WORKDIR)/$(TARGET)
BlinkLED.o: BlinkLED.c
$(GCC) $(INCLUDE) -O0 -g3 -Wall -c -fmessage-length=0 $(SYSROOT) -m32 -march=i586 -c -ffunction-sections -fdata-sections -o BlinkLED.o BlinkLED.c

clean:
del BlinkLED BlinkLED.o

ExtendedDirはクロスコンパイラの格納場所、PuttyDirは、Putty.exe、Pscp.exe、Plink.exeを格納している場所、SSHKeyDirはPrivate Keの格納場所( ファイル名は適宜変えてください)、xxx.yyy.zzz.wwwはEdisonのWiFi IPアドレスです。皆さんの環境に合わせて置き換えてください。

以上の作業が終わったら、Visual Studioの”▶ Remote GDB”をクリックします。すると次の順序でビルド、デバッグと進むことができます。

プロジェクトプロパティのNMakeでの設定に従い、nmake /f Makefileが起動される

  1. BlinkLEDを作成するために、BlinkLED.cがEdison用のクロスコンパイラでビルドされBlinkLED.oが生成される
  2. BlinkLED.oが、MRAAライブラリ等とリンクされ実行ファイルBlinkLEDが出来上がる
    ※現状では自動的に実行ファイルをリモートコピーを行う機能が用意されていないので、…
  3. Pscpを使って、EdisonにSSHを通じてリモートコピー
  4. Plinkを使ってSSHを通じて、BlinkLEDの実行権限を更新
    ※Pscp、Plinkを使ったリモートコピー、リモート権限変更をわざわざMakefile内に書く必要があります。なんだか残念

以上の手順が行われ、Visual StudioがGDB MIを通じて、Edison上のBlinkLEDを実行し、リモートデバッグが開始されます。BlinkLED.c内にブレークポイントを張っておけば実行ブレーク、ステップ実行なんかもできます。
RaspbianやLinux向けのリモートビルド&デバッグの時と比べると結構設定がめんどくさいのが現状ですが、GCCでローカル&クロスコンパイルできて、GDBでのデバッグがVisual Studio 上でできるようになるなんて、2年前なら考えられませんでした。Raspbian向けの機能で、リモートコピーとか色々自動にできているので、現状の、ローカル&クロスコンパイルとリモートデバッグ時のリモートコピー、リモート権限変更の実現はそんなに難しいことではないので、さっさと対応してほしいところですね。手動の設定は限りなく0に近いほうがいいのはあたりまえなんで。

後は、USBシリアル接続によるリモートGDBデバッグがあれば完璧なのですが。。。

以上、de:code 2016でお見せした、Edisonを使ったVisual Studio 2015 Update 2によるクロスコンパイル&リモートビルドのデモに関する設定詳細です。これ、クロスコンパイラがあって、SSH対応していてgdbserver対応しているプラットフォームなら何でもVisual Studio 2015 Update 2以上で開発ができるってことなんですね。そんな機器を扱っている皆さん、是非、いろいろ試してみてくださいね。