EclipseはIBMが開発してオープン・ソース化した大規模な統合開発環境です。このソフトは本来JAVA用に開発されましたが、強力な柔軟性を持っているため、プラグインを付け足すだけで多くのソフトウェアに対応できます。たとえば、C/C++言語、PHPなどといった言語用のプラグインがあります。また、CVSやリファクタリングの機能を最初から備えているため、オープンソース・コミュニティでは広く用いられています。
Eclipseを組み込みソフトの開発に使うことが出来れば、いろいろな作業が非常に楽になります。バージョン管理は当然CVSを使えますし、エディタはカラーリングされ、ファイルを保存すればビルドが始まり、エラーが起きた行にアンダーラインが引かれると、至れり居つくせりです。しかし、本来JAVA言語用の環境と言うことで組込みからは距離が遠く、使うにはそれなりに敷居が高いソフトでもあります。
と、いう書き出しで一年ほど前に「組込みプログラミングにEclipseを使う」を書きました。当時はJAVA RuntimeのインストールからはじめてEclipse環境を構築しました。最近になってEclipseベースのIDE、PizzaFactory Express版がBlackfinに対応したこともあり、ためしに使ったところ、とても簡単に環境を構築できました。PizzaFactoryは有償ソフトですが、ベースになったオープンソース部がExpress版として無償で提供されています。
以下、PizzaFactoryでDesign Wave Magazine 2006年4月号のADuC7026基板(FRK-ADuC)をターゲットにした開発を行う場合のPizzaFactory 3.1 Express構築について説明します。動作はWindows2000およびWindowsXPで確認しています。「組込みプログラミングにEclipseを使う」ではICEにWiggler互換のプリンタ・ポートICEを使いましたが、今回はベストテクノロジーのUSB ICEである、TINY JTAG-ICEを使います。
2007年3月現在でも、Eclipse本は本屋に潤沢においてあります。好きな本を買ってきて二三冊読めば基本知識は得られると思います。
また、CQ出版社の「μITRON準拠TOPPERSの実践活用」には、PizzaFactoryの紹介が掲載されています。
以下のソフトウェアが必要になります。
PizzaFactoryは、もなみソフトウェアがEclipseを基に開発した統合開発環境です。PizzaFactoryはベースとなったEclipseの機能に加えてプラグインのダウンロード機能や、インストーラーの統合化を果たしています。その結果、Eclipse単体から自分で環境を組み上げる場合に比べ、Java RuntimeやCDTのダウンロードが不要になっています。当然、それらのバージョン間の互換性に関してもユーザーが気を使う必要はありません。PizzaFactory 3.1 Expressは、PizzaFactory 公式サイトの無償ソフトウェアダウンロード・ページよりWindows版を入手できます。
D2XXドライバはベストテクノロジーのTINY JTAG-ICEを使うためのものです。FTDI社のドライバページよりよりダウンロードできます。今回は、Windows 2000/XP/Vista向けのインストーラー・パッケージを使用します。
ARMWSDは、Analog DevicesのADuC7026用の内蔵フラッシュ・プログラマです。このプログラムは製品ツールページよりダウンロードできます。
前回の「組込みプログラミングにEclipseを使う」では、プリンタポートICEであるWiggler互換ICEを使いました。しかしながら、どうしても安定しないので、今回はUSB ICEを使いました。
ベストテクノロジーのTINY JTAG-ICEは触れ込みによればJTAGKEY互換となっています。おそらくはAmontecのJTAGKEYのことでしょう。GDBプロキシとして働くOpenOCDによってARM7TDMIコア採用製品のデバッグが可能です。
PizzaFactory 3.1 Expressには最初からOpenOCDが同梱されており、ターゲットのスクリプトが適合するものであれば非常に簡単にデバッガを設定する事ができます。
蛇足ですが、プリンタポートICEが安定しないのは、多分私の環境の問題です。PC本体にCygWinをインストールしたくないため、ICEの制御ソフトをVMWare上で動かしているのです。多分、それが諸悪の根源であって、プリンタポートICE自体には問題が無いのではないのだろうと思っています。
ARMWSDはAnalog DevicesのADuC7026用フラッシュ・プログラマです。インテルHEXフォーマットを受け取って、シリアルポート越しにターゲットへの書きこみを行います。
インストールの順番は、
の順番になります。1,2,3は相互に依存しないので、順番をひっくり返してもかまいません。
D2xxドライバはインストーラー・パッケージをダウンロードしてください。実行するとFTDI社の高速USBインターフェースFT2232と、それを使ったJTAG DLLをインストールします。インストール後にTINY JTAG-ICEをUSBポートに接続し、正しく認識されることを確認します。
ARMWSDは単なるZIPファイルです。展開するとARMWSD.EXEが現れますので、適当なディレクトリにコピーしてください。私はC:\Program Files\Analog Devices\ARMWSDにコピーしました。
PizzaFactory 3.1Express Installerは、実行ファイルです。実行するとシステムにPizzaFactory 3.1 Experssをインストールします。インストーラーはJavaランタイムやCDTも含めてインストールしてくれます。
PizzaFactory 3.1 Expressを最初に立ち上げると、Workspace Laucherと言う名前のダイアログが開き、Workspaceの場所を聞いてきます。Workspaceは複数の開発プロジェクトをおくことのできるディレクトリです。デフォルトではC:\Document and Settings\user名\workspace-pizza\です。
Workspaceを決めると空のIDEが立ち上がりますのでここからアップデートを開始します。アップデートは、PizzaFactoryのメニューから行います。メインメニュー⇒Help⇒Software Updates⇒Find and Install...を実行してください。
Install/Updateダイアログが現れますので、Search for new features for installを選択してNextボタンを押します。すると、アップデートサイトを訪ねる画面が現れますので、PizzaFactory3 elements update siteを選択してFinishボタンを押します。PizzaFactoryはアップデートサイトにアクセスし、用意されている機能の一覧を表示します。
図1 機能選択画面
ADuC7026の開発を行うときには、図1のように選択肢中のPizzaFactory3 elements update site⇒cq-aduc7026を選びます。これを選ぶと、コンパイラ、デバッガのほか、ライブラリやTOPPERS/JSPの機種依存部がダウンロードされます。この選択肢はDesign Wave誌の付録基板用ですが、ADuC7026はFlash ROM、発振器、タイマー、シリアルポートを内蔵してるため、どのような基板でもTOPPERS/JSPの基本構成を変えずに使う事ができます。つまりcq-aduc7026を選べばどのような基板に対しても開発ができます。
cq-aduc7026以外にも、図1ではPizzaFactory3 Terminal Supportにチェックを入れています。これはシリアルポートおよびTCP/IPを使ったダム端末をPizzaFactoryのパネル上で実行する大変便利な機能です。
必要な機能を選択したNextボタンを押して先に進みます。あとはウィザードの指示に従って進んでください。インストールが全部終わると、PizzaFactory 3.1 Expressは自身を再起動します。
OpenOCDはPizzaFactory 3.1 Expressに入っており、簡単に登録、設定する事ができます。
メニューバー⇒Run⇒External Tools⇒External Tools...を実行すると、図2のようなExternal Toolsダイアログが現れます。
図2 External Toolsダイアログ
左側のパネルのOpenOCDを選択し、NewボタンをクリックするとNew Configurationと言う名前の新しいOpenOCD構成が現れます。この新しい構成の名前をOpenOCD ADuC7026のような好きな名前に変更します。この名前は後で外部ツール・メニューにあらわれますのでわかりやすい名前にしておきます。次に、スクリプトとしてADuC7026用のものを選びます(図3)。
図3 OpenOCDの登録と設定
設定が終了したらApplyボタンを押して設定を適用します。
ARMWSDも外部ツールとして登録します。図2の右のパネルの中からProgramを選択し、NewボタンをクリックするとNew Configurationと言う名前の新しい外部ツール構成が現れます。これにもわかりやすい名前を与えます。そして、LocationフィールドにARMWSD.EXEのパスを設定して下さい。
図4 ARMWSDの登録
パスを設定し終わったら、ダイアログ下のRUNボタンを押してARMWSD.EXEを実行します。そしてARMWSD.EXEのConfigureボタンをクリックし、以下のように設定します。
Verifyは必ず行うようにしてください。過去、数回Verifyに失敗する事がありました。その場合はMass Eraseを行ってROMを完全消去するとうまく行きました。書きこみ時にMass Eraseも同時に行いたいのですが、バージョンによってMass Eraseを排他的にしか使えないものもあります。
PizzaFactory 3.1 ExpressにはTOPPERS/JSPが同梱されており、サポート対象ターゲットのためのサンプル生成はとても簡単です。
メインメニュー ⇒ File ⇒ New ⇒ Project...を実行すると、新規プロジェクトの種類を選ぶダイアログが開きます。そこでPizzaFactory TOPPERS/JSPを選んでください(図5)。
図5 新規プロジェクト
Nextボタンを押すと、今度は選んだプロジェクトの名前を聞いてきます。これはディレクトリと最終生成物の名前になります。好きな名前をつけてください(図6)。
図6 プロジェクトの名前
さらにNextボタンを押すと、今度は選んだプロジェクトの型を聞いてきます。ここではProjet TypeとしてPizzaFactory loadableを選びます。Configurationに選択できるターゲットの一覧が表示されますので、TOPPERS/JSP用のデバッグ・ターゲットとして用意されているDebug-JSP-frk_aducを選びます(図6)。
図7 プロジェクトの型
さらにNextボタンを押すと、他のプロジェクトの生成物に依存しているかどうかを聞いてきますが、今回のプロジェクトはどのプロジェクトにも依存しませんのでもう一度Nextボタンを押します。すると、プロジェクトのテンプレートを聞いてきます。ここではsample1を選びます。sample1はTOPPERS/JSPではこけら落しに使われるターミナル・アプリケーションです(図8)。
図8 サンプル1をテンプレートにする
Finishボタンを押すと、ADuc7026用のsample1アプリケーションが生成されてProject Viewに表示され、自動的にビルドが始まります。ビルドの様子はConsole Viewに表示されます。無事ビルドが完了したらメインメニュー ⇒ Project ⇒ Properties...を実行してPropertyダイアログを開きます。TOPPERS/JSPのサンプルはデフォルトではelf形式しか出力しません。そこで、ARMWSDが受け付けるインテルHex形式を生成するように調整しましょう。また、リンカーのマップ出力も生成するようにしておきます。
まずはマップファイルの指定です。Propertiesダイアログを開いたら、左のパネルからC/C++ Buildをクリックし、Tool Settingsタブ、GCC C Linker⇒Mscellaneousと設定する項目を選択します。そして、Other optsionsの追加アイコンをクリックして"-Map"と"mapfile.txt"をリンカーオプションとして追加します(図9)。これでリンカーにマップ出力を行うよう指示できました。
図9 マップ出力の指定
マップファイルの出力を指定したら、次はHexファイルへの変換を指定します。同じパネルの中のBuid Stepsタブをクリックし、以下のコマンドをPost-build Stepsとして指定します(図10)。
arm-elf-objcopy -O ihex -S ${BuildArtifactFileBaseName}.out ${BuildArtifactFileBaseName}.hex
このコマンドは与えられたELFファイルをインテルHexフォーマットに変換します。${BuildArtifactFileBaseName}はビルド時に使えるマクロ名で、拡張子を除いた生成ファイル名を与えます。この設定によって、ビルドが終了するたびに指定したコマンドが呼び出されて実行されます。
図10 HEXフォーマットへの変換を指示する
設定が終わったらOKボタンをクリックしてPropertiesを閉じます。そして、メインメニュー⇒Projects⇒Clean...を実行してプロジェクトの中間生成ファイルをすべて削除してください。自動的にフルビルドが実行されます。ビルドが終わったらインテルHexファイルとマップファイルが生成されていることをプロジェクト・ツリーから確認してください。
TOPPERS/JSPアプリケーションは、ADuC7026のRAMには入りきらないので、ROMに焼かなければなりません。PIzzaFactory 3.1 Experssの生成したSample1もROM化を前提としています。そこで、ARMWSDを使ってROMに焼きこみましょう。
ARMWSDはすでに上で設定を終えていますので、呼び出すだけです。メインメニュー⇒Run⇒External Tools⇒ARMWSD(先の設定でARMWSDにつけた名前が表示されている)を実行します。ARMWSDが立ち上がったら、hexファイルのファイル名を指定してStartボタンを押し、ターゲットのスイッチを操作してROMへのダウンロードを開始します。ダウンロードが完了したらARMWSDを終了します。
次にターミナル・エミュレータを開きます。PizzaFactory 3.1 Expressのメインメニュー⇒Window⇒View⇒Others...を実行し、Terminal Viewを選んでOKを押します。
Terminal Viewの設定を9600bps, 8bit, non-parityに設定してください。Terminal Viewの接続を開き、ターゲットをリセットするとアプリケーションからのメッセージを見る事ができます(図11)。
サンプル・アプリケーションが動いたら、次は独自のアプリケーションを作ってみましょう。TOPPERS/JSPの独自アプリケーションを作るには、コンフィグレータの独特な設定を覚えなければなりません。しっかし、サンプル・アプリケーションを基にすれば比較的簡単にプログラムを作ることができます。手を入れるファイルは三つで、sample1.cfg、sample1.h、sample1.cです。
sample1.cfgはコンフィグレーション・ファイルです。TOPPERS/JSPのコンフィグレータはこのファイルを元に、必要なタスクやセマフォといった資源を生成します。生成された資源は、ユーザー定義のプログラムとリンクされて使用されます。
TOPPERS/JSPはタスクやセマフォをアプリケーションの実行中に作り出す手段を持っていないため、コンフィグレーション・ファイルがこれらを作り出す唯一の手段になります。
#define _MACRO_ONLY#include "sample1.h" INCLUDE("\"sample1.h\""); CRE_TSK( MAIN_TASK, { TA_HLNG|TA_ACT, /* 高級言語記述、最初からアクティブ */ 0, /* extinfに渡す値 */ main_task, /* タスクとして使う関数 */ MAIN_PRIORITY, /* タスク実行順位 */ MAIN_STACK_SIZE, /* タスク・スタックの大きさ[Byte] */ NULL /* スタックのアドレス。NULLなら自動割付 */ }); #include "/your/path/systask/timer.cfg" #include "/your/path/systask/serial.cfg" #include "/your/path/systask/logtask.cfg"
コンフィグレーションファイルには二つのインクルード文が存在します。
#include は、コンフィグレータの実行中にファイルを読み込み、コンフィグレータに利用させるためのものです。INCLUDEはコンフィグレータの出力ファイル、つまりkernel_id.hとkernel_cfg.hの中に#include文を埋め込むためのものです。両者は実際にファイルが読み込まれる時期が異なりますので注意してください。
CRE_TSKは、タスクを静的に作るためのAPIです。詳しくはuITRON4の仕様書を参照してください。今回の例ではMAIN_TASKという識別子がコンフィグレータによって生成されます。この識別子は、アプリケーション・プルグラム中で「この」タスクを示すIDとしていつでも利用できます。
コンフィグレーション・ファイルの最後にある3つのインクルード文は、ティック・タイマーとロギング機能を実装するためのタスクやセマフォ、割り込みハンドラを宣言するためのものです。
ティック・タイマはOSの必須機能ですから、必ず宣言しなければなりません。
ロギング機能は便利ですので、特に理由がない限り使うほうがいいでしょう。
インクルード文のパスはシステムによって異なります。PizzaFactory3 Expressを使った場合にはプラグイン内部へのパスがここに現れます。したがって、以下のコンフィグレーション・ファイルをそのままPizzaFactoryで使おうとしてもうまく行きません。PizzaFactoryがsample1用に生成したパスをそのまま使ってください。
sample1.hは、ヘッダファイルです。このファイルは通常はアプリケーション自身で使うほか、コンフィグレーション・ファイルからも読み込まれます。今回のアプリケーションは規模が小さいため、コンフィグレータが使う資源のみを宣言しています。
#include <t_services.h> /* メインタスクのパラメタ */ #define MAIN_PRIORITY 5 /* 優先度 */ #define MAIN_STACK_SIZE 512 /* スタックサイズ */ #ifndef _MACRO_ONLY externvoid main_task(VP_INT exinf); #endif /* _MACRO_ONLY */
コンフィグレータは関数プロトタイプを理解できません。コンフィグレータは_MACRO_ONLYマクロを事前に宣言しますので、プロトタイプは_MACRO_ONLYマクロが宣言されていないときにのみ有効とすることで、問題を回避しています。
タスク優先度とスタックサイズはいずれもコンフィグレーションの中で使います。この二つはプログラム中で使うことはないと思われますので、コンフィグレーション・ファイルに直接値を書きこんでもかまいません。しかし、タスクの構成に関するパラメータは、関数宣言などとともにヘッダ・ファイルにまとめたほうが、全体の見通しはすっきりするでしょう。
最後にプログラムの説明をします。このファイルは簡単です。
#include <t_services.h> #include "kernel_id.h" #include "sample1.h" void main_task(VP_INT exinf) { syslog(LOG_NOTICE, "Hello, ADuC7026!" ); }
三つあるインクルード文はそれぞれ
を、読み込みます。一番基本的な構成です。
関数main_task()はその名の通りメイン・タスクとして実行されます。実行するとsyslog()関数を呼び出して終了します。
syslog()関数はTOPPERS/JSPの持つロギング関数で、どのような媒体に出力するかは処理系依存です。しかし標準的な実装ではシリアルポートへログデータを記録します。PizzaFactory3.1 Expressに同梱されているADuC7026用のTOPPERS/JSPも、シリアルポートに出力します。
9600bps,8bit,non-parityに設定した端末ソフトをつないでプログラムを実行すると、システム起動メッセージに続いて"Hello, ADuC7026!"と端末に表示されます
IDEが提供する滑らかな操作感は、エディタのそれとはまた違った使い心地のよさがあります。是非試してみてください。