メインページへ

H8/3048Fモード7用モニタデバッガ生成メモ

いまさらとは思ったのですが、H8/3048Fモード7用モニタデバッガを作ったのでメモとして残しておこうと思います。
きっかけはAKI-H8/3048Fマイコンボードが2枚残っていたことでした。AKI-H8/3052Fボードに比べてRAMが貧弱で値段も高いため、 再購入することもないとは思うのですが、残りの2枚を有効活用するためにモニタデバッガを作りました。

記 2010/9/18

必要なファイルの入手については以下のページを参照ください。
H8/3052Fモード7用モニタデバッガ生成メモ

注意:ここで示す方法では、試用期間が終わっているコンパイラではビルドできません。
また、モニタデバッガの書き込み、よおび動作確認用のサンプルの実行は、AKI-H8マイコン専用マザーボード(秋月電子様販売) を使用することを前提に考えています。書き込み時のブートモードにする設定などはAKI-H8マイコンおよびマザーボードの説明書 もあわせて参照してください。



H8/3048Fモード7用モニタデバッガ生成

以下の手順で修正を行いファームウェアを生成します。
  1. C言語によるユーザイニシャライズモジュール(monitor.c)の修正
  2. リンケージサブコマンドファイル(monitor.sub)の修正
  3. printf関数、scanf関数のサポート 対応

1.C言語によるユーザイニシャライズモジュール(monitor.c)の修正

monitor.cで記述されているヘッダーファイルを"3003.h"から"3048s"に変更します。
プロジェクトウインドウのDependenciesフォルダに表示されるファイル名は自動的に変更されます。 モード7のmonitor.c

2.リンケージサブコマンドファイル(monitor.sub)の修正

以下の条件で動作するための修正を下図の赤枠で示します。
使用CPU:H8/3048F 動作モードモード7 動作周波数:16MHz モニタ使用SCIチャネル:1 38400bps
また、printf関数、scanf関数を使用するための修正を緑枠で示します。 モード7のmonitor.c

ここまでの修正後、ビルドを行ってロードモジュールを生成します。出来上がった MONITOR.MOT をH8に書き込むと モニタデバッガを使用することができます。
インストールしたターミナルソフト(Hterm)を起動後、H8基板をモード7で起動すると以下のようにメッセージが表示されて モニタデバッガを使用することができるようになります。 モード7のhterm

3.printf関数、scanf関数のサポート 対応

組み込み型モニタがサポートするprintf関数とscanf関数をユーザプログラムから使用する場合、使用する ソースコードに以下のマクロを記述する必要があります。

#define printf ((int (*)(const char *,...))0x????????)
#define scanf ((int (*)(const char *,...))0x????????)

????????の部分には組み込み型モニタと共にリンケージされたprintf関数とscanf関数のアドレスを記述します。
このアドレスは手順2までの修正後、ビルドを行ったときに作成される"MONITOR.MAP"ファイルの中に記述されています。
	FILE=_printf
	                                  00002b3c  00002b8d        52
	  __printf_lite
	                                  00002b3c        52   func ,g         * 
	FILE=_scanf
	                                  00002b8e  00002bdf        52
	  __scanf_lite
	                                  00002b8e        52   func ,g         * 
	

上記のようになっていたので、マクロは以下のようになります。
#define printf ((int (*)(const char *,...))0x00002b3c)
#define scanf ((int (*)(const char *,...))0x00002b8e)

筆者は、このコードをヘッダファイルにして必要に応じてインクルードして使うようにしています。

*.動作確認用のサンプルプログラム

モニタデバッガは仮想ベクタ方式を採用しているため、モニタデバッガ上で動作させるプログラムも仮想ベクタに対応している 必要があります。HEWが自動生成するワークスペースでは仮想ベクタに対応していないため、何らかの対応が必要になります。
筆者の場合以下のように対応しています。
  1. "intprg.c","resetprg.c"ファイルのコードからvectパラメタを削除し、ベクタ番号がこのファイル内で 定義されないようにします。実際にはあらかじめ用意した差し替え用のファイルと置き換えるようにしています。
  2. ベクタテーブルをアセンブラで記述した"vect.inc","vecttbl.src"ファイルをHEWが生成したワークスペースフォルダに 追加した後、プロジェクトにもAddFile で追加します。
  3. メニューの ビルド(B) から H8S,H8/300S tandard Toolchain を選択し、H8S,H8/300S tandard Toolchainダイアログを 表示します。ダイアログの”最適化リンカ”タブの カテゴリ(Y) で”セクション”を選択して、セクションのアドレスを 以下のように変更します。
    モード7のmonitor.c
上記手順の後ビルドを実行して生成された実行ファイルは仮想ベクタに対応したものとなりますので、モニタデバッガの ロードコマンドでロードし、実行させることができます。
仮想ベクタ用ファイル


仮想ベクタに対応したサンプルプロジェクトをここで公開します。
このサンプルプロジェクトは、秋月電子のAKI-H8/3052Fマイコンボードをマザーボードに搭載したものを対象としています。
このサンプルプログラムは以下のように動作します。
  • ITUのタイマ0、GRAのコンペアマッチを使用して、起動直後から1秒ごとにLED2を点灯、消灯します。
  • SW1を押している間、LED1が点灯する。
  • SW3を押すごとにモニタデバッガの画面に"abcdef"がprintfによって表示される。
  • SW4を押すごとにモニタデバッガの画面に"123456"がprintfによって表示される。