メインページへ

H8/3052F外部RAM対応モード6用モニタデバッガ生成メモ

H8/3052F用のモニタデバッガをモード7で動作させるデバッグ環境では、デバッグ対象のプログラムサイズ が内蔵RAMの大きさで制限を受けます。H8/3052Fの内蔵RAMは8Kバイトなのでデバッグ対象のプログラムはこれ以内でなければな りません。
H8/3052Fでは外部にRAMを拡張することができ、モニタデバッガも外部RAMを使用するように構成することができます。
外部にRAMを拡張すると拡張したRAMの容量までの大きさのプログラムをモニタデバッガで動作させることができるようになります。
今回はAKI-H8/3052FマイコンボードにSRAMを拡張し、これに合ったモニタデバッガ・ファームウェアを生成します。

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

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

記 2009/6/17

AKI-H8/3052FマイコンボードにSRAMを拡張

H8/3052Fの動作モードはモード6(内蔵ROM有効16Mバイトモード)とし、内蔵ROM、内蔵RAM、拡張RAMを以下のように 使用することとします。

  • 内蔵ROM:モニタデバッガ・ファームウェアを書き込む
  • 内蔵RAM:モニタデバッガが使用するRAMエリアとユーザースタック
  • 拡張RAM:デバッグ対象ファームウェアを読み込む
拡張に使用したSRAMは、Renesas製のR1RP0416DSB-2PRで、アクセスタイム12nsと高速で、256kword x 16bit の容量を持っています。このSRAMをエリア1のアドレス空間に接続します。
接続図およびユニバーサル基板に実装した様子を以下に示します。
拡張SRAM接続図 拡張SRAM接続写真



H8/3052F外部RAM対応モード6用モニタデバッガ生成

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

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

monitor.cで記述されているヘッダーファイルを"3003.h"から"3052s"に変更します。
プロジェクトウインドウのDependenciesフォルダに表示されるファイル名は自動的に変更されます。
また、拡張したSRAMに対するアクセスのためにバスコントローラとアドレスバス、CS1の入出力設定もここで 行います。 モード6のmonitor.c

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

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

ここまでの修正後、ビルドを行ってロードモジュールを生成します。出来上がった MONITOR.MOT をH8に書き込むと モニタデバッガを使用することができます。
インストールしたターミナルソフト(Hterm)を起動後、H8基板をモード6で起動すると以下のようにメッセージが表示されて モニタデバッガを使用することができるようになります。 モード6の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
		                                  00002b4e  00002b9f        52
		  __printf_lite
		                                  00002b4e        52   func ,g         * 
		FILE=_scanf
		                                  00002ba0  00002bf1        52
		  __scanf_lite
		                                  00002ba0        52   func ,g         * 
		

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

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

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

モニタデバッガは仮想ベクタ方式を採用しているため、モニタデバッガ上で動作させるプログラムも仮想ベクタに対応している 必要があります。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マイコンボードをマザーボードに搭載したものを対象としています。
このサンプルプログラムは以下のように動作します。
  • モニタデバッガの画面から'a' Enter と操作すると "abcdef" が表示される。
  • モニタデバッガの画面から'1' Enter と操作すると "123456" が表示される。
  • モニタデバッガの画面から't' Enter と操作すると以下の文字列が1秒間隔で表示される。
    • Timer0 1sec
    • Timer0 2sec
    • Timer0 3sec
    • Timer0 4sec
    • Timer0 5sec
文字の取得にはscanfが、文字列の表示にはprintfが使われています。また、"Timer0 Xsec"の表示にはタイマ0割り込み が使用されています。詳細はソースコードを参照ください。