|


倉田 昌典(くらた まさのり)
ケイブレイン
曽根 卓朗(そね たくろう)
ヤマハ株式会社
はじめに
ヤマハでは、電子楽器をはじめとするさまざまな組込みシステム製品を、製造販売しています。そのような組込みシステム製品のソフトウェア開発のため、ヤマハ社内では市販のものも含め、さまざまな開発環境を利用しています。ここでは、ヤマハ社内で独自に開発・整備してきたUNIX&GNUベースのμITRON応用システム開発環境である、mOS開発環境についてご紹介したいと思います。
mOSとはヤマハ社内で開発している組込み機器用OSで、mOSのmは、musicからとったものです。といっても、mOSに、音楽用の特殊な機能を持たせているわけではありません。mOS開発環境は、このmOSを利用したソフトウェアを開発するための開発環境のことです。
GNUツールとは
GNUツールとは、フリーソフトウェア財団(FSF;Free
Software Foundation)が提供しているソフトウェア群です。エディタやコンパイラ、デバッガなどから、ゲームに至るまで、ありとあらゆるソフトウェアが提供されています。GNUツールには、
・専用ライセンス(GPL)の下、利用については実質的に無償であること
・ソースコードが完全に公開されていること
・機能拡張や品質向上が常に行われていること
・ほとんどのUNIX環境に対応していること
といった特徴があり、それはすなわち、業務用として用いるに足る品質を持つソフトウェアが、無償で利用できるといってもよいでしょう。GNUに関する情報入手やソフトウェアの取得は、インターネット経由で可能です注1)。
mOS開発環境に利用しているGNUツールには、以下があります。
・gcc:Cコンパイラ
・binutils:アセンブラ、リンカ、ライブラリアンなど
・gdb:ソースコードデバッガ
・make:ビルド管理・実行
組込みシステムには、さまざまなCPUが利用されますが、gcc、binutils、gdbは、ほとんどのCPUに対応しています。したがって、GNUツールを使えば、製品のCPU種別ごとに異なる開発ツールを、使わなくてもよいのです。
クロス開発ホスト
mOS開発環境のホストはUNIXです。それは、GNUツールが、主にUNIX上で動作することを前提として開発されているからだけではありません。UNIXをホストとすることで、
・UNIX上のネイティブアプリケーション開発と同等な開発環境となる
・UNIXが持つ開発環境としての利点をそのまま享受できる
といった利点を得ることができます。mOS開発環境では、GNUツールをクロス開発ツールとして利用することになりますが、これらのGNUツールは、UNIX環境のネイティブアプリケーション開発にそのまま利用されているものでもあります。また、UNIX上には、
・各種スクリプト言語
・cvs等のプロジェクト管理ツール
・ネットワーク
など強力なツールが、たくさん存在します。これらのツールを利用することで、いわゆる統合開発環境的なものを、利用者の都合に合わせて構築することが可能です。
UNIXをクロス開発のホストにすることは、UNIX単体が持つ開発環境としてのさまざまな利点を、クロス開発においてもそのまま利用することができるのです。
mOS開発環境に利用するUNIXホスト環境としては、
・FreeBSD
・Linux
・MacOS X
を利用することができます。他のUNIX環境上でも、きっと動作することでしょう。
開発の流れとクロスデバッグ環境
mOS開発環境における開発は、
1. UNIXホスト上で、ターゲットシステム(組込みシステム)用のアプリケーションソースコードを作成する。作成したソースコードのコンパイル・リンクを行うことで、ターゲットプログラムをビルドする。
2. ビルドしたターゲットプログラムを、UNIXホストからターゲットシステムへ転送する。
3. UNIXホスト上のクロスデバッガから、ターゲットシステム上のターゲットプログラムを、ソースコードデバッグする。
といった流れとなります。
1の段階は、GNUツールを単に利用するだけで実現することができます。UNIXホスト上に、GNUツールをクロスコンパイラとして導入するだけです。この段階までは、UNIXホスト上だけで、すべての作業を行うことができます。図1に示したような流れで、ターゲットプログラムを作成します。ターゲットプログラムはオブジェクト形式変換(図2)を行うことで、バイナリイメージを取得したりできます。また、図3のように、ユーザー独自のライブラリを利用することも可能です。実際のビルド作業を行なっているようすを図4に示します。
1の段階で作成したターゲットプログラムを、ROMに書き込んでからターゲットシステム上で動作させ、プログラムが正しく動作するか確認するなどといった手法をとるなら、1の段階だけで、ターゲット用のアプリケーションを開発することも可能です。しかし、いちいちROMに書き込んだりすることはめんどうですし、この方法だとソースコードデバッグすることは不可能で、いわゆるprintfデバッグするのがせいぜいです。テスト実行やデバッグを円滑に行うには、2や3の段階が必要となってきます。
2、3の段階を示すイメージが図5です。一般に、クロスデバッグ環境を実現するには、ターゲットシステム側にインサーキットエミュレータ(ICE)などの機器を接続し、ホストシステムとターゲットシステムとが、その機器を経由して通信します。しかし、mOS開発環境においては、完全にソフトウェアだけでクロスデバッグ環境を実現していることが、特徴となっています。ソフトウェアだけでクロスデバッグ環境を実現すると、ICEなどの機器が不要になりますから、開発環境全体をシンプルかつコンパクトにできます。mOS開発環境において、UNIXホストとターゲットシステムとは、シリアルケーブル1本だけで接続しますから、T-Engineのようなコンパクトなターゲットシステムであれば、新幹線の中でクロス開発を行うといったことも可能となります。また、構成がシンプルですから、ICE機器が接触不良や電磁的な影響を受けてうまく動作しないといったこともありませんし、そもそも低コストです。最近のCPUには、デバッグ支援のためのバス監視機能がCPU内のハードウェアとして内蔵されていますから、ソフトウェアだけでも、ICEに匹敵するデバッグ機能を、ある程度実現することが可能です。
さて、mOS開発環境におけるクロスデバッグ環境は、ソフトウェアだけで実現するものでした。したがって、前述の2、3段階においては、ターゲットシステム上に、mOS開発環境のための特殊なプログラムが必要となります。例えば、2の段階においては、UNIXホストから転送されてくるターゲットプログラムのバイナリコードを通信で受信し、ターゲットシステム上の適切なRAM領域に書き込むといった処理が必要になりますし、3の段階においては、UNIXホスト上で動作するクロスデバッガからの指令を通信で受信し、ターゲット上のアプリケーションプログラムの実行制御(実行ブレーク、実行再開、メモリ内容の取得・変更)を行う処理が必要です。
ソフトウェアによってクロスデバッグ環境を実現するには、このような特殊なプログラムをターゲットシステム上に用意することが必須であり、クロス開発環境を整備するために必要となる努力のほとんどが、この特殊なプログラムの開発にあるといっても過言ではありません。また、この特殊なプログラムにどれだけの機能を持たせることができるかが、クロスデバッグ環境の使いやすさの鍵となります。
 |
 |
 |
図1 コンパイルとリンク
|
|
図2 オブジェクト変換
|
 |
|
|
 |
|
 |
図3 ライブラリ化
|
|
図4 ビルドのようす
|
 |
|
|
 |
|
|
図5 クロスデバッグ環境
|
|
|
クロスデバッグの実際
T-Engine用サンプルアプリケーションを、mOS開発環境にて、実際にデバッグしているようすを図6に示します。右側ウインドウにて、GDBデバッガを起動すると、
・ターゲットとホスト間の通信を確立する
・ターゲットシステムへターゲットプログラムを転送する
・ターゲットプログラムを起動
・ターゲットプログラムが、main関数にてブレーク
といった一連の動作が、自動的に行われます。GDBデバッガ起動時に、GDB起動スクリプトが自動的に実行されるというGDB機能を用いることで、この一連の動作を実現することができます。
これから、次の3つのデバッグ手段を使い分けながら、デバッグを行っていきます。
・GDBデバッガによるデバッグ
・printfによるデバッグ
・モニタによるデバッグ
図7に示すサンプルプログラムをデバッグ対象とします。それでは、それぞれの手段について、実際に見ていきましょう。
 |
図6 クロスデバッグ作業画面
|
 |
 |
図7 サンプルプログラム
|
GDBデバッガによるデバッグ
GDBデバッガを用いてデバッグ作業を行っているようすを図8に示します。GDBはソースコードデバッガですから、次のような作業を行うことができます。
●プログラムの実行制御
ターゲットプログラム実行中に、GDBから強制的にターゲットプログラムを停止させることができます。さらに、ソースコードをGDB上に表示させながら、任意の位置にブレークポイントを設定できます。もちろん、ソースコードの行単位で、ステップ実行させることもできます。
このような実行制御を行っている際、GDBにおけるソースコード表示部にて、停止位置がわかるようになっています(図6の右上部に見える“=>”印が停止位置)。
●タスクの追跡
ターゲットプログラムを停止したとき、μITRON上の各タスクがどこで停止しているか、それぞれのタスクについて知ることができます。任意のタスクについて、そのタスクの停止位置が、どのような関数呼出しを経てきているのかというスタックトレースをとることができます。
●変数、構造体内容の表示・変更
ターゲットプログラムを停止させているときに、その時点におけるグローバル変数や、任意のタスクのローカル変数内容を表示させることができます。変数の内容をGDBから変更することもできます。
mOS開発環境はソフトウェアだけで構築しているにもかかわらず、μITRON 仕様に定義されるタスク部以外に、タスク独立部、ディスパッチ禁止部、CPUロック部といったコンテキストもシームレスにデバッグ対象とすることが可能となっています。
printfによるデバッグ
mOS開発環境にて作成するアプリケーションの各タスクは、それぞれ、C言語の標準入出力(stdin、stdout、stderr)を持ちます。したがって、アプリケーションプログラム上でprintf()関数等を用いることで、任意の文字列情報を出力することができます。出力した文字列は、UNIXホスト上の標準入出力コンソール(図6の左上部ウインドウ)に表示されます。
標準入出力ですから入力を行うことも可能です。UNIXホスト上の標準入出力コンソールから入力したキーボード入力を、アプリケーションプログラム上のgetchar()関数等で取得することができます。
モニタによるデバッグ
mOS開発環境が提供するクロスデバッグ環境の中でも、これから説明するモニタは、ユニークなものです。UNIXホスト上のモニタコンソールにて、キーボードからモニタコマンドを入力することで、モニタを利用します。
モニタにはさまざまなコマンドが存在します。図9に、コマンド利用例を示します。
●μITRONマルチタスクデバッグ支援コマンド
一般的に言われているマルチタスクデバッグ機能を実現するコマンド群です。
・μITRONオブジェクト状態調査
タスク、セマフォ、フラグ、メールボックスなどといった、各種μITRONオブジェクトに関するそのときの状態をダンプします。
・スタック調査
各タスクが、スタックをどのぐらい利用しているのか、調査して報告します。
・タスク別CPU利用率調査
各タスクがCPUをどのぐらい占有しているのか、サンプリング法で調査し、報告します。調査期間については、過去1秒、2秒、4秒、8秒といったぐあいに、過去2n秒間を選択することができます。
・イベントトレース
タスクスイッチ、システムコールの呼出・復帰、割込みの発生・終了といった、μITRONコンテキストスイッチに関する個々のイベントについて取得した情報をダンプします。ターゲットプログラム実行中においては、リアルタイムのイベントトレースをダンプします(図6の左下部ウインドウ)。
・μITRONシステムコール発行
モニタコンソールから、μITRONシステムコールを発行することで、ターゲットプログラム上に存在する各種μITRONオブジェクトを操作できます。
●フラッシュROM操作コマンド
ターゲットシステム上に存在するフラッシュROM内容を書き換えたり、消去したりします。
●メモリ操作コマンド
ターゲットシステムのメモリ内容をダンプしたり、変更したりします。番地を指定して、プログラム実行開始を行えます。
●ユーザー追加モニタコマンド
ターゲットプログラム作成時に、プログラム作製者が、任意のモニタコマンドを作成し、ターゲットプログラムにリンクさせることができます。リンクさせたモニタコマンドは、これまでに述べたモニタコマンドに追加され、モニタコンソールから利用できるようになります。ターゲットプログラムに特有の内部情報を表示したり、状態を変更したりするコマンドを用意すると、ターゲットプログラム開発にたいへん便利です。
モニタコマンド作成のためのプログラミングでは、わずらわしいユーザーインタフェースのコードを記述する必要がほとんどないので、気楽にコマンドを作成できます。
これまでに説明したモニタコマンドは、いつでも利用することができます。すなわち、GDBデバッガ操作によるターゲットプログラムの稼働・停止といった影響を受けることがありません。モニタコマンドの動作中に、ターゲットプログラムがブレークしたりしても問題は起きません。
ftpサーバ
 |
図10 ターゲットシステムの構造
|
ターゲットシステム上でftpサーバを動作させることができます。このftpサーバを利用すると、UNIXホストからネットワーク経由で、ターゲットプログラムなどのバイナリイメージをターゲットへダウンロードしたり、ターゲット上のメモリ内容を、UNIXホストへ転送することができます。ネットワーク経由ですから、シリアル通信路を経由するよりも、高速なデータ転送が可能です。
mOS開発環境のしくみ
mOS開発環境がターゲットシステムで動作しているようすを図10に示します。mOS開発環境はソフトウェアだけで実現していますが、そのソフトウェア構造を図示したものです。
マルチスレッド機構という土台の上に、3つのスレッドが存在しています。それらスレッドの中の1つがμITRONスレッドで、μITRONカーネルを含むデバッグ対象のターゲットプログラム全体が、μITRONスレッドとして動作します。マルチスレッド機構上の1スレッドの中で、μITRONマルチタスク機構が動作するというハイブリッドOS構成となっているので、デバッグ対象のターゲットプログラム状態の影響を受けることなく、ターゲット側GDBエージェントやモニタエージェントが、いつでもサービス可能となっているのです。
終わりに
ヤマハ社内で利用しているmOS開発環境について、簡単に紹介させていただきました。この開発環境をT-Kernelに対応させ、T-Engine用アプリケーション開発に使うことができるようにすべく、現在、検討・調整等の作業を行っているところです。
注1)http://www.gnu.org/home.ja.htmlを参照
back
|