CentOSにてEclipseを使ってC++のコードをクロスコンパイルし、Raspberry Pi用プログラムを作る

6月末に書いた記事「ド素人がRaspberry Piで電子工作を始める」では、シェルスクリプトを使ってLEDを点灯できました。シェルスクリプトは簡単に始められますが、もしC言語でプログラムを書けるようになれば、可能性が大きく広がると思いました。最終的には開発環境を構築し、ストレスのないプログラミングができるようになりました。

まず最初にelinux.orgに書かれているサンプルプログラムを動作させました。

このプログラムはあまり使い勝手がよくありませんでした。というのも命令を暗記する必要があるからです。例えば、GPIOのセットアップを行うために、

を実行しています。ということは、setup_io()を実行することを覚えておく必要があります。C言語は手続き型なのが原因です。

電子工作の世界では、どうもC言語を使うのが一般的なようです。多くの人はPICとよばれる回路制御用ICチップを使っており、PICに命令を書き込むためのプログラムをC言語で記述しているようです。PICは1975年に発売開始され今に至るので、もはやデファクトスタンダードなのだと思います。

一方、C++言語はオブジェクト指向です。大雑把に言うと、C++ではCのように命令を暗記する必要がありません。実際に私の開発環境を見ていただくと、意味がわかりやすいと思います。

Eclipse-Developing-Environmentgpio.setとタイプした直後の画面なのですが、setで始まる命令が一覧表示されています。まずgpio.とタイプすると同時に一覧が出て、その上でsetと続けてタイプするとsetで始まる命令に絞られます。よってgpio.とタイプすれば命令を暗記しなくても何とかなるのです。C++の特徴をなんとなく理解していただけましたでしょうか。

ところで、関連命令一覧が自動的に表示されるのは、C++を使っており、かつエディタが一覧表示機能を持つからです。よって、私のように開発するには開発環境を構築する必要があるのです。

初めにお断りしておかなければならないのですが、開発環境の構築は初めての人にとってはかなり大変です。ここで全てを説明するのも理解していただくのも無理だと思います。ここでの目的は水先案内です。各項目の詳細は検索したり文献を参考にしたりしてください。

一番スマートなやり方はラズベリーのGUI環境でEclipise(後述)を使う事ですが、残念ながらラズベリーはそこまでCPUやメモリなどのハードウェアスペックが高くないので、これは無理なようです。私はやったことはありませんが・・・。そこで普段使っているWindowsマシンを使用し、開発環境を構成しました。マシンのCPUはIntel Corei7-3770です。これは3.9GHzで8コアです。メモリはDDR3-1600 (PC3-12800)の4GBが2つです。(計8GB)

開発環境はOS、仮想マシン、エディタ、コンパイラから構築されています。

OS

よく目にするOSはWindowsやMacOSですが、私が利用しているのはLinuxです。WindowsやMacOSとは異なり、Linuxはプログラミングに関わるサポートが非常に充実しています。Linuxにも色々な種類があり、私はCentOS 6.4を利用しています。CentOSを動かすには新たにパソコンが必要です。しかしそのためにもう一台パソコンを用意するわけではありません。普段使っているパソコンの中に新たにパソコンを作成します。この新たなパソコンを仮想マシンと言い、仮想マシン構築のためのソフトがVMwareです。

VMware

VMwareというソフトを使うと、仮想マシンを作成して、その中にWindowsやMacOS、LinuxといったOSをインストールすることができます。このメリットは新たにパソコンが不要な事だけではありません。好きなタイミングで仮想マシンを丸ごと保存しておけるのです。もしCentOSの調子が悪くなってしまったら、最初に作ったCentOSを読みこむだけでいいのです。

WindowsのVMwareには2つの種類があります。PlayerはスタンドアロンのVMwareで、無料で利用できます。Workstationは有料ですが、各OSを同時に複数起動したり、ネットワーク上にある他のPCから各OSを利用したりできます。私はWorkstationを利用していますが、本記事の範囲内ならばPlayerで十分です。

MacのVMwareはFusion(のみ?)で、価格は1万円前後です。

Eclipse

Eclipseはプログラムを作るためのエディタです。Eclipseを使うと、C、C++だけでなく、Java、Perl、Pythonなど、あらゆる言語でのプログラム作成が簡単になります。先ほどgpio.setとタイプすると候補が表示されたのはEclipseの機能です。(そしてC++がオブジェクト指向プログラミング言語だからです。) なお、Eclipseはただのエディタなので、プログラム言語を実行するためにはコンパイラが必要です。

OS、VMware、Eclipseの関係については、この画像を注意深く見るとわかります。

VMware

画面の一番外側はVMwareです。ウインドウ枠のデザインの通り、VMwareはWindows7上で動作しているソフトにすぎません。VMwareの左枠にはインストール済みのOSが表示されています。OSを選んで再生ボタンを押すと、右枠にOSそのものが起動します。画面ではCentOSが起動しています。そして、CentOS上でEclipseが起動されており、Eclipseにてファイルを編集しています。このように1つ1つの要素が入れ子になっているのです。

コンパイラ

コンパイラはプログラムファイルを実行ファイルへ変換するためのプログラムです。CentOS上でEclipseさえインストールできれば、CentOS上で動作するC/C++プログラムならEclipse上でコンパイルするのは簡単です。しかしこの実行ファイルはラズベリー上で動作しません。(Eclipseがラズベリー上で動作するのが一番手っ取り早いのですが。) そのため、私はラズベリー購入当初、まずCentOS上のEclipseでコンパイルしてみて、エラーにならなければプログラムをラズベリーへコピーし、ラズベリー上でコンパイルしていました。実際にはラズベリーへコピーするのではなく、フォルダをネットワーク共有させていました。プログラム規模が小さいうちは10秒程でコンパイルが完了していたと思いますが、プログラム規模が大きくなってくると次第に時間がかかるようになってきました。そこでクロスコンパイラをインストールしました。

クロスコンパイラ

コンパイラが作成する実行ファイルは、コンパイルしたOS上でのみ動作します。なのでCentOSでコンパイルしたプログラムはCentOSだけで動作しますし、ラズベリーでコンパイルしたプログラムはラズベリーだけで動作します。CentOSのコンパイラが直接ラズベリーの実行ファイルを作成してくれればと思いませんか?クロスコンパイラはまさにこれをやってくれます。

クロスコンパイラをCentOSの「ソフトウェアの追加/削除」機能を使ってインストールできればいいのですが、一覧にないためインストールできません。よってクロスコンパイラを自分でコンパイルする必要があります。これのために必要なのがcrosstool-NGです。コンパイラがコンパイラをコンパイルするのでしょうか?鶏が先か、卵が先か、みたいです。

crosstool-NG

crosstool-NGはクロスコンパイラをコンパイルするためのツールです。crosstool-NG自体はクロスコンパイラではありません。まずcrosstool-NGの設定画面で設定を行い、次にcrosstool-NGにクロスコンパイラをコンパイルさせます。コンパイルには15分程かかりました。

さて、ここまで苦労すると見返りも大きいです。初めにご紹介したように、C++での開発をEclipseで行えます。そしてCentOSでコンパイルした実行ファイルはそのままラズベリーで動作します。それだけではありません。コンパイル速度が劇的に向上します。

私はプログラムを拡張し続けているので、1つの実行ファイルを作るために18ものcppファイルをコンパイルする必要があります。この速度を比較してみました。

  • ラズベリー付属のコンパイラでラズベリー上でコンパイル
  • 作成した開発環境でクロスコンパイル

Compile-Time_jaすごい違いですね。グラフではわかりにくいですが、わずか2秒でコンパイルが終わります。

冒頭ではPICについて触れました。私はPICのコンパイルがどのようなものか、実際に購入してやってみました。PICを動作させるにはここで説明した工程と同じように、まずプログラムを書き、プログラムをコンパイルし、PICへ書き込む必要があります。この一連の流れをMPLABというソフトが全て担当します。大雑把に言うと、MPLABはエディタでもあり、コンパイラでもあり、PIC書き込みソフトでもあります。

ラズベリーが発売される前はMPLABを使って開発するのが一般的だったと思います。しかし、今回説明したようにコンパイルから実行までの一連の作業を行うにはどれだけ時間がかかるでしょうか。PICチップをライターに刺し、コンパイルし、PICチップを回路に戻し、動作させるとなると、2秒ではまず無理でしょう。

何が言いたいのかというと、ラズベリーで開発するのはかなり強力な手段になるという事です。電子回路がある程度の形になるまではラズベリーで開発し、回路を実装するときにPICへ移植するという運用ができるのではないでしょうか。

ただしPICと開発言語には制限があります。私の独自調査ですが、PIC8やPIC12、PIC16チップはC++のコンパイルができませんが、PIC32であればC++のコンパイルが可能です。

おまけ

“ct-ng build”を実行する際は、少なくとも2GBのメモリを仮想マシンに割り当てないと、以下のエラーになります。

CPUコア全てを仮想マシンへ割り当てましょう。上に書いたCPUでさえ、ct-ng buildには15分もかかりました。初めは2コアしか割り当てておらず、ct-ng buildには28分もかかりました。以下のグラフはct-ngがどのようにリソースを使うのかを示しています。

System-MonitorEclipseにてクロスコンパイラを追加するには、新しく構成(画面ではARM)を作り、コンパイラへのフルパスを指定します。

Eclipse-Compiler-Settingビルド設定にて並列ビルドをONにします。並列ジョブをCPUコアの数にします。

Parallel-Compilationもし本記事に興味、ご関心があれば、ぜひ「ラズベリーと電子工作の記事一覧を見てください。例えばこんな記事があります。

  • ド素人がRaspberry Piで電子工作を始める
    ラズベリーパイ財団が制作したたばこの箱サイズのパソコン「Raspberry Pi」は、私をパソコンから電気工学へ橋渡ししてくれる存在となりました。基盤やコネクタに群がるゾンビにしてしまったと言った方が正確かもしれませんが(笑)。
  • Raspberry Piで電子工作 その2
    電流、抵抗、電圧の意味がわからず、アキバのパーツ屋で買物すらできなかった私。勉強のためにお金をつぎ込んだ結果、だんだんと意味がわかってきました。
  • Raspberry Piでの電子工作にあたって購入した道具
    ラズベリーで電子工作を始めて4ヵ月が経ちました。勉強を進めるにあたり、本や電子パーツ、道具など、必要に応じて購入する必要がありました。今日は私がラズベリー以外に購入した道具を紹介します。

This post is also available in: 英語

コメントを残す

メールアドレスが公開されることはありません。