秋月電子 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"
0 件のコメント:
コメントを投稿