ターゲット基板開発環境一覧

ARMのプログラムを作成してデバッグする 第4回

前回まででコードのクロスコンパイルをeclipse上で行うところまで出来たので、今回はデバッグについて設定を行っていきたいと思います。ターゲット上で動いているプログラムに対するデバッグとなるので、リモートデバッグを設定するという感じになります。

gdbserverを手動で起動する系

まずはターゲットでgdbserverを手動で動かして、そこに eclipse が接続を行う、というタイプで設定してきます。どこに問題があるか切り分けるためにも、まずはここから設定します。ワンタッチでリモートデバッグという点については後半で説明します。

コンパイル後出来上がったターゲット用のelfファイルをターゲット(実機)へ転送します。デフォルトだとDebugフォルダ以下に出来ていると思います。 Remote System Explorer パースペクティブを開いて、そのファイルを sftp 経由でターゲットの適当な場所へコピーします。
ここでは、 Jetson TK1 ターゲット標準ユーザーである ubuntu ユーザーのホームにプログラムを送ることにしました。
エクスプローラーからファイルを Remote Systems タブ内へのドラッグアンドドロップで任意の場所に転送できます。( eclipse 内でファイルのD&Dする方法はちょっと見当たらず・・・)

ターゲットでの操作

プログラムを転送したら、ターゲットでgdbserverでそのプログラムを実行します。
eclipse の Remote Systems から ssh Terminal を起動して操作するか、ターゲットのキーボードをたたいてコマンドを実行して下さい。
初回の転送後はファイルが実行属性が付いていないので、それも設定する必要があります。

実際に待っているとこうなります。
waiting_gdb

eclipseのデバッグ設定

この待ち受けしているターゲットに対して、gdb接続をするための設定を行っていきます。
プロジェクトを右クリックして、 Debug As / Debug Configuration を選んで、設定画面を出して下さい。

そして、「C/C++ Application」を選んで、 New Launch Configuration ボタンを押してコンフィグを作成します。作成すると以下のような感じになると思います。

debug_configuration_1

そして、画面下部のほうにある 「Using GDB(DSF) Create Process Launcher – Select Other 」 のリンク部分をクリックして、次のように設定します (Standard Create Process Launcher を選択)。

standard_create_process_launcher

次に、Debuggerタブを開きます。そして以下の設定に変更します。(Standard Create Process Launcher を選択しないと以下の設定ができないんです)。

  • Debugger: gdbserver
  • GDB Debuger: D:\Linaro\gcc-linaro-arm-linux-gnueabihf-4.8-2014.04\bin\arm-linux-gnueabihf-gdb.exe

debugger_tab_gdbserver

上記を見てわかるとおり arm-linux-gnueabihf-gdb.exe のフルパスが入っています。ここは各自の環境に合わせて修正してください。

この中の「connection」タブを開き、以下のように設定して下さい。

  • Type: TCP
  • IP Address: ターゲットのIPアドレス
  • Port Number: 2345

これらの設定が終わったら、Apply ボタンを押して、Debug ボタンを押してデバッグを開始します!!
うまく設定ができていれば以下のようにブレークポイントを設定したところで停止します。
eclipse_debugbreak

全てを自動で!ボタン1つでリモートデバッグを開始

今までのものがうまくできていれば、もう後一歩で手軽なリモートデバッグができるようになります。ここで実現することは、ビルドしたファイルを転送し、 eclipse のデバッガ操作を受け付けるようにする、といったものです。すなわち前章で手作業をした部分ですね。

ターゲットの設定

今回は特に必要ありません。gdbserverがパスの通った場所に配置されていればOKです。

eclipseの設定

先ほどと同じですが、デバッガ設定の部分が異なります。ですので、Debug Configurationの画面を開きます。

今度は「C/C++ Remote Application」を選んで、 New Launch Configuration ボタンを押してコンフィグを作成します。作成すると以下のような感じになると思います。

debug_configuration_remote_1

ここで先ほどと同様に、画面下部のほうにある 「Using GDB (DSF) Automatic Remote Debugging Launcher – Select Other 」 のリンク部分をクリックして、次のように設定します ( Standard Remote Create Process Launcher を選択)。
debug_configuration_remote_2

すると戻ったときに画面が変わりますので、以下のように編集します。基本的には、以前に作成した接続情報を選択したり、実行体バイナリを配置するパスを記入したりといったことになります。

debug_configuration_remote_3

みてわかるとおり、実行前の処理で実行属性をつけています。続いて、Debugger タブを開いてさらに設定をおこないます。
基本的には、さきほどやったように使用する gdb のフルパスを入れたり、プロトコルを設定したりします。

debug_configuration_remote_4

ここでプロトコルを「mi2」に指定してます。これがポイントで、 default, mi1 とか設定の場合、自分の環境ではうまくデバッグ接続を確立できませんでした。

設定が終わったら、 Apply ボタンを押して、 Debug ボタンを押して、リモートデバッグを開始します。うまくいけば以下のようにブレークポイントで停止した状態になると思います。

debug_configuration_remote_result

まとめ

ようやくボタン1つでリモートデバッグができるところまでたどり着けました。しかも基本 Windows 環境なので、通常Windowsを使っているユーザーには開発の敷居が低くなった、と自負しております。 VMPlayer に Ubuntu などの Linux 環境を入れてそこで開発するスタイルに比べれば、動作が比較的軽いと思いますし、その点でも環境はよくなったと思います。
今回、makeの都合で若干MinGWのお世話になってしまいますが、それでも cygwin よりはまだWindowsよりといっていいと思います。cygwin でコンソールでがんばって開発するスタイルもまたアリだと思いますけど、やっぱりデバッギングは GUI が色々とあった方が効率よいですしね!

今回は Jetson TK1 で行いましたが、他のターゲット(Raspberry PIや類似基板、他のボードなど)でも、そこそこ同じ手順で環境実現出来るんじゃないかと予想しています。またそれらのものを触る機会があったらご報告したいと思います。やってみた方のコメントもまた募集しておきたいと思います。


ARMのプログラムを作成してデバッグする 第3回

前回までにおおよそ必要な物は準備できたので、今回はそれらの設定を行っていきます。

sshログインの設定

eclipse にプラグイン (Remote System Explorer) を導入したことで、ssh のターミナルや sftp を eclipse から操作することができるようになります。
ファイルの転送について、GUI上でドラッグアンドドロップで操作できるのはすごく楽になると思います。今までならWinScpを別途立ち上げるとかだったと思います。

メニューから Window / Open Perspective / Other と選択し、Remote System Explorer を選びます。
新しく、Remote Systems というタブ(ウィンドウ)が開くと思います。
この開いたウィンドウで、新規にコネクションの作成を行います。
ウィンドウ上で右クリックし、New/Connection… を選んで下さい(あるいは追加のボタンを押しても可).

以下のようなウィンドウが開くと思います。ここでは対象がLinuxを選びます(Jetson TK1がそうなので)

select_remote_system_type

続いて対象のIPアドレスを入力します。そしてNextボタンを押します。

remote_linux_system_connection
その後のウィンドウでは、ssh.files、processes.shell.linux、ssh.shells, ssh.terminals と順番に選んで設定を完了させます。
設定が完了した後では、以下のように登録されていると思いますが、ここで右クリックしてプロパティを開きます。

remote_system_tab_add

そして、デフォルトのエンコーディングを UTF-8 にしておきます(おそらく最近はこちらのケースが多いでしょう)

remote_system_property

あとは、右クリックして Connect でターゲットに対して接続を行います。また Sftp Files ではターゲットのディレクトリツリーを確認できますし、Ssh Terminals で右クリックして Launch Terminal を選ぶとsshのシェルを開くことが出来ます。

もう、ちょっとしたシェルのために別アプリを開かなくていいので大変楽になります~。

C,C++のプロジェクトを作ってクロスコンパイル

eclipseで C/C++ のサンプルを作って動作の確認および設定を行っていきます。
まずは、簡単なプログラムHello,worldを作ってみます。

メニューから File / New / Project と辿り、C/C++の C++ Project を選択します。
すると詳しい情報を入力するウィンドウが開くので、ここでは以下のように設定してみます。

  • Project Name: HelloWorldArm
  • Executable は Cross-Compile Project

cpp_project_cdt

続いてクロスコンパイル用のツールに関して以下のように入力します。
今回のターゲット Jetson TK1 は Linaro の eabihf のものを使用しているのでこんな感じになります。

  • Tool command prefix: arm-linux-gnueabihf-
  • Tool command path: D:\Linaro\gcc-linaro-arm-linux-gnueabihf-4.8-2014.04\bin

cross_gcc_config
もし他のツールチェインを使う場合にはこれらの設定を対象の物に変えてあげればうまくいくかなと思います。

プロジェクトを作成したら、プロジェクトを右クリックして New / Other を選択してダイアログを開き、「Source File」を選択します。
ファイル名には適当に、main.cppとでもしておきます。

こうして作成したファイルに、以下のように適当なプログラムコードを記述します。

作成したら、プロジェクトを右クリックして、「Build Project」を選択します。するとコンパイルが開始されます。
以下のようになると思いますが、エラーが出ている場合には make コマンドが実行できているか確認するところから調査します。Msysで入れ忘れているか、パスが通っていないかだと思います。

cdt_build_log

ソースコードのビルドまで、たどり着きました!
メニューから Project / Build Configurations / Set Active と辿ることで、デバッグビルドとリリースビルドの選択切り替えができるようです。

次回は、デバッグについて設定していきたいと思います。


ARMのプログラムを作成してデバッグする 第2回

前回から随分と時間が経ってしまいましたが、ターゲットを Jetson TK1 として環境を構築していきたいと思います。
同じことが Raspberry Pi や似たようなARMボードでも通用するんじゃないかと思います。まあなんといいますか、最近そういうのが流行ってるらしいので。組込用のボードで遊ぶっていうかクロスコンパイルってやつが。

実現することは、『Windows環境でクロスコンパイルおよびリモートのデバッグを可能とすること』です。
VMware の VMPlayer に UbuntuなどのLinux環境を入れて実現というのは、既によく語られている方式で安定して動くのでしょうが、割と動作が重くなりがちです。今回は仮想環境を使わないで環境を準備するというのを目標としています。

準備(ターゲット)

とりあえずリモートからのデバッグということで、ターゲット機には gdbserver をインストールしておきます。
gdbserverをターゲットでコンパイルして、パスの通った場所においておくか、Jetson TK1 なら apt-getでのインストールも可能です。

あとは既に動いているかと思いますが、ssh server(sshd)もサービス起動できるようにしておきます。
また、IPアドレスの取得なども正常にできていることは確認しておいてください。

準備(Windows)

開発環境としてはやはりeclipseを使用します。
他には Linaro のサイトから Windows用のクロスコンパイラなどツールチェインを取得しておきます。
またmakeが必要になるので、MinGWの環境もインストールしたいと思います。確認はしていないですが、cygwinのmakeでも流用可能かもしれません。

eclipseは、ちょっと古いですが eclipse-SDK-3.7-win32.zip を使用しました。他のものでも問題ないと思います。
Linaroからのツールチェインは、gcc-linaro-arm-linux-gnueabihf-4.8-2014.04-20140416_win32.exe をダウンロードしました。
ダウンロードのサイトは、http://www.linaro.org/downloads/です。ここからダウンロードして下さい。見た感じインストーラー付属のものしかなさそうです。ここでは、D:\Linaro にインストールしてみました。
インストールすると、D:\Linaro\gcc-linaro-arm-linux-gnueabihf-4.8-2014.04 以下に色々とツールがインストールされました。

linaro-gcc
続いて MinGWのインストールです。
MinGWは http://www.mingw.org/ から取得できます。ですが、このサイトからダウンロードするべき物がわかりづらいです。
mingw-get-setup.exe というものが見つかると思うので、これをダウンロードして実行し、ここからMinGW と MSYS とをインストールしてください。このとき、MSYSに含まれる make がインストールされるように、パッケージの確認をおこなっておきます。

ここでは、D:\MinGW にインストールを行いました。
そして、D:\MinGW\msys\1.0\bin に色々とツールが入っているので、ここにPATHを設定しておきます。
(環境変数 PATH の値に、D:\MinGW\msys\1.0\bin を末尾にでも追加しておいて下さい)

eclipseにプラグインを導入

以下のプラグインをインストールします。

  • C/C++ Development Tools
  • C/C++ Development Tools SDK
  • C/C++ GCC Cross Compiler Support
  • C/C++ Memory View Enhancements
  • C/C++ Remote Launch
  • Remote System Explorer End-User Runtime
  • Remote System Explorer User Actions

メニューのヘルプから Install New Software を選択し、利用可能なサイト全ての項目を選んで、上記項目をいれていけば見つかると思います。

eclipse-cdt

必要な物はこれでそろったので、次回はこれらを設定して環境を組み上げていきます