組込みプログラミングにEclipseを使う

EclipseはIBMが開発してオープン・ソース化した大規模な統合開発環境です。このソフトは本来JAVA用に開発されましたが、強力な柔軟性を持っているため、プラグインを付け足すだけで多くのソフトウェアに対応できます。たとえば、C/C++言語、PHPなどといった言語用のプラグインがあります。また、CVSやリファクタリングの機能を最初から備えているため、オープンソース・コミュニティでは広く用いられています。

Eclipseを組み込みソフトの開発に使うことが出来れば、いろいろな作業が非常に楽になります。バージョン管理は当然CVSを使えますし、エディタはカラーリングされ、ファイルを保存すればビルドが始まり、エラーが起きた行にアンダーラインが引かれると、至れり居つくせりです。しかし、本来JAVA言語用の環境と言うことで組込みからは距離が遠く、使うにはそれなりに敷居が高いソフトでもあります。

以下、私がCQ出版デザイン・ウェーブ・マガジンの付録で遊ぶ際に行ったEclipseの設定を説明します。Windows上の環境であり、ツールチェーンにはGNUARMを使い、gdbを使ってJTAG経由でデバッグできます。ICEはWiggler互換のものを使います。なお、Eclipse固有の用語を多く使いますが、到底ここではそれらの意味を説明できません。一般的な利用方法は各種書籍、NET上の情報を参考にしてください。

2007年3月に組込みプログラミングにEclipseを使う(2)として、PizzaFactoryを使った環境構築について書きました。

参考資料など

2006年2月現在、Eclipseはちょっとしたブームなので、Eclipse本は本屋に山積されています。好きな本を買ってきて二三冊読めば基本知識は得られると思います。

必読書として、OlimexJTAGドングル・ページにあるARM Cross Development with Eclipse Rev 3を挙げています。この文書は同社のドングル拡販用の資料ですが、Eclipseを組み込みに使う上での重要な情報が掲載されています。ただし、2005年11月版がたった3ヶ月くらいで古い情報となっていますので、注意が必要です。私の以下の説明は、この文書の補完資料となっています。

必要なソフトウェア

以下のソフトウェアが必要になります。

JAVAランタイムは、Eclipseを動かすために必要です。Sunのサイトからダウンロードできます。私はJ2SE 5.0 Update 6を使っています。Eclipseが要求するバージョンを調べておくとよいでしょう。J2SEにはランタイムだけのJREと、開発ツールを含むJDKがあります。Eclipseを組込みに使うだけならJREでも大丈夫です。

Eclipseは統合開発環境の本体です。総本山のeclipse.orgからダウンロードできますが、おそらく最新安定版は使えないので気をつけてください。私はダウンロード・ページから開発マイルストーン版のEclipse 3.2 M4を入手して使っています。

CDTは今回の開発環境構築において要となるソフトです。これはEclipseのプラグインで、EclipseにC言語対応機能を追加します。残念なことに現時点で標準のCDTは組込みデバッグに対応していませんので、標準CDTではなくパッチをあてたZylin CDTを使用します。Zylin CDTは必要とするEclipseを厳しく選びますので必ず最新版のCDTがどのEclipseを必要とするか調べておいてください。わたしは20060221版を使っています。この版を使うためにEclipse 3.2 M4が必要になったのでした。

Cygwinはgnuのツールチェーンを動かすために必要です。最新版で問題ないでしょう。

GNUARMはARMプロセッサ用のgcc, binutil, gdbなどをまとめたコレクションです。Eclipseで使うことに関してはバージョンの要求は厳しくありません。しかし、TOPPERS/JSPなど、バージョンに神経質なものもありますので気をつけてください。私は3.4.3を使っていますが、特に深い理由はありません。

OCDemonMcreigor社が自社のWiggler ICEのために開発して一般に公開しているソフトウェアです。このソフトウェアはネットワーク上でgdbserverとして動作し、PCのプリンタ・ポートに接続されたWiggler ICEを操作します。gdbserverとして動作するため、gdbから操作することが出来ます。

ICE

Wiggler ICEは互換品の回路図が広く知られており、自作することが出来ます。たとえば、jtag-arm9 projectにやHardware Recyling Initiativeにその例があります。単純な回路ですので作るのは簡単です。ただし、いずれの回路も5V系で組んでありますので、3.3Vの回路と接続する場合はそれなりに気をつけてください。私は独立の3.3V電源を与えて、ターゲットとは電源系を分離しています。

公開されている回路図には描かれていないことですが、Olimexの文書によると最近のOCDemonはプリンタポートの8番ピンと15番ピンを使ってケーブルの検出を行っています。正しく動作させるためにはこの二つピンをショートさせます。

また、OCDemonはプリンタポートがECPモードだと正しく動かないため、あらかじめPCのBIOSから内蔵プリンタ・ポートの設定をEPPに変更しておきます。

最近はOpenOCDOptimize社MINI EZ-USBなど、ARM用の低価格gdbserverとして利用できるものが増えてきました。これらはOCDemonの代わりに利用できるはずです。

インストールの手順

インストールの順番は、

  1. JAVAランタイム
  2. Eclipse
  3. Zylin CDT
  4. Cygwin
  5. GNUARM
  6. OCDemon

の順番になります。1-3と4-6は相互に依存しないので、順番をひっくり返してもかまいません。1,4,5,6はWindowsの通常のソフト同様にインストーラーを使っていますので特に注意点はありません。

Eclipseは単なるzipファイルとして配布されています。展開するとeclipseフォルダを作り、その下に必要なサブフォルダを展開します。そこで、c:\直下に展開すれば、c:\eclipseが作られて、見通しの良い構成になります。

CDTもzipファイルです。これもEclipseフォルダに展開すると、pluginsサブフォルダとfeaturesの下に必要なファイルを展開します。

インストールが終わったら、Cygwinのbashを起動し、arm-elf-gcc.exeおよびocdremote.exeへのパスが通っているか確認してください。

デバッガの設定

Eclipseはソース編集に関してはとても簡単ですが、デバッグ環境の構築は少し難しいです。デバッグ環境に関しては、上に挙げた文書を読んだ上で以下の文章を参考にしてください。

まず、Eclipseを起動し、workspaceを作って、適当な組込みプロジェクトを作ります。GNUARMが処理できるものなら何でもかまいません。「はじめにプロジェクトありき」であるところがEclipseの困ったところですが、参考になりそうなプロジェクトを文末にリンクしておきますので、ADuC702xやDesign Wave Magazineに付録として付いていたFRK-ADuCを使うのであればそれを土台にするのもひとつの方法です。

プロジェクトができてデバッグオプションつきのビルドが終了したら、デバッグ環境を作りましょう。Eclipseはデバッグ環境をプロジェクトごとに用意します。

デバッグ環境の作成

メニューバーRunDebug...を実行すると、図1のようなDebugダイアログが現れます。

図1 Debugダイアログ

右側のconfigurationリストにツリー構造が見えますが、初期状態では平坦に項目が並んでいるだけです。重要なのは図で選択状態にある"Embedded debug launch"があるか否かです。あるならば、Zylin CDTが正しくインストールされています。ないならばインストール方法を間違えたか、Zylin CDTとEclipseの版に不整合があります。上の文書を読み返し、プラグインのインストールに関する他の文献を参考にしてもう一度インストールしてください。

さて、初期状態で並んでいるconfigurationはすべてテンプレートなので、自分のプロジェクト用に実体化する必要があります。そこで、さっそくひとつ作ってみましょう。"Embedded debug launch"を選択して下のNewボタンをクリックしてください。そうすると、configurationの下に新たな枝が生まれます(図2)。

図2 新しいデバッグ環境の作成

一番上のName欄はデバッグ環境を表す名前です。自分にわかりやすいものをつけてください。後で付け直すことも出来ます。ARMの場合、シミュレータとJTAGの二つのデバッグ方式を使えるので、プロジェクト名とデバッグ方法の組み合わせにするといいでしょう。

Project欄はその名のとおり、ワークスペースの下に作ったプロジェクト名を入れます。間違いを防ぐためBrowse...ボタンを使って設定してください。

C/C++ Application欄は、デバッガに与える実行ファイル名を指定します。これも間違いを防ぐため、Search Project...Browse...を使って設定してください。

次にDebuggerタブをクリックしてデバッグに使うツールを指定します。GNUARMの場合はarm-elf-gdbがデバッグツールです。

図3 デバッガの指定

次はCommandsをクリックしてデバッガに与える初期コマンドを指定します。

図4 初期コマンドの指定

図4のCommands欄にあるのがarm-elf-gdbに与える初期コマンドです。これらはarm-elf-gdbがEclipseによって呼び出されると、必ず最初に与えられます。上の設定はADuC7026のように、プログラムをフラッシュROMにおく場合の設定で、Olimexの文書にあるものをそのまま使っています。少し説明しておきましょう。

target remote localhost:8888
gdbserverの種類とアドレスを教えます。この例では、gdbserverはEclipseと同じホスト(localhost)にあり、ポート8888で接続を待っています。アドレスlocalhostやポート8888といったパラメータは、OCDemonを動作させる環境に合わせて変えてください。なお、8888については後でもう一度出てきます。
monitor reset
これはOCDemonに送るコマンドです。ターゲットのARMコアをリセットします。このコマンドはOCDemon以外のデバッガでは異なるかもしれません。
monitor softbkpts off
これはOCDemonに送るコマンドです。ソフトウェア・ブレークポイント機能を禁止します。ROM上ではソフトウェア・ブレークポイントを使えませんので、これは重要です。このコマンドはOCDemon以外のデバッガでは異なるかもしれません。
set $pc=0
ターゲットのプログラムカウンタをアドレス0に設定します。ARM7TDMIコアのばあい、これはリセットベクトルの位置です。
symbol-file spitest.elf
シンボル・ファイルをロードします。Flash ROMの中のプログラムにはデバッグ用のシンボル情報がありません。そのため、ソースコード・デバッグを行うためにはシンボル情報をどこからか持ってきてgdbに教えてやる必要があります。これがそのコマンドです。
thbreak main
シンボル"main"の位置にハードウェア・ブレークポイントを張ります。ハードウェア・ブレークポイントは同時に2つまでしか使えません。mainにブレークを張ったので、プログラムを走らせるとmain()関数の先頭で停止します。
continue
ターゲット上でのプログラム実行を開始します。

以上の設定により、JTAGデバッグ時にはデバッグconfigurationの開始ともにターゲットが実行を開始し、main()関数でプログラムが停止します。

設定が終わったらApplyボタンを押して設定を適用します。

ついでにシミュレーション環境も作る

上で説明したJTAGによるデバッグ環境とほとんど同じ手順でARMシミュレーション環境を作ることが出来ます。図1で説明した方法で、あたらしいEmbedded debug launchをつくりシミュレータであるとわかるような名前をつけます。MainおよびDebbgerタブは先のJTAG環境と同じ設定にします。

ことなるのはCommandsタブです。

図5 シミュレーション環境の初期コマンド

シミュレーション環境では初期コマンドを与えません。本来ここには

target sim
load

という二つのコマンドを書くべきなのですが、どういうわけか私の環境ではこの二つを初期化コマンドで実行するとうまく行きませんでした。そこで、現在は空白で使っています。ひょっとするとどれかのツールを更新すると解決するかもしれません。

OCDemonを登録する

OCDemonを外部ツールとして登録しておけば、Eclipseから抜けずに呼び出すことが出来ます。

メニューバーRunExternal ToolsExternal Tools...を実行すると、図6のようなExternal Toolsダイアログが現れます。

図6 外部ツールの登録

External Toolsダイアログを表示した時点では左のConfigurationsは平坦なリストです。そこで、Programを選択し、Newボタンをクリックすると新しい枝が現れます。あとは図6のように、Nameで適当な名前を設定し、Locationで実行ファイルを指定します。実行ファイル名はocdremote.exeです。

Argumentsは重要で、これはocdremote.exeに与える引数です。

-c
CPUの型を指定します。ADuC7026の場合はARM7TDMIです。
-p
ocdemonがgdbserverとして働くときに監視するポート番号を指定します。これは先に説明したgdbの初期コマンドで指定するポート番号と同じでなければなりません。
-d
デバッグに使うハードウェアを指定します。
-a
ハードウェアのアドレスです。WIGGLERの場合、接続するプリンタポートの番号です。
-s
速度です。4くらいで始めて、必要ならば数字を変えると良いでしょう。小さいほど高速です。

図6を見ていただいたらわかるように、私はADuC7026のシリアル・プログラマであるARMWSDも外部プログラムとして登録しています。このように、よく使うコマンドは積極的に登録すると良いでしょう。設定が終わったらApplyボタンをクリックして保存し、Closeボタンで閉じます。

デバッグを行う

デバッグを行うにはEclipseの画面をデバッグ・パースペクティブに切り替えます。切り替えにはメニューバーWindowOpen perspectiveDebugを実行します。

シミュレーション環境で動かす

次にメニューバーRunDebugを実行します。Debugダイアログが開くので、シミュレーション用に作ったデバッグconfigurationをクリックし、Debugボタンを押します。私の場合、デバッグconfigurationの名前はspitest by simulatiorとなっています。

実行すると図7のようにDebug Viewにターゲットが現れます。

図7 Debugビューに現れたターゲット

この状態で、コンソールに次の二つのコマンドを打ち込みます。

target sim
load

すでに説明しましたが、これは本来デバッグconfigurationの中で初期実行コマンドとして与えても良いものです。しかし、私の手元ではうまく行きませんでしたので手で打ち込んでいます。将来の版では初期実行コマンドとして与えても良いかもしれません。

図8 コンソール

ロードはすぐ完了します。これで準備は整いました。いったんDebugビューに戻り、"Embedded GDB"をクリックして選択します(図9)。そして

図9 実行直前

最後にメニューバーRunResumeを実行すると、ターゲットが走り始め、main()の先頭でブレークがかかり、停止します。ソースウインドウは自動的に開きます。

図10 ソースウィンドウ

図10は実行後main()の先頭でブレークポイントがかかり、停止した状態です。緑色のラインがブレークのかかった位置です。設定が大変でしたが、この後のEclipseのデバッグ作業そのものは他のIDEによるそれとそれほど変わりありません。

JTAG接続で動かす

いよいよ大トリです。JTAGでのデバッグはシミュレーターでのそれとわずかに操作が変わるだけです。

まず、シミュレーターのときと同様にDebug パースペクティブに変更します。そしてプリンタポートにWiggler互換ICEを取り付け、ターゲットと接続します。ターゲットの電源を入れます。

次にOCDemonを立ち上げます。メニューバーRunExternal ToolsExternal Tools...を実行して図6のExternal Toolsダイアログを開きます。そしてOCDemonを選んで、Runボタンをクリックしてください。DebugビューにOCDemonが現れます。ここでエラーが表示される場合は、Wigglerの接続を確認してください。pin8と15をショートしていない場合もエラーが表示されます。

OCDemonが立ち上がったら、今度はgdbを呼び出します。メニューバーRunDebugを実行してください。Debugダイアログが開くので、JTAGデバッグ用に作ったデバッグconfigurationをクリックし、Debugボタンを押します。私の場合はspitest by OCDがconfiguration名です。すべてが正常ならば、Debug Viewは以下のようになります。

図11 JTAG接続完了

OCDemonの初期コマンドとして必要な操作を全部記述しているため、シミュレーターの時とは異なり、今回はいきなり実行してmain()の先頭でブレークがかかります。

あとは、IDEとして粛々とデバッグを続けていくのみです。

サンプル

とりあえずデバッグ環境を構築するために使うサンプルプロジェクトをアップロードします。これはDesign Wave Magazineの2006年3月号に掲載されたものを少し修正してEclipse環境でデバッグできるようにしたものです。

ダウンロード(6KB) : empty.zip

Blackfin空挺団 | プログラム | EZ-KIT | コア&ペリフェラル | TOPPERS/JSP | こぼれ話 | DSP掲示板