2013年2月21日木曜日

Raspberry Pi のクロス開発環境構築

※2016/07/13 追記
 Visual C++ for Linux Development という Visual Studio のプラグインで Raspberry Pi のリモートデバッグを行う方法をまとめてみました。よろしければ、そちらも御覧下さい。


 Raspberry Pi はクロス開発しなくてすむところがいいとこの辺で書きましたが、今回はあえて、Raspberry Pi 用のクロス開発環境の構築を行なって見ることにしました。Raspberry Pi にVNCで接続して、Geanyエディタでビルド→デバッグ(ステップ実行、変数ウォッチ等)で十分満足な環境ですが、以前にRaspberry Pi上でEclipseを動かそうとしたら重すぎてダメだったので、外部のDebian端末などからEclipseでクロス開発はできないかと思ってGoogle先生に聞いてみました。すると、このようなサイトがあったので、これをほぼそのまま真似させていただく形で試してみました。別にEclipseが使いたいわけではないんですが、Raspberry Piをマイコンと考えるとクロス開発環境を構築することに自体に興味があり、もし上手く行ったとしても使うかどうかはわかりません。
 と、いうわけで、ホスト側の環境はお試しということもあるので、VMWare Workstation 上に新たに用意したDebian 32bit環境です。"uname -a"すると、Linux Debian 2.6.32-5-686 と返ってきます。


 Raspberry Pi用の Cross Compiling Toolchain をインストールします。
 まず、手順に従ってgitをインストールします。コンソール(ターミナル)画面から
   sudo apt-get install git
 おっと、自ユーザをsudoファイルに追加していませんでした。スーパーユーザ端末を開いて
   visudo
 でsudoファイルに自ユーザを追加して、再度、sudo apt-get install git したところ、自分の環境では既にインストール済みのようでした。


 64bit版のホストOSを使っている人は
   sudo apt-get install ia32-libs
を入れる必要があるとのこと。自分は32bitなので、ここはパス。次にホームディレクトリ下に
   mkdir raspberrypi
して、フォルダを作成して、移動します。
   cd raspberrypi
 Github から Raspbian's cross compiling toolchain を落としてきます。
   sudo git clone git://github.com/raspberrypi/tools.git
ダウンロードには結構時間がかかりました。ダウンロード完了後、
   cd tools/arm-bcm2708
に移動して、 ls で確認すると
   arm-bcm2708-linux-gnueabi
   arm-bcm2708hardfp-linux-gnueabi
   gcc-linaro-arm-linux-gnueabihf-raspbian
というフォルダが作成されているはずです。
 次にPATHを通します。
   cd
でカレントディレクトリに戻って、
   vi .bashrc
で .bashrc を編集します。ファイルの一番最後に以下の記述を追加します。
   export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
変更を保存したら、同様に
   vi .profile
で .profile を編集します。ファイルの一番最後に以下の記述を追加します。
   export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
変更を保存します。
 ここで一旦
   sudo reboot
して、コンソールで
   arm-linux-gnueabihf-gcc -v
とすると、gccのバージョンなどがつらつらと画面に表示されればOKです。

 このあとのEclipse のセットアップは コピー元ネタのサイトでは apt-get してますが、自分は Debianの「システム」メニューから「システム」→「システム管理」→「Synaptic パッケージマネージャ」でセットアップすることにしました。eclipse で検索して、eclipse にチェックを入れると依存するパッケージも自動で選択されてインストール対象になるので、「適用」ボタンを押して、インストールを開始します。


 これで、とりあえず Eclipse の外側(あと、Java開発環境かな)がインストールされるので、Eclipse の 「Help」メニュー → 「Insall New Software」を選択して、Install画面を表示して、「Work with」プルダウンで「--All Available Sites--」を選択すると、とりあえず、デフォルトでEclipseのダウンロードサイトが設定されているはずです。「Programming Languages」の下の「Eclipse C/C++ Development Tools」にチェックを入れて、「Next」ボタンで先に進んでインストールを行います。インストールが終わるとEclipseを再起動するか聞かれるので、再起動します。

 Eclipse 上で 新しいC++ Project を作成します。メニューの「File」→「New」→「Others」を選択するか、ショートカットキーで Ctrl + N を押します。ウィザード画面が表示されるので、「C/C++」の下の「C++ Project」を選択して「Next」ボタンで進みます。


 Project name を適宜入力して、「Hello world C++ Project」→「Linux GCC」を選択します。


 「Next」ボタンで2つ進んで(必要ならBasic Settingに情報を入力して)、Select Configurations 画面の「Advanced settings...」ボタンを選択します。


 プロジェクトのプロパティ画面が開くので、左側のツリーから「C/C++ General」→「Paths and Symbols」を選択して、「Configurateion:」を「All configrations」を選択し、「Include」タブを選択します。「Languages」で「C++ Source File」を選択して、「Add」ボタンを押します。 


 「Add directory path」ダイアログが表示されるので、「File system...」ボタンでディレクトリを選択して、「OK」ボタンを押します。


 以下の5つのディレクトリを追加します。

  • /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/include
  • /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/libc/usr/include
  • /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/lib/gcc/arm-linux-gnueabihf/4.7.2/include-fixed
  • /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/lib/gcc/arm-linux-gnueabihf/4.7.2/include
  • /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/lib/gcc/arm-linux-gnueabihf/4.7.2/finclude
「Apply」ボタンを押した後、「Library Paths」タブを選択して「Add」ボタンで同様に以下の5つのディレクトリを追加します。
  • /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/lib
  • /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/libc/lib
  • /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/libc/lib/arm-linux-gnueabihf
  • /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/lib/gcc/arm-linux-gnueabihf/4.7.2
  • /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/libexec/gcc/arm-linux-gnueabihf/4.7.2

 「Apply」ボタンを押します。


 次に、左側のツリーで「C/C++ Build」→「Settings」を選び、「Tool Settings」タブを選択、「GCC C++ Compiller」を選択して、「Command:」の部分を
   arm-linux-gnueabihf-g++
に書き換えます。

同様に、「GCC C Compailer」の「Command:」の部分を
   arm-linux-gnueabihf-gcc
「GCC C++ Linker」の「Command:」の部分を
   arm-linux-gnueabihf-g++
「GCC Assembler」の「Command:」の部分を
   arm-linux-gnueabihf-as
に書き換えて、「Apply」ボタン→「OK」ボタンで Addvanced setting を閉じます。「Finish」ボタンでC++ Projectウィザードを完了します。

 "!!!Hello World!!!"を表示するプロジェクトが作成されるので、Project Explorer でプロジェクトを右クリックして「Clean Project」を選択すると、プロジェクトがクリーンアップされて、リビルドがかかります。プロジェクトのディレクトリの下のDebugフォルダの下にプロジェクト名の実行ファイルができます。自分は今回プロジェクト名を HelloRaspberryPi としたのでDebugフォルダに移動して、
   ./HelloRaspberryPi
と試しに実行してみたところ「バイナリファイルを実行できません」となりました。ここで、
   file HelloRaspberryPi
とすると、
   ELF 32-bit LSB executable, ARM, ~
と表示されました。どうやら、ARM CPU用の実行ファイルが生成されているようです。

 次は、Raspberry Pi へのデプロイです。
 Eclipse の メニューから「Window」→「Show View」→「Others]を選択します。


 「Show View」に「Remote Systems」が表示されない場合は、 メニューの「Help」→「Insall New Software」から「General Purpose Tools」辺りに「Remote System Explorer~」なんとかというのがあるので、これをインストールして下さい。
 追加された「Remote System Details」ビューで右クリックして表示されるプルダウンメニューから「
New Connection」を選択します。


 「SSH Only」を選択して「Next」ボタンで進みます。


 接続先のRaspberry Pi のIPアドレスを 「Host name:」に指定します。「Next」ボタンを数回押して設定を確認して(またはその場で)「Finish」ボタンを押して接続を作成します。
 「Remote System Detail」ビューに接続が作成されるので、右クリックして表示されるプルダウンメニューから「Connect」を選択します。


 ユーザ名とパスワードを聞かれるので、Raspberry Pi側のユーザ名とパスワードを入力します。デフォルトならユーザ名 pi でパスワードが raspberry です。
 「Remote System Details]ビューの接続したRaspberry Pi の行を右クリックして表示される「Show in Remote Systems view」を選択すると、ローカルマシンと接続したリモートのRaspberry Pi の両方をファイル操作できるビューが表示されるので、これを使ってローカル側の実行ファイルをRaspberry Piの適当なフォルダにコピーします。また、同Propertiesでコピーしたファイルのパーミッションも操作できるので、実行可能にしておきます。


  右クリックして「Launch Terminal」でターミナル接続も可能ですが、日本語が化けるのと、自分の環境では(Permissionを設定しても)上手く実行できなかったので、とりあえず、Tera Teramで別途実行してみました。


 コピーしたディレクトリに移動して
   ./HelloRaspberryPi
で実行。


 無事、Raspberry Pi 上で動作してくれることが確認できました。お疲れ様でした。

 いや~、しかし、こちらの解説がなければ、とても自分では出来ません。大変参考になりました。基本的に、ここに記述した内容は全て こちらの手順を自分でやってみた際の写し(作業記録)です。感謝、感謝。