ここでは、ユーザープログラムをHEW(ver 4.02)を使って作成する手順を説明します。
HEWでウィザードを使ってアプリケーションを作成すると、FDTで直接Flash-ROMにユーザープログラムを焼き込むためのソースコードが自動生成されます。しかしこれらは、ユーザープログラムをデバッグせずに直接Flash-ROMから実行するような構成になっており、デバッグには適していません。
ADBGSH7125は、デバッガの中にベクタテーブルやデバッガ本体、割り込みハンドラの呼び出し部分などが用意されているため、ADBGSH7125にあわせたランタイムが必要になります。
ADBGSH7125の環境にあわせたランタイムは、
・ROMV7125.SRC
・ROMV7125.H
という2つのファイルです。これらを使ってユーザープログラムを作成する手順を説明します。公開しているサンプルアプリケーションのhewtest01にも同梱されています。
まず、HEWを起動します。
[ファイル]->[新規ワークスペース]でウィザードを起動します。
プロジェクトタイプは Empty Applicationとし、適当なワークスペース名をつけて、CPU種別をSuperH RISC engine とします。
CPUの選択をSH-2とする以外はすべてデフォルトで問題ありません。
これで雛型のフォルダやファイルが作成されました。この例では、以下のようになります。ソースコード類はすべてこのフォルダに置かれます。ビルドの結果はこのフォルダにある『Debug』『Release』のフォルダにそれぞれデバッグビルド、リリースビルドの結果が出力されます。
このフォルダに、ADBGSH7125デバッガ環境用のランタイム(スタートアップルーチンなど)である、ROMV7125.SRC、ROMV7125.Hをコピーします。必要に応じて、SH7125のIO定義ファイルである、IODEFINE.H などもコピーしておきます。
次に、コピーしたファイルをプロジェクトに追加します。[プロジェクト]->[ファイルの追加]で、コピーしたファイルを全て追加します。ファイルの種類は拡張子に応じて自動的に割り振られます。下の図は、先ほどの3つのファイルを追加したところです。
次に、ユーザーのプログラムを追加します。[ファイル]->[新規作成]で、ユーザープログラムを作成し、[ファイル]->[名前を付けて保存]でソースコードとして保存します。この例では、test09.c というファイル名でCのプログラムを保存します。
保存はされましたが、test09.c はこのプロジェクトに登録されていません。[プロジェクト]->[ファイルの追加]でプロジェクトに追加しておきます。
次に、リンカに各セクションの物理アドレスなどを設定します。
ROMV7125.SRCには、以下のようなセクションがコーディングされています。
セクション名 配置アドレス 内容 V 0xFFFFA000 仮想ベクタテーブル。デバッガが実ベクタテーブルをフックし、この仮想ベクタテーブルに割り込みハンドラが登録されていいればそれを呼び出し、なにも登録されていなければデバッガに制御を移す。 R 0xFFFFA400 初期化付き変数領域のRAM上へのマップ。ROM上には『D』というセクションで配置される。 INI 0x00002000 ユーザープログラムの初期化コード。①初期値付き変数領域の初期化、②初期値無し変数領域のゼロクリア、③main()関数の呼び出しを行う。最初に実行されるのは、ラベル『START:』がついた行で、0x2000に配置する。
その他に、通常のCで書かれたプログラムは、以下のセクションを生成します。
セクション名 配置アドレス 内容 P INIの後ろ 通常のプログラム。Cの関数はすべてこのセクションに配置される。 C Pの後ろ 定数領域。const 型修飾子が付いた定数はここに配置される。プログラムからの参照も直接このセクションのアドレスが参照される。 D Cの後ろ 初期値つき変数領域。 int a=32; のような初期値が付いた変数の初期値がこのセクションに格納される。プログラムから参照されるのはこのアドレスではなく、Rセクションになる。DセクションからRセクションへの初期値のコピーはスタートアップルーチンの中で行う。 B Rの後ろ 初期値無し変数領域。スタートアップルーチンでゼロクリアされる。
これらのセクションを、リンカに指示する必要があります。その手順を以下に示します。
まず、[ビルド]->[SuperH RISC engine Standard Toolchain...]を選択します。
コンパイラ、アセンブラ、リンカなどのツールのオプション設定画面になります。左のペインで、プロジェクト『test09』を選び、『最適化リンカ』タブを選択します。
マップファイル(*.MAP)に、グローバルシンボル(関数名や変数名)のアドレスが出力されるように、『カテゴリ:リスト』を選んで、『リンケージリスト出力』にチェックをし、『シンボル情報』にもチェックを入れておきます。
次に、『カテゴリ:セクション』を選んで、セクションの定義とアドレスを、『追加』ボタンを押して順次追加します。
まずは、INI、P、C、Dセクションを0x2000から配置します。
次に、V(仮想割り込みベクタ)を0xffffa000 から配置します。
最後に、R、Bセクションを 0xffffa400 番地から配置します。これでセクションのアドレス設定は完了です。
『最適化リンカ』タブの『カテゴリ:出力』を選び、オプション項目の『ROMからRAMへマップするセクション』を選びます。
『追加』を押し、DとRを結び付けます。
![]()
下のようなダイアログボックスが出ますので、DをROMに、RをRAMに設定して、OKを押します。
最後に、ライブラリを生成するように設定します。『標準ライブラリ』タブを選び、『モード:標準ライブラリファイル作成』を選びます。これを設定しないとほとんどの場合ビルドの最後にリンクエラーがでます。
設定が完了したら、ビルドします。[ビルド]->[ビルド]またはF7キーでビルドします。
正常に終了すると、プロジェクトのフォルダにある『Debug』『Release』に、プロジェクト名.LIB、プロジェクト名.ABS、プロジェクト名.MAP、プロジェクト名.MOT ファイルが生成されます。ADEBUGSH.EXEデバッガで使用するのは、この中のMAPファイルとMOTファイルです。