Renesas Synergy™

FAQ 1007819 : ROM化の手順は?

回答

ROM化をするうえで必要となるプロセスは、以下のようになります。
ただし、アプリケーション中に初期値をもつグローバル変数 (初期値ありデータ) がある場合と、 そうでない場合で、プロセスが異なります。

初期値ありデータがない場合は、次のようになります。

  1. リンカを起動してロード・モジュール(.out)を作成する。
  2. ROM に書き込むために、ヘキサ・コンバータを起動してヘキサ・ファイルを作成する。

一方、初期値ありデータがある場合は、次のようになります。

  1. リンカを起動してロード・モジュール(.out)を作成する。
  2. ROM化プロセッサを起動して ROM化用のロード・モジュール(.out)を作成する。
  3. ROM に書き込むために、ヘキサ・コンバータを起動してヘキサ・ファイルを作成する。

つまり、初期値ありデータがある場合、初期値を ROM 空間 (ROM化用確保領域) に持っておき、 アプリケーション実行前に変数の初期値をセット (コピー) するプロセスが必要になります。

ここでは、初期値のあるグローバル変数を持つアプリケーションを例に、ROM化の方法を説明します。


作成の方法には 2 通りあります。
1 つは ROM化用確保領域をデフォルトで用意されているものを使用して作成する方法、 もう 1 つは ROM化用確保領域を自分で作成する方法です。
ここでは ROM化用確保領域を自分で作成する方法について説明します。


まず、「1. リンカを起動してロードモジュール(.out)を作成する」とき、 以下のことを行う必要があります。

  1. コンパイル時に、オプション "-Xr" をつける。
  2. ROM化用領域を確保するrompackセクションを作るため、__rompackシンボルを定義する。
  3. rompackセクションに配置された各セクションをコピーする関数 "_rcopy" をスタート・アップ・モジュールやmain関数の先頭など、なるべく始めの方で起動する。

-Xrオプションにより、2で定義したシンボル“__rompack”がrompsecと同じアドレスを指すコードを生成します。
また、このオプションによって、libr.aをリンクするようにリンカへ指示されます。

rompackセクションとは、入力されたオブジェクト・ファイル中の、初期値を持つデータ・セクション(data属性またはsdata属性を持つセクション)をパッキングし、これらのセクションの内容と、セクションのアドレス情報とを含むセクションです。
なお、rompackセクションの属性は、「text属性セクション」です。

ここで、具体的な手順を示します。

サンプルのファイルは以下のとおりとします。

  • main.c … _rcopy関数が記述されている関数
  • rompack.s … __rompackシンボル定義用ファイル(ROM化用領域確保コード)
  • lcfile.dir … リンク・ディレクティブ・ファイル

それぞれのファイルの内容は、以下のようになります。

【 main.c 】

#pragma ioreg extern unsigned long _rompack; main() {     int  ret;     int  j, k;     MM = 0x10;     ret = _rcopy(&_rompack, -1);     for(j=0; j<100; j++) {         k++;     } } 

 

【 rompack.s 】
    .file  "rompack.s"     .section  "rompack", text     .align  4     .globl  __rompack, 4 __rompack:

 

【 lcfile.dir 】
SCONST : !LOAD ?R V0x160 {     .sconst = $PROGBITS ?A .sconst; }; TEXT  : !LOAD ?RX V0x200 {     .text = $PROGBITS ?AX .text; }; CONST : !LOAD ?R {    .const = $PROGBITS ?A .const; }; ROMPACK : !LOAD ?RX {     .rompack = $PROGBITS ?AX .rompack; }; SIDATA : !LOAD ?RW V0xffe000 {     .tidata.byte  = $PROGBITS ?AW .tidata.byte;     .tidata.word  = $PROGBITS ?AW .tidata.word;     .tidata  = $PROGBITS ?AW .tidata;     .sidata  = $PROGBITS ?AW .sidata;     .data    = $PROGBITS ?AW .data;     .sdata   = $PROGBITS ?AW .sdata;     .sbss    = $PROGBITS ?AW .sbss;     .bss     = $PROGBITS ?AW .bss; }; __tp_TEXT @ %TP_SYMBOL; __gp_DATA @ %GP_SYMBOL &__tp_TEXT; __ep_DATA @ %EP_SYMBOL; 


これによって、_rcopy関数を実行すると、ROM化用確保領域に格納されている初期値情報がコピーされます。

PM+を使用する場合、コンパイラ共通オプション設定ダイアログのROM化タブにある“ROM化用オブジェクト生成”をチェックします。 このチェックは、Cコンパイラ・オプションの "-Xr" を指定したのと同じ意味になります。
続いて、コンパイラ共通オプションの設定ダイアログのROM化タブにある“rompcrt ファイル”に“rompack.s”、または“rompack.o”を追加します。
最後に、ROM化プロセッサオプションの設定ダイアログのオプション・タブで“エントリラベル[-b]”にrompackセクションの先頭ラベルである“_ _ rompack”を記述します。
また、PM+を使用する場合、ヘキサ・コンバータも自動的に起動され、ヘキサ・ファイルが生成されます。

メイク・ユーティリティやCコンパイラを直接起動して生成する場合は、 オプションを指定する必要があります。
コンパイル時には、オプション "-Xr" をつけます。

 

適用製品

V850用コンパイラパッケージ [CA850]
他にご質問がございましたら、リクエストを送信してください