Renesas Synergy™

FAQ 107052 : R8C/2A~2D等のようにRAM領域が2箇所に分かれている品種の、両方のRAM領域を使用する方法

Q: 質問

R8CファミリのR8C/2A~2D等のようにRAM領域が2箇所に分かれている品種がありますが、この両方のRAM領域を使用するにはどうしたらよいでしょうか?

 


A: 回答

2箇所のRAM領域への配置を自動的に行なう機能は、M16Cファミリ、R8Cファミリのコンパイラにはございません。
また、スタートアッププログラムの変更によって、2つのRAM領域に振り分けて配置することもできません。
どちらのRAMに配置するかを意識して、ユーザソースプログラム上で変数を宣言する必要があります。

R8Cファミリでは品種によって、400h番地からの通常のRAM(以後RAM-Aと呼ぶ)に加え、3000h番地から始まるRAM(以後RAM-Bと呼ぶ)を持つものがあります。
このようにRAMが不連続の2箇所の領域にある場合、ユーザソースプログラムで、RAM-Bに配置する変数を新たなセクションで宣言する必要があります(メモリ配置はセクションを単位としているため)。
その新たに宣言したセクションを3000h番地に配置します。

まず、それぞれのRAM領域のどちらにどの変数を配置するかを決めます。
次にRAM-Bに配置する変数のセクション名を変更します。
ソースプログラム上の変数宣言部分で、#pragma sectionを利用してセクション名を変更します。

以下に変数a,dをRAM-Aに、変数b,cをRAM-Bに配置する場合の例を示します。
RAM-Aのセクションは、デフォルトのbssとします。
RAM-Bのセクションは、bss2(名称は任意)とします。
下例のように #pragma sectionによって、変数b,cのセクションをbss2に変更します。下例は、M16Cコンパイラ V.5.43以降の使用を前提としています。

【例】

int  a;                   // aは bss_NEセクション
#pragma section bss bss2 // デフォルトのbssからbss2へセクション変更
int b; // bは bss2_NEセクション
char c; // cは bss2_NOセクション
#pragma section bss bss // デフォルトのbssにセクションに戻す
char d; // dは bss_NOセクション

セクション名の詳細に関しては、コンパイラマニュアルの「2.2.3. メモリ配置のカスタマイズ」をご参照ください。

最後に新しく宣言したbss2セクション(bss2_NE、bss2_NO)を3000h番地に配置します。
配置方法は次の(a)または(b)のいずれかで行ないます。

(a)リンカ-ORDERオプションでbss2を設定
リンカの-ORDERオプションで、bss2_NEセクション、bss2_NOセクションを3000h番地から配置するよう設定します。

【例】

-ORDER bss2_NE=03000,bss2_NO

(b)スタートアッププログラムsect30.incにbss2を追加
アセンブラスタートアッププログラムsect30.incファイルを使用している場合、本ファイルの修正でも対応できます。
下の5行をsect30.incファイルの末尾に追加してください(必ずファイルの末尾、.endの直前に追加してください)。

【例】

.section bss2_NE,DATA
.org 3000H
bss2_NE_top:
.section bss2_NO,DATA
bss2_NO_top:

さらにbss2_NEセクション、bss2_NOセクションの領域を予め0クリアしたい場合、スタートアップファイルに以下の処理を追加します。

【Cスタートアップ使用の場合】
次のようにinitsct.cファイルにbss2_NEセクション、bss2_NOセクションの0クリアのための2行を追加してください。

void initsct(void)
{
sclear("bss_SE","data","align");
:
// add new sections
// bss_clear("new section name");
sclear("bss2_NE","data","align"); // 追加
sclear("bss2_NO","data","noalign"); // 追加

【アセンブラスタートアップ使用の場合】
次のようにncrt0.a30ファイルにbss2_NEセクション、bss2_NOセクションの0クリアのための2行を追加してください。ただし、bss2_NEセクション、bss2_NOセクションの配置は必ず上記(b)の方法で行なってください。

;---------------------------------
; bss zero clear
;---------------------------------
N_BZERO bss_SE_top,bss_SE
N_BZERO bss_SO_top,bss_SO
N_BZERO bss_NE_top,bss_NE
N_BZERO bss_NO_top,bss_NO
N_BZERO bss2_NE_top,bss2_NE ; 追加
N_BZERO bss2_NO_top,bss2_NO ; 追加

 

適用製品

M16Cシリーズ,R8Cファミリ用C/C++コンパイラパッケージ [M3T-NC30WA]
他にご質問がございましたら、リクエストを送信してください