2009年9月30日水曜日

モニタ上でHelloWorldを表示する SH2/7144

秋月電子 SH2/7144 マザーボードセット
RAM 8K FFFFE000-FFFFFFF
Renesas monitor
HEW
FDT FlashDevelopmentToolkit
WindowsXP
について書かれています(^-^

SH2:モニタプログラムのコンパイル 軽くはまる(^-^;;のつづき


前回のモニタのビルドでモニタが動作するようになりました。

さてここで例にもよってHelloWorldを表示してみましょう。

Hewでプロジェクトを新規作成します。

途中
スタックサイズ:200H (512byte)
ヒープサイズ:200H (512byte)

それぞれ200Hに縮小しておきます。
スタックサイズは関数呼び出しの深さ(ネスト)とその引数の多さで
決まります。
ヒープサイズは関数内で宣言される変数の量で決まります。
節約節約。

新規プロジェクトの作成(HTerm用)
(1)HEW起動
(2)ファイル>新規ワークスペース
(3)Application を選択
(4)ワークスペース名 MHelloWorld とする
CPU種別:SupreH RISC engine
ツールチェイン:Renesas SuperH Standard
(5)新規プロジェクト-1/9-CPU
ツールチェインバージョン 9.3.0.0
CPUシリーズ:SH-2
CPUタイプ:7144F
(6)新規プロジェクト-2/9-オプション
除算方式:CPU除算器使用
Endian選択:Big
(7)新規プロジェクト-3/9-生成ファイル
[v]ヒープメモリ使用 ヒープサイズ H'200
[v]I/Oレジスタ定義ファイル
 ハードウエアセットアップ関数生成 C/C++ source file
(8)新規プロジェクト-4/9-標準ライブラリ
 とくに変更せずそのまま
(9)新規プロジェクト-5/9-スタック領域
スタックポインタアドレス: H'FFFFFFF0
 スタックサイズ:H'200
(10)新規プロジェクト-6/9-ベクタ
 とくに変更しない
(11)新規プロジェクト-7/9-デバッガ
 [v]SH-2 Simulator
(12)新規プロジェクト-8/9-デバッガオプション
 とくに変更しない
(13)新規プロジェクト-9/9-生成ファイル名
 とくに変更しない
[完了]
MHelloWorld.c をダブルクリックし編集する

/***********************************************************************/
/* */
/* FILE :MHelloWorld.c */
/* DATE :Wed, Sep 30, 2009 */
/* DESCRIPTION :Main Program */
/* CPU TYPE :SH7144F */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.16). */
/* */
/***********************************************************************/

//以下のprintf,scanfのアドレスは
//モニタプログラムをビルドしたときのmonitor.mapを参照してください
//直接printf関数等にジャンプします
#define printf ((int (*)(const char *,...))0x0000574c) 
#define scanf ((int (*)(const char *,...))0x00005788) 

//#include "typedefine.h"
#ifdef __cplusplus
#endif

void main(void);
#ifdef __cplusplus
extern "C" {
void abort(void);
}
#endif

void main(void)
{
printf("HelloWorld\n");
}

#ifdef __cplusplus
void abort(void)
{

}
#endif

さてこのままではモニタに送っても実行できません。
リンク時のアドレスがROM領域になっているためです。
そこでプログラムを置くアドレスを指定する必要があります。
その設定を行うのがリンカのセクションです。

HEW>ビルド>SuperH RISC engine Standard Toolchain>
 最適化リンカ>セクション

0xFFFFE160 DVECTTBL,DINTTBL,PIntPRG     ベクタ・割り込みテーブル
0xFFFFE800 PResetPRG,P,C,C$BSEC,C$DSEC,D   プログラム 4K(^o^;;;
0xFFFFF800 B,R                変数領域
0xFFFFFDF0 S                 プログラムスタック

のようにします。
ここで出てくるセクション名はだいたい次のように定義されているようです。
このセクション情報を保存しておくことができます。
[エクスポート]で出力ができますので、後でモニタ用プログラムを作成
するときに読み込めば楽でしょう。
ここにもセクションファイルを記載しておきます。

<<--[monitor.hsi]ここから 秀丸などに貼り付けて保存してください。
[Hew Section Information]
Version=2.0
Section overlay=No
Entry=4
Address1=0xFFFFE160
Section1=DVECTTBL,DINTTBL,PIntPRG
Address2=0xFFFFE800
Section2=PResetPRG,P,C,C$BSEC,C$DSEC,D
Address3=0xFFFFF800
Section3=B,R
Address4=0xFFFFFDF0
Section4=S
<<---ここまで


セクションの配置例

DVECTTBL リセットベクタ
DINTTBL 例外処理ベクタテーブル
PResetPRG 初期設定プログラムのプログラム領域
PIntPRG NMI割込みなどの割込みプログラム領域
C$BSEC dbsct.cで定義した0クリア処理用のテーブル
C$DSEC dbsct.cで定義した転送処理用のテーブル
P ユーザプログラムおよび標準ライブラリのプログラム領域
C ユーザプログラムおよび標準ライブラリの定数領域
D ユーザプログラムおよび標準ライブラリの初期化データ領域(初期値)
RP PセクションのRAM転送先
RC CセクションのRAM転送先
PCACHE 非キャッシュ領域に配置するプログラム
RINTTBL 例外処理ベクタテーブルのRAM転送先
R ユーザプログラムおよび標準ライブラリの初期化データ領域(変数)
B ユーザプログラムおよび標準ライブラリの未初期化データ領域
S スタック領域

(http://documentation.renesas.com/jpn/products/mpumcu/apn/rjj06b0812_sh7619ap.pdf)

ビルド時に次のような警告がでることがあります。

L3100 (F) Section address overflow out of range : "S"

セクションで割り当てたアドレスが
他のセクションと重なっていたり、足りなくなっているときです。
適当にアドレスを移動しましょう。

L1100 (W) Cannot find "XXX" specified in option "start"

セクションで割り当てたXXXが使われていないときに出る警告です。
Cannot find "C" なら定数を保存するCセクションが使用されていません。
Cセクションを削除するか、プログラムを進めていくうちに使うとおもわれますので、
そのまま放置していても問題はありません。
詳しくはこちら。
リンク時に下記warningが出力されるのは何故ですか?
L1100(W) Cannot find"C" spcified in option "start"

SH2:モニタプログラムのコンパイル 軽くはまる(^-^;;

秋月電子 SH2 7144 マザーボードセット
Renesus monitorのビルド
HEW
FDT FlashDevelopmentToolkit
開発環境WindowsXP
MONITOR-AKI7144.MOT
について書かれています(^-^

Renesusのmonitorプログラムは
SRAMにプログラムをRS-232Cで送り実行でき、しかも、メモリダンプ、
レジスタの確認、ブレークポイントの設定、ステップ実行、
printf、scanfが使えるという

monitorプログラムがrenesusから無料で公開されいるので、
ビルド、SH2/7144へ書き込み、実行してみたが
SHビギナーな私にとってはまりどころが満載なのでメモ。

手順:
HEWでモニタプログラムをビルド
FDTでモニタプログラムをSH2へ書き込む
SH2でモニタを起動
htermかteratermでモニタと通信をする


(1)ダウンロード
次のところからダウンロード

ルネサスサンプルプログラム
モニタプログラム

http://japan.renesas.com/fmwk.jsp?cnt=seminar_sample_downsh.htm&fp=/support/seminar/child_folder/sample_program/&title=%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0

HEW3,HEW4(C/C++ Compiler Ver. 8.0以降)対応版 SH-2用 モニタプログラム

をダウンロード

Hterm も一緒にダウンロード

モニタプログラムを解凍する

以下
SH2/Monitor/readme.htm 組み込み型モニタのカスタマイズ方法
をよーーーーーく読みながら作業をする。(重要)



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

monitor.c
/************************************************************************/
/* SH7600 Monitor Program Ver. 2.0A */
/* Copyright (C) 2003 Renesas Technology Corp. */
/************************************************************************/
/*#include "7040s.h" /* */
#include "7144s.h" /* */
/************************************************************************/
/* User Initialize Module */
/* Input PR <-- Return Address */
/* Output Nothing */
/* Used Stack Area --> 0(0) Byte */
/************************************************************************/
#pragma noregsave(INITIALIZE) /* Non Register Save */
void INITIALIZE(void) /* */
{ /* */
PFC.PACRL2.BIT.PA4MD = 1; /* PA4 is TxD1 */
PFC.PACRL2.BIT.PA3MD = 1; /* PA3 is RxD1 */
/* */
} /* Goto Monitor Program */


(3)リンケージサブコマンドファイルの修正

monitor.sub
========
INPUT SUPERH,MONITOR,LOWER
LIST MONITOR.MAP
SHOW SYMBOL
OUTPUT MONITOR.MOT
FORM STYPE
CHANGE INFORMATION=1320
NOOPTIMIZE
LIBRARY SUPERH,7144
LIBRARY MONITOR
DEFINE $BRR=27
DEFINE $STACK=0
START VECTOR/0,ROM,P,C/400,RAM/FFFFE000,USER/FFFFE160,SCI/FFFF81B0


========
DEFINE $BRR=27

RS-232Cのボーレートを設定します。
計算式は

$BBR = <周辺クロック> / 32 / <ボーレート> - 1

周辺クロックはマザーボードのMODEスイッチ(MD2,MD3)で設定されたものになります。
[秋月 Base-Board マニュアル参照]
クロックモード番号が3なら周辺クロックはx2なので12.5MHzのクリスタルが乗った
ものならば25MHzになります。
ボーレートを19200にするには

$BBR = 25000000 / 32 / 19200 - 1 = 39.69 ≒ 0x27

となります。
特に115200bpsあたりまで高速になると、0x5では誤差が大きくなりすぎるようで、
文字化けてしまいますが、0x6ならば正常に表示されます。
が、四捨五入してうまくいくときと文字化けするときとがあるので、
前後の値を試してみたほうがいいかもしれません。

monitor.subに記述するときは16進数で記述するので、
間違えて10進数で記述すると文字化けします。


BBRビットレート一覧 (周辺クロック25MHz)
115200 0x6
57600 0xC (HTermの最高速度)
38400 0x13
19200 0x27
9600 0x50
4800 0xA1
2400 0x144 (設定できず)


SCI/FFFF81B0
秋月のシリアルポート0のアドレスを指定しています。
Pin48:PA3/RxD1
Pin49:PA4/TxD1


(4)組み込み型モニタの機能選択

コマンドプロンプト(CMD)を起動する

リンカー OPTLNK.EXE へパスを通す
以下monitor、OPTLINK.EXEのパスは各自の展開時のパスに依存します。
各自修正してください。

C:\>SET PATH=%PATH%;C:\HEW2\TOOLS\HITACHI\SH\7_0_0\BIN;
C:\>cd sh2\monitor\Release
C:\sh2\monitor\Release> MONITOR.BAT

SuperH RISC engine Monitor Configuration Batch
Copyright (C) 2003 Renesas Technology Corp.

Link with Breakpoint Command Module ? {y/n} : Y   (ブレークポイント)
Link with Dump Command Module ? {y/n} : Y   (メモリ内容のダンプ)
Link with DisAssemble Command Module ? {y/n} : Y   (逆アセンブル)
Link with Fill Command Module ? {y/n} : Y   (データの書き込み)
Link with Go Command Module ? {y/n} : Y   (ユーザプログラムの実行)
Link with SH status Command Module ? {y/n} : Y   (内蔵周辺機能の状態表示)
Link with Load Command Module ? {y/n} : Y   (ダウンロード)
Link with Memory Command Module ? {y/n} : Y   (メモリ内容の表示、変更)
Link with Register Command Module ? {y/n} : Y   (CPUレジスタの一覧表示)
Link with Step Command Module ? {y/n} : Y   (シングルステップの実行)
Link with . Command Module ? {y/n} : Y   (CPUレジスタの表示、変更)
Link with help Command Module ? {y/n} : Y   (コマンドヘルプ)
Link with return Command Module ? {y/n} : N   (繰り返し実行)
Link with . Command Module ? {y/n} : N   (コマンド履歴)
Link with interrupt Function ? {y/n} : Y   (内蔵周辺機能割込み管理)
Link with abort Function ? {y/n} : Y   (アボート管理)

Configuration Execute OK ? {y/n} : Y


readme.htmに記述されている
COMMAND /E:1024 /C MONITOR.BAT
を実行すると『環境のためのメモリが足りません』と表示が出て実行できません。
バッチファイルを読んでみると、
C:\sh2\monitor\Release\SUPERH.lib
を直接加工しているようですので、わざわざCOMMANDを実行しなくても
XPネイティブのCMDで動作させても問題ないようで、
monitor.batのダブルクリックでOKです。


HEWでビルド

作成されたMOTファイルを掲載しておきます。
MONITOR-AKI7144.MOT

FDTで書き込み


Teraterm(通信ソフト)で接続
 ファイル>新しい接続>シリアル

通信速度の設定
 設定>シリアルポート

ボーレート 19200
データ 8bit
パリティー none
ストップ 1bit
フロー制御 Xon/Xoff


うまくできれば、マザーボードをリセットした後に
-----
SH7144 Series SuperH RISC engine Monitor Ver. 2.0B
Copyright (C) 2003 Renesas Technology Corp.
:
-----
と表示されます

ヘルプが表示できるか確認してみましょう。

:?[Enter]
Monitor Vector 00000000 - 000002BF
Monitor ROM 00000400 - 00005749
Monitor RAM FFFFE000 - FFFFE15F
User Vector FFFFE160 - FFFFE41F

. : Changes contents of SH7600 registers.
B : Sets or displays or clear breakpoint(s).
D : Displays memory contents.
DA : Disassembles memory contents.
F : Fills specified memory range with data.
G : Executes real-time emulation.
L : Loads user program into memory from host system.
M : Changes memory contents.
R : Displays contents of SH7600 registers.
S : Executes single emulation(s) and displays instruction and registers.
SH : Displays contents of SH7144 peripheral registers.

こんな感じで表示されるはずです。
いろいろコマンドを試してみてください。

モニタ上でHelloWorldを表示する SH2/7144 へ続く