本文へスキップ

未来の科学技術を子供たちに託す。 ジュニロボ <JRO>

〒619-0237 京都府相楽郡精華町光台8丁目

TEL. 070-5263-2200

jun@kinet-tv.ne.jp

SHマイコンを使った組込みソフトの勉強RECRUIT

[ 補足 ] HEW の設定 と SH-3 マイコンのアーキテクチャ

 これまで勉強してきたマイコンは、PIC マイコン( PIC 18F2620 )でした。
これからは、全く機能の異なる(高機能)マイコン SH-3 を勉強します。
SH-3 の開発環境は、RENESAS(ルネサス)標準のHEWを使います。(但し機能限定の評価版)

ただ、皆さんが勉強してきた内容からは、HEWの設定は非常に手続きが多いのと難解な部分がありますが、これを理解する為には、SH-3 のアーキテクチャを知る必要があります。

したがって、ここでは HEW の設定内容と SH-3 のアーキテクチャとを比較しながら説明していきます。
説明の必要上、無駄な設定をすることがあります。( 最終的には元に戻します。)
( 不明点は、講師に質問して下さい。)


 HEWの アイコン です。





HEW(統合開発環境)の各種設定 

HEW によるビルドの仕組み

(1)C 言語によるプログラム開発は以下の手順にそって行われます。



< C 言語による開発手順の流れ >

1.C 言語による C ソースファイルの作成( *.c )
  必要に応じてインクルードファイルの作成( *.h )

2.C ソースファイルをビルドします。
  各開発ツールがターゲットにダウンロード出来るファイル( *.ctx )を作成
  ただし、記述ミスや開発ツールへの指示ミスがあった場合は訂正して再度、ビルドする。

< 参考 >

 拡張子とは?
  各プログラム開発ツールがファイルを識別する為の名称
    C コンパイラ    : .c
    アセンブラ     : .src
    リンケージエディタ : .obj .lib
    DW22CTX     : .abs


(2)C コンパイラとクロスアセンブラの役割



< C コンパイラの処理 >

1.プリプロセッサの処理
  ヘッダファイル( *.h )の展開

2.C ソースファイルのコンパイル
  アセンブリ( *.src )ファイルの生成

< クロスアセンブラの処理 >

1.アセンブリ( *.src )ファイルのコンパイル
  リロケータブルオブジェクト( *.obj )ファイルの生成

< 参考 >

 リロケータブルオブジェクト( *.obj )ファイルとは?
  1.オブジェクト( *.obj )ファイルは、機械語のファイルです。
  2.リロケータブルファイルとは、再配置可能なファイルです。
  3.メモリに配置する為のアドレス番地が確定されていない状態の機械語のファイルを言います。


(3)リンケージエディタ(リンカ)とオブジェクトコンバータの役割



< リンケージエディタの処理 >

1.ロードモジュール( *.abs )の生成

  1.各ライブラリの結合
  2.各セクションへの結合
  3.アドレス番地の設定

< オブジェクタコンバータの処理 >

1.デバッガに表示できるファイルを追加する。

  デバッガ( CSIDE )にダウンロード出来るファイル( *.CTX )を作成

< 参考 >

 *.abc : Absolute とは?
  メモリに配置出来るように絶対番地を設定したファイルの事。





それでは、ここからは実際にHEWにビルド用サンプルプログラムを読み込みながら各種設定をしていきます。
各設定がどの様な意味を持つのかを知ってもらう意味で、エラー、ワーニングを出しながら内容の説明をして行
きます。これは、1回設定してしまえば毎回設定する必要はないので忘れてしまいがちですが、重要なので内容
の理解をお願いします。( 後で説明書を見ながら設定が出来ればOKですよ。)

新規プロジェクト・ワークスペースの作成

まずは、「HEW.exe」をダブルクリックして起動します。( わからない時は、講師に質問 )
これから、新規ワークスペースを作成していきます。
「ファイル」-「新規ワークスペース」を選択します。
( 画面コピー画像は、クリックで拡大できます。)



下記画面( ダイアログボックス画面 )が現れます。



下記「新規プロジェクトワークスペース」画面では、赤枠の選択と記載をする
「プロジェクトタイプ」は、「Empty Application」を選択します。
「参照」ボタンをクリックし、ディレクトリの選択から
  「c:\JROBO_WorkSpace\HEW_WSS\JR_cprog\cprog」を選択します。
「ワークスペース名」に、cprog と入力するとプロジェクト名も同名で入力されます。( 異なる名前でもOK )



上記画面で「OK」ボタンを押すと、下記の画面が表示されます。
「CPUシリーズ」には、SH-3 を選択します。<1枚目>



次の画面での「Endian選択」では、Little を選択<2枚目>



Little Endian 、Big Endian の違いは、下記の様に数値のメモリー配置が異なります。
SHファミリーは、エンディアンをリトル、ビッグのどちらにも使用可能です。外部メモリを接続可能な外部拡張
モードの場合はエリア毎にエンデアンを切り替える事も出来るようになっています。
まお、デフォルトエンディアン設定はリトルです。( 性能は、全く同一です。)
エンディアンの違いが移植性に問題を与えるとすれば、
 ・ 外部接続の周辺LSIに対する操作
 ・ 共用体のメンバアクセス
の2つです。共用体は同一番地に対して、異なるデータ型を割り当てられますから、リード/ライトでデータ型
を変更した場合、エンディアンの違いによって異なる値がリード/ライトされます。



ここで、「完了」ボタンを押し終了させます。
「完了」ボタンを押すと、下記の確認画面が表示されるので今までの設定が間違いないかを確認出来ます。




新規ファイルの作成とプロジェクトへの通知

上記で作成した「cprog.hws」をダブルクリックして、HEWを起動します。



新しいプロジェクトの作成(初回立ち上げ時)で立ち上げた画面です。
プロジェクト「cprog」が太字で表示されカレントプロジェクトである事が確認されます。



新しいプロジェクトに「ファイルの追加」をします。



あらかじめ別のエディタ等で作成した「cprog.c」をファイル選択します。
「cprog.c」ソースファイルは、あらかじめ「main」フォルダを作成しその中に保存しておきます。



cprog ワークスぺース/cprog プロジェクト内の C ソースに「cprog.c」が組み込まれました。



「cprog.c」をダブルクリックすると、左のワークアリアにソース内容が表示されます。



「cprog.c」ソースファイル内容です。

/*---------------------------------------------------------------------------------------------------------------*/
/* ビルド用デモンストレーションファイル                              */
/* FILE NAME : cprog.c                                     */
/*                                       JROBO/2013/10/   */
/*---------------------------------------------------------------------------------------------------------------*/

#include <stdio.h>

const char str[] = "Hello Embedded World !!";
int a, b, c;
int d = 1000;

int subf(int, int);

void main(void)
{
  char e, f;
  int g, h;

  g = 4;
  h = 256;         /* 最適化によりアセンブリソースに展開されない */
  a = subf(g, d);
  b = a % 9;
  d = d / b;
  e = str[h&9*5];     /* 最適化によりアセンブリソースに展開されない */
  f = str[0];        /* 最適化によりアセンブリソースに展開されない */
  while (1);        /* 組込システムでは、main 関数からリターンする事はない */
}

int subf(int x, int w)
{
  return x*w / (x+w);
}
//------------------------------------------------------------------------------------------------------------------


ビルド( コンパイル+リンク )を行う。


この状態で、ビルドするとどうなるでしょうか。



HEW画面下部にある出力ウインドウにエラー表示が出ました。
エラーの内容は、上の赤丸で表示されています。
原因は、ライブラリー等の設定が不十分なので、エラーが検出されビルドが終了してしまいました。






ビルド・フェーズ

 HEWで用いられる変換ツールは、基本的にはライブラリージェネレーター、C コンパイラ、アセンブラ、リン
ケージエディタの4つになりますが、当クラブでは更にデバッガーとしてコンピューテックス社のCSIDEを利用
しますので、このCSIDEの読み込める形式( .ctx )に変換する必要があります。したがって計5つのツールを使
います。
ビルドでは各ツールが動作する段階をフェーズと言います。下記にビルド実行を示します。



上記の設定を行います。
「ビルド」-「ビルドフェーズ」を選択すると下記画面が表示されます。
デフォルトでは、下記の様に4つのフェーズがすでに有効状態にあり、ビルドフェーズの順番も設定されていま
す。しかし「 .ctx 」の形式へ変換するフェーズが登録されていません。
追加ボタンをクリックして追加登録します。



新規カスタムフェーズの作成を選択し、次へをクリックします。



.ctx 形式へのファイル変換は、ビルドする毎に1回実行する事になるので、単一フェーズを選択し、次へをクリ
ックします。



3/4ステップでは、このフェーズを実行する際のコマンドを指定します。
コマンド部分が、途中で切れて表示されていませんが、下記内容を参照で選択して下さい。
C:\Program Files\CSIDE\Etc\PALMiCE3 SuperH\dw22ctx.exe





「フェーズ名」には、DW22CTX と入力します。



「デフォルトオプション」には、右のボタンを押して、プロジェクト名を選択します。



4/4フェーズでは、何もせず完了をクリックし、フェーズの追加を終了します。



以上の設定の結果、以下の画面で確認する事ができます。
この変換フェーズは、リンカが出力する .abs 形式(アブソリュート形式:ELF)のファイルを .ctx 形式のファイ
ルへ変換しますので、ビルドフェーズの順序も Optlinker の次になります。




オプション設定

 C コンパイラの出力ファイルを設定します。



「ビルド」メニューから、「SupreH RISC engine Standard Toolchain・・・」を選びます。



「コンパイラ」タブ上で、カテゴリを「オブジェクト」にすると、出力ファイル形式が「機械語プログラム
( *.obj )」に設定されています。
また、「デバッグ情報出力」がチェックされているので、デバッグ情報もあわせて出力されます。



「カテゴリ」を「最適化」に変更し、最適化(O)を「なし」に設定します。





 アセンブル出力するオブジェクトファイルへのオプションです。



デバッグ情報付きでオブジェクトファイルを生成するように設定してあります。
アセンブラはデフォルトでプロジェクトファイル中の拡張子が「 *.src 」であるファイルを入力ファイルとしま
すが、C コンパイラが出力するアセンブリソースファイルも入力ファイルとなります。

 C コンパイラは、デフォルトでオブジェクトファイル「 *.obj 」を生成するようになっていますが、アセンブ
リソースのインライン展開を含む場合は、一旦アセンブリソースファイルに変換した後、アセンブラによりオブ
ジェクトファイル「 *.obj 」生成するようにオプション設定します。





 リンカの出力オプション設定です。



出力形式をアブソリュート( ELF : execute linking format/DWARF )「 拡張子:*.abs 」に設定します。
デバッグ情報は、出力ファイル内に生成するように設定されています。
ファイル拡張子を変更するかどうかを聞いてきますので「OK」をクリックします。



「OK」ボタンをクリックしてHEWに戻り、ビルドします。
ビルドはファイルのビルドではなく「ビルド」ボタンをクリックします。
残念ながら下画面のように、1 Errors、0 warning が表示されます。
これは、HEW がプロジェクト毎に生成した標準ライブラリをリンクする必要があるからです。







「ビルド」メニューから、「 SuperH RISC engine Standard Toolchain・・」を選びます。
下画面のダイアログボックスが開きますので、「標準ライブラリ」タグをクリックし「カテゴリ」を「モード」
にして、そのモードを「標準ライブラリファイル作成(オプション変更時)に設定します。



次に同タグにおいて、「カテゴリ」を「標準ライブラリ」にして下画面に示す3か所にチェックを入れ「OK」
ボタンをクリックし閉じます。
ヘッダーファイルに対応する標準関数が使えるようになりますが、どのヘッダーファイルをチェックするかは、
どの関数を利用するかによってきまります。
当然、組込み機器にはキーボードやディスプレイが接続されていませんので、このままでは標準入出力関数を
利用できません。



では、改めてビルドします。
ビルド結果が下画面です。
エラーは無くなりましたが、セクションにアドレスの割り当てが無い為4つのワーニングがでています。
セクションに対するアドレスの割り当てが必要です。




ビルドコンフィグレーション


 HEWでは、ビルドのすべてのオプションをコンフィグレーションに名前を付けて、保存できます。
よって、コンフィグレーションを選択することにより、各フェーズのオプションを変更できます。
デフォルトでは、下画面に示すように「Debug」と「Release」の2つのコンフィグレーションが用意されてい
ます。下画面はデフォルトで用意されている cprog プロジェクトのフォルダを示します。
各フェーズで生成された出力ファイルは カレント の コンフィグレーション と同じ名前のフォルダに格納されます.



「Debug」フォルダ内のファイルです。




セクション

 C コンパイラは、プログラムをセクションで分割管理します。他のコンパイラ、アセンブラではセグメントと
呼ぶものもありますが、SH C/C++コンパイラでは、セクションと呼びます。
 セクションは、プログラムやデータの集まりで、異なるソースプログラム(モジュール)での同名のセクショ
ンは、リンク時に1つに集められ連続するアドレスに配置する事ができます。








 セクション P , C , D は ROM 、B は RAM に配置します。
 ただしセクション D の初期化付き変数をプログラムで変更できるようにするため RAM 上に初期化ルーチンで
 コピーする必要があります。
 また、セクション B の未初期化変数は初期化ルーチンで初期値をゼロにする必要があります。


デフォルトセクションの確認( 確認後は、設定を元に戻す必要があります。)

 確認の為、C ソースファイルをアセンブルソースファイルに変換します。
そして、プログラムや変数がどのセクションへ属するか確認します。

 「ビルド」は、カレントプロジェクトに含まれるファイルすべてに対して行われますが「ファイルのビルド」
を行えば、カレントプロジェクトのファイル単位でビルドできます。
ファイルのビルドは、ソースファイルに対して1つのフェーズ(ツール)が動作し、ビルドを終了します。
下記は、ファイルグループとフェーズ順序の対応です。



 下画面は、個別ファイルに対するオプション設定です。プロジェクトファイルから「cprog.c」を選択して
カテゴリをオブジェクト、出力ファイル形式をアセンブリプログラム(*.src)、デバッグ情報を生成しないよう
にチェックを外します。(下画面は、初期画面)



変更後の画面です。



下画面に示すように、ワークスペースウインドウ内でビルドするファイル「cprog.c」を選択し「ファイルのコン
パイル」ツールボタン<画面上部の赤枠>をクリックします。
SH C/ C++Compiler が起動し、cprog.c のファイルのみアセンブリソースファイルに変換し終了します。



ノンエラー、ワーニングで終了しました。
cprog 内にある Debug フォルダ内に cprog.src が出来上がっています。



cprog.src の内容です。

;*********************************************************************************
; FILE NAME : CPROG.SRC
; CPROG.C のアセンブラソースファイル
; セクション確認用(最適化なし)

      .FILE "C:\JROBO_WorkSpace\HEW_WSS\JR_cprog\cprog\main\cprog.c"
      .IMPORT  __divls
      .EXPORT  _a
      .EXPORT  _b
      .EXPORT  _c
      .EXPORT  _str
      .EXPORT  _d
      .EXPORT  _main
      .EXPORT  _subf
      .SECTION  P,CODE,ALIGN=4  ; ここから P セクション
_main:                   ; function: main
                      ; frame size=28
      .STACK  _main=28
      STS.L   PR,@-R15
      STS.L   MACL,@-R15
      STS.L   MACH,@-R15
      ADD    #-16,R15
      MOV    #4,R4       ; H'00000004
      MOV.W   L15,R1       ; H'0100
      MOV    R1,R7
      MOV.L   R7,@(12,R15)   ; h
      MOV.L   L15+4,R1      ; _d
      MOV.L   @R1,R2       ; d
      MOV    R2,R5
      BSR    _subf
      NOP
      MOV    R0,R5
      MOV.L   L15+8,R1      ; _a
      MOV.L   R5,@R1       ; a
      MOV.L   L15+12,R2      ; H'38E38E39
      DMULS.L  R5,R2
      STS    MACH,R6
      SHAR    R6
      MOV    R6,R2
      ROTL    R2
      MOV     #1,R1        ; H'00000001
      AND     R1,R2
      MOV     R6,R4
      ADD     R2,R4
      MOV     R4,R2
      MOV     R2,R6
      SHLL2    R2
      SHLL     R2
      ADD     R6,R2
      MOV     R5,R6
      SUB     R2,R6
      MOV.L    L15+16,R1      ; _b
      MOV.L    R6,@R1        ; b
      MOV.L    L15+4,R1       ; _d
      MOV.L    @R1,R2        ; d
      MOV     R2,R1
      MOV     R6,R0
      MOV.L    L15+20,R3      ; __divls
      JSR     @R3
      NOP
      MOV     R0,R2
      MOV.L    L15+4,R1       ; _d
      MOV.L    R2,@R1        ; d
      MOV.L    L15+24,R2      ; _str
      MOV.L    @(12,R15),R7    ; h
      MOV     #45,R1        ; H'0000002D
      AND     R1,R7
      MOV     R7,R0
      MOV.B    @(R0,R2),R6    ; str[]
      MOV.L    L15+24,R2      ; _str
      MOV.B    @R2,R6        ; str[]
      MOV     #1,R1         ; H'00000001
      MOV     R1,R0
      CMP/EQ   #0,R0
      BT      L11
L12:
      MOV     #1,R1         ; H'00000001
      MOV     R1,R0
      CMP/EQ   #0,R0
      BF      L12
L11:
      ADD     #16,R15
      LDS.L    @R15+,MACH
      LDS.L    @R15+,MACL
      LDS.L    @R15+,PR
      RTS
      NOP
_subf:                      ; function: subf
                        ; frame size=8
      .STACK   _subf=8
      STS.L    PR,@-R15
      STS.L    MACL,@-R15
      MUL.L    R4,R5
      STS     MACL,R1
      ADD     R5,R4
      MOV     R4,R0
      MOV.L    L15+20,R3 ; __divls
      JSR     @R3
      NOP
      MOV     R0,R2
      MOV     R2,R0
      LDS.L    @R15+,MACL
      LDS.L    @R15+,PR
      RTS
      NOP
L15:
      .DATA.W    H'0100
      .RES.W    1
      .DATA.L    _d
      .DATA.L    _a
      .DATA.L    H'38E38E39
      .DATA.L    _b
      .DATA.L    __divls
      .DATA.L    _str
      .SECTION   C,DATA,ALIGN=4     ; ここから C セクション
_str:                        ; static: str
      .SDATA    "Hello Embedded World !!"
      .DATA.B    H'00
      .SECTION   D,DATA,ALIGN=4     ; ここから D セクション
_d:                         ; static: d
      .DATA.L    H'000003E8
      .SECTION   B,DATA,ALIGN=4     ; ここから B セクション
_a:                         ; static: a
      .RES.L    1
_b:                         ; static: b
      .RES.L    1
_c:                         ; static: c
      .RES.L    1
      .END

 生成されたファイルをみると、実行コードとアドレステーブルが P セクションになります。
const 指定子のついた文字列 str は、C セクションになります。
文字列 str は、const 指定子を付加しないデフォルトでは、D セクションに配置されます。
変数dは、グローバルで初期化されていますので、D セクションになります。
初期値なしのグローバル変数 a, b, c は、B セクションになります。
 ローカル変数の e, f, g,h は、通常スタック領域が確保されますが、最適化オプションを設定するとレジスタに
割り付けられることもあります。また、最適化によって発行した関数以外に影響を与えない行はコンパイル対象
から削除されることもあります。
 グローバルで宣言された変数や関数は変数名・関数名に ”_” を名前の先頭に付け、EXPORT宣言されます。
また、割り算を行うランタイムライブラリ __divls は、IMPORT宣言されています。
 _main: や _sub: に続くコメントの中に ”frame size" とありますが、これはこの関数内で利用するスタック
サイズになります。

 さあ、アセンブラソースファイルにて、セクション配置がわかった所で、設定を元にもどします。

@ C コンパイラの出力形式 : *.obj
A C コンパイラの生成するデバッグ情報 : 生成する。





実アドレスの割り当て


 リセットスタートの流れを説明します。

@ SH-3 には、スタックポインタ(SP)はありませんが、C コンパイラは R15 を SP として利用しますので、
 まず SP の設定をします。

A 次に、メモリを利用できるようにするため、BSC( バスステートコントローラ )の初期化を行います。
 今回の利用するターゲットボードでは SDRAM の他に RAM は搭載していませんので、ここで SDRAM の初期
 化が必要となります。
 この設定が終わるまで、スタック(RAM)を利用するようなプログラム(関数呼び出し)は正常に動作しませ
 ん。しかし、今回はデバッガー上でBSCの設定をおこなうため、リセットスタートのプログラムにはその機能
 を持たせない形で生成します。

B 初期化データ領域 D セクションは、SDARM 上の R セクションへコピーします。
 C ソースプログラムで D セクションの変数を参照するには、コピーした R セクションの変数に対して行うよう
 指示しなければなりません。また、未初期化データ領域 B セクションはゼロクリアします。

C main 関数を呼び出す前に、CPU動作モード(MD)、ブロックビット(BL)、割り込みマスクビットの設定、
 すなわち SR の設定を行います。また、割り込み処理を行う場合は、VBR の設定も必要になります。


リセットスタートプログラム < vect7709s.src >
; *********************************************************************************
;  リセットスタート
;  FILE NAME : vect7709s.src
;  C 言語で記述できないことは、アセンブリ言語で書きます。
;    @ スタックポインタの設定
;    A VBR の設定
;    B SR の設定
;    C スタックセクションの確保
; *********************************************************************************

_INIT_VBR    .EQU      H'8C000000
STACK_SIZE   .EQU      1024
         .IMPORT    _init
         .EXPORT    _RST_VECT
         .SECTION    VECT,CODE,ALIGN=4
_RST_VECT:                         ; リセットスタートはここから
         MOV.L     INIT_STACK,R15       ; スタックポインタ設定
         MOV.L     INIT_VBR,R0
         LDC      R0,VBR            ; VBR の設定
; メモリ設定等、最初に必要な処理がある場合は追加してください。
;         BSR      _INIT_BSC_ETC
;         NOP
         MOV.L     INIT_SR,R0
         LDC      R0,SR
         MOV.L     __init,R3    ; 初期設定ルーチンへ(アンダーバーの本数は2本)
         JMP      @R3
         NOP
;
         .ALIGN 4
INIT_STACK:   .DATA.L     _INIT_STACK
INIT_VBR:    .DATA.L      _INIT_VBR
INIT_SR:     .DATA.L     H'600000F0
__init:       .DATA.L     _init          ; ラベル部分のアンダーバーの本数は2本
;
         .SECTION    S,STACK,ALIGN=4
         .RES.B      STACK_SIZE
_INIT_STACK:
;
         .END

< dbsct.src >
; *********************************************************************************
; FILE NAME : dbsct.src
; DESCRIPTION : Setting of B,R Section
; CPU TYPE : SH7709S
; *********************************************************************************

   .SECTION     D,DATA,ALIGN=4
   .SECTION     R,DATA,ALIGN=4
   .SECTION     B,DATA,ALIGN=4
   .SECTION     C,DATA,ALIGN=4
;
; (ラベル部分のアンダーバーの本数は2本)
__D_ROM    .DATA.L (STARTOF D)              ; Start Address of Section D
; (ラベル部分のアンダーバーの本数は2本)
__D_BGN    .DATA.L (STARTOF R)              ; Start Address of Section R
__D_END    .DATA.L (STARTOF R) + (SIZEOF R)       ; End Address of Section R
; (ラベル部分のアンダーバーの本数は2本)
__B_BGN    .DATA.L (STARTOF B)              ; Start Address of Section B
__B_END    .DATA.L (STARTOF B) + (SIZEOF B)       ; End Address of Section B


   .EXPORT   __D_ROM                 ; 先頭のアンダーバーの本数は、2本
   .EXPORT   __D_BGN                 ; 先頭のアンダーバーの本数は、2本
   .EXPORT   __D_END                 ; 先頭のアンダーバーの本数は、2本
   .EXPORT   __B_BGN                 ; 先頭のアンダーバーの本数は、2本
   .EXPORT   __B_END                 ; 先頭のアンダーバーの本数は、2本

   .END

< init.c >
/**********************************************************************************
セクションの初期化と、main 関数の呼び出し
FILE NAME : init.c
特別な組込み関数やコンパイラの拡張機能を使えば、C 言語だけでもスタートアップ
ルーチンを記述できますが、ここでは、これらの機能は使わずにシステムの初期化を行う
この関数(init())は、vect7709s.src から呼び出される。
**********************************************************************************/

extern void main(void);
extern int *_D_ROM, *_B_BGN, *_B_END, *_D_BGN, *_D_END;
#pragma section START              /* .section PSTART, CODE, ALIGN=4 */

void _INITSCT(void)
{
  int *p, *q;
  /*  zero clear  */
  for(p = _B_BGN; p < _B_END; p++)
  {
    *p = 0;
  }
  /* ROM  to  RAM */
  for(p = _D_BGN, q = _D_ROM; p < _D_END; p++, q++)
  {
    *p = *q;
  }
}

void init(void)
{
 /* この位置に様々なシステムの初期化を書いても良い */
 _INITSCT();                     /* D ---> R へのコピー、0 ---> B */
 main();                        /* main 関数呼び出し */
 while(1);                       /* もし、main からリターンしたら */
}

cprog フォルダに、init を作成して、このフォルダ内にシステムの初期化に必要な上記3つのソースファイルを
作成し保存します。そして「プロジェクトに追加」し、ビルドしましょう。
<  vect7709s.src,  init.c,  dbsct.src  >







下画面の様に、warnings が8つ出力されました。
当然、これはセクションのアドレス指定を行っていない為です。



 では、ここで各セクションへ実アドレスを割り付けます。
以降では、ターゲットシステムにあわせて、セクション VECT, PSTART, P, C, D をリセットスタートする
H’A0000000 番地以降のフラッシュメモリ領域に配置し、次に、セクション R, B, S を SDRAM の先頭アドレス
H'88000000 番地以降に配置する様に設定しています。











下画面は、リンカの出力ファイルを設定します。
「オプション」メニューの「SuperH RISC engine Standard Toolchain・・」の最適化リンカタグにおいて、
出力ファイル形式は「アブソリュート( ELF/DWARF )」、デバッグ情報は出力ファイルの中に作成するよう
に設定します。
また、D セクションと R セクションを2重化し、D セクションを参照するコードは、すべて R セクションを
参照するコードへ変更されるように指定します。








エントリポイントを指定します。これは、デバッガでデバッグ対象ファイルを読み込んだときにPCに設定される
アドレスまたはラベルを指定します。(カテゴリ:入力)



次に、コンパイラのタグを選択し、カテゴリ:最適化の最適化(O)がなしであることを確認します。
この後、デバッガで動作確認を行うため、C ソースファイルの最適化を抑止するようにしています。



また確認ですが、カテゴリをオブジェクトとし、出力ファイル機械語プログラム、デバッグ情報を生成するよう
にデバッグ情報出力にチェックが入っているか確認します。



次も確認ですが、アセンブラタグを選択し、カテゴリ:オブジェクトとしてアセンブリソースファイルをデバッ
グ情報付きで、生成するように設定されているか確認します。



これで、すべてのオプション設定が終わりましたので、ビルドします。
エラーもワーニングもゼロになりました。






  

教室情報 ――――――

ロボカップ関連 ――――
  

バナースペース

けいはんな
   ジュニアロボットクラブ

〒619-0237
京都府相楽郡精華町光台8丁目

TEL : 070-5263-2200
FAX : 0774-98-1100
mail : jun@kinet-tv.ne.jp