RL78ファミリ用 統合開発環境 V850ファミリから RL78ファミリへの移行

RL78ファミリ用 統合開発環境
V850ファミリから RL78ファミリへの移行(コーディング編)
株式会社ルネサス ソリューションズ
ツールビジネス本部 ツール技術部
2014/04/28
Rev. 1.00
R20UT2995JJ0100
© 2014 Renesas Solutions Corp.
はじめに
 本資料では、V850ファミリ用Cコンパイラ CA850、および、RL78ファミリ用Cコン
パイラ CA78K0Rを対象に説明しています。
2
© 2014 Renesas Solutions Corp.
目次




3
言語仕様
拡張機能
組み込み関数
マクロ
© 2014 Renesas Solutions Corp.
言語仕様
 CA850とCA78K0Rの言語仕様の違い(1)
CA850
CA78K0R
言語
C言語
C言語
言語規格
C89
C89
エンディアン
little
little
char
符号あり
符号あり
int
4Byte
2Byte
double
4Byte
4Byte
enum
signed int
signed char/
※1:-Xenum_typeオプションで変更可能
unsigned char/
※2:列挙値が収まる最小型として処理します
signed int
(※2)
ポインタ型
4Byte
(※1)
備考
CA850、CA78K0Rともに、オプションで符号
なしに対応
near 2バイト
far 4バイト
サポートされている言語仕様は異なります。 CA78K0Rでサポートされている言語仕様の範囲以内でご使用ください。
詳細は、コンパイラユーザーズマニュアルを参照し変更してください。
4
© 2014 Renesas Solutions Corp.
 CA850とCA78K0Rの言語仕様の違い(2)
CA850
CA78K0R
文字列
日本語可(シフトJIS/EUC)
多バイト文字未サポート
ビットフィールド
LSBから割り付ける
LSBから割り付ける
CA78K0Rは-rb オプションで
MSB変更可能
ビットフィールドの
符号あり
符号
符号なし
signed,unsigned の付かな
いビットフィールドの符号
ビットフィールドの char/short/int/long
メンバの型
(符号あり/なし)
char/short/int
(符号あり/なし)
境界整列
備考
char,unsigned char 型,および
char,unsigned char型,およ
その配列 :
びその配列 :
バイト境界
バイト境界
short,unsigned short 型,およ
その他(ポインタを含む) :
びその配列:2バイト境界
2バイト境界
その他(ポインタを含む) :
4バイト境界
サポートされている言語仕様は異なります。 CA78K0Rでサポートされている言語仕様の範囲以内でご使用ください。
詳細は、コンパイラユーザーズマニュアルを参照し変更してください。
5
© 2014 Renesas Solutions Corp.
enum
 CA850
 符号付き4バイト整数で扱います。
 ただし、-Xenum_type=string を指定した場合、指定した型で処理します。
– char
signed char として扱う
– uchar
unsigned char として扱う
– short
short として扱う
– ushort
unsigned short として扱う
 CA78K0R
 次の型の中ですべての列挙定数を表現可能な最初のものとなります。
① signed char
② unsigned char
③ signed int
6
© 2014 Renesas Solutions Corp.
ポインタ
 CA850
 unsiged int 型と同じサイズ(4バイト)で扱います。
 CA78K0R
 near属性の場合は2バイト、far属性の場合は4バイトで扱います。
 メモリモデル指定、ROMデータ配置先指定と__near、__far修飾子の指定に依存し
ます。
– __near、__far修飾子の指定がある場合には、修飾子の属性になります。
– __near、__far修飾子がない変数、関数に対してはメモリモデルの指定により、
属性は決まります。
– const定数の属性は、次の順番で決まります。
① ミラー領域がないデバイスでの強制far配置
② ブート/フラッシュ領域とミラー元領域が重ならない場合の強制far配置
③ __near、__far修飾子
④ ROMデータ配置先指定
⑤ メモリモデル指定
7
© 2014 Renesas Solutions Corp.
 メモリモデル指定と変数、関数のnear/far属性
メモリモデル指定
near/far属性
-msオプション
(スモール・モデル)
変数:
関数:
near属性
near属性
-mmオプション (デフォルト)
(ミディアム・モデル)
変数:
関数:
near属性
far属性
-mlオプション
(ラージ・モデル)
変数:
関数:
far属性
far属性
 ROMデータ配置先指定とconst定数のnear/far属性
8
メモリモデル
near/far属性
-rnオプション
const定数:
near属性
-rfオプション
const定数:
near属性
© 2014 Renesas Solutions Corp.
ビットフィールド
 CA850
 ビットフィールドのメンバの型は、次の型を使用できます。
– char/short/int/long (符号あり/なし)
 signed、unsigned の付かないビットフィールドの符号は、符号付きで扱います。
– signed、unsigned の付かない単なるint 型のビットフィールドの符号は、
-Xbitfieldオプションで変更可能です。
 CA78K0R
 ビットフィールドのメンバの型は、次の型を使用できます。
– char/short/int (符号あり/なし)
 ビットフィールドの符号は、記述したメンバの型の符号にかかわらず、符号なしで扱いま
す。
 (例)
struct SSS {
int a:2;
}
CA850
: 符号ビットと1ビットの数値
CA78K0R : 2ビットの数値
9
© 2014 Renesas Solutions Corp.
拡張機能
 CA850とCA78K0Rの拡張機能(#pragma)、キーワードの違い(1)
CA850
CA78K0R
備考
セクションの切り替え指 #pragma section
定
#pragma text
#pragma section
CA78K0Rでは、変数、関数セクションともに、
#pragma section で指定
短いアクセス命令セク #pragma section
ションへの切り替え指定 tidata
__sreg修飾子
CA78K0Rでは、セクション名を変更するので
はなく、__sreg修飾子で指定
周辺I/O レジスタ、
SFRへのアクセス
#pragma sfr
#pragma ioreg
関数のインライン展開 #pragma inline
CA78K0Rでは、#pragma inlineは「標準
関数形式マクロ等を使 ライブラリ関数memcpy,memsetを直接イ
用して記述する。
ンライン展開して出力し,オブジェクト・ファイ
ルを生成します。」の意味となる
アセンブラ埋め込み機 __asm( );
能(1)
_asm( );
__asm ( ) ;
アセンブラ埋め込み機 #pragma asm
能(2)
#pragma endasm
#asm
#endasm
詳細は、コンパイラユーザーズマニュアルを参照し変更してください。
10
© 2014 Renesas Solutions Corp.
 CA850とCA78K0Rの拡張機能(#pragma)、キーワードの違い(2)
CA850
CA78K0R
備考
構造体パッキング
#pragma
pack([1][2][4][8])
-Xbyte
-Xpack
-rc
CA78K0Rでは、オプションでのみ指定可能
割り込み関数の作成
#pragma interrupt
__interrupt
__multi_interrupt
#pragma interrupt
#pragma vect
__interrupt
__interrupt_brk
RL78ファミリでは、__multi_interruptの機
能必要なし
CA78K0Rでは、#pragmaで2つのキーワード
使用可能
-
CA78K0Rでは、関数を用意していないので割
り込み優先度を変更する際にはSFRを操作
割り込みレベルの制御 __set_il( , );
割り込み禁止関数指定
#pragma
block_interrupt
void func ( void ) {
DI ( ) ;
CA78K0Rでは、関数先頭、最後に、DI、EIを
記述することにより関数全体が割り込み禁止と
; 関数本体
なる
EI ( ) ;
}
詳細は、コンパイラユーザーズマニュアルを参照し変更してください。
11
© 2014 Renesas Solutions Corp.
 CA850とCA78K0Rの拡張機能(#pragma)、キーワードの違い(3)
CA850
CA78K0R
リアルタイムOS 対応機
#pragma rtos_task
能
#pragma rtos_task
#pragma rtos_interrupt
__rtos_interrupt
セクションアドレスの取 __s
得
__e
-
備考
CA850では、セクション名の先頭に文
字列を追加したシンボルを生成
詳細は、コンパイラユーザーズマニュアルを参照し変更してください。
12
© 2014 Renesas Solutions Corp.
セクション指定
 CA850
 変数のセクション指定
#pragma section セクション種別 “作成するセクション名” begin
・・・
#pragma section セクション種別 “作成するセクション名” end
 関数のセクション指定
#pragma text “作成するセクション名” 関数名
または
#pragma text “作成するセクション名”
 CA78K0R
 #pragma section コンパイラ出力セクション名 変更セクション名 [AT アドレス]
 CA78K0R用のフォーマットに変更してください。セクション名はCA850と
CA78K0Rでは異なります。詳細はコンパイラユーザーズマニュアルをご参照くださ
い。
13
© 2014 Renesas Solutions Corp.
CA78K0Rのコンパイラ出力セクション
セクション名
セグメントタイプ
再配置属性
説明
@@CODE
CSEG
BASE
@@CODEL
CSEG
コード部用セグメント(far領域配置)
@@CODER
CSEG
RAM配置コード部用セグメント
@@CNST
CSEG
@@CNSTR
CSEG
@@CNSTL
CSEG
PAGE64KP
ROMデータ(far 領域配置)
@@CNSTLR
CSEG
PAGE64KP
RAM配置ROMデータ用セグメント(far領域配置)
@@R_INIT
CSEG
UNIT64KP
near初期化データ用セグメント(初期値あり)
@@RLINIT
CSEG
UNIT64KP
far初期化データ用セグメント(初期値あり)
@@R_INIS
CSEG
UNIT64KP
初期化データ用セグメント(初期値ありsreg変数)
@@CALT
CSEG
CALLT0
callt関数のテーブル用セグメント
@@BASE
CSEG
BASE
callt関数・割り込み関数用セグメント
@@INIT
DSEG
BASEP
データ領域用セグメント(初期値あり,near領域配置)
@@INITL
DSEG
UNIT64KP
データ領域用セグメント(初期値あり,far領域配置)
@@DATA
DSEG
BASEP
データ領域用セグメント(初期値なし,near領域配置)
@@DATAL
DSEG
UNIT64KP
データ領域用セグメント(初期値なし,far領域配置)
@@INIS
DSEG
SADDRP
データ領域用セグメント(初期値ありsreg変数)
@@DATS
DSEG
SADDRP
データ領域用セグメント(初期値なしsreg変数)
@@BITS
BSEG
コード部用セグメント(near領域配置)
MIRRORP
ROMデータ(near領域配置)
MIRRORP(ミラー空間ありの場合)
UNITP(ミラー空間なしの場合)
RAM配置ROMデータ用セグメント(near領域配置)
boolean型変数,bit型変数用セグメント
詳細は、コンパイラユーザーズマニュアルをご参照ください。
14
© 2014 Renesas Solutions Corp.
関数のインライン展開
 CA850
 ユーザ関数をインライン展開することを指定します。
#pragma inline 関数名[, 関数名, ...]
 CA78K0R
 標準ライブラリ関数memcpy,memsetをインライン展開することを指定します。
#pragma inline
 CA78K0Rでは、“#pragma inline 関数名”の指定は、削除してください。
 実行速度を速くするために,いくつかの関数をインライン展開したい場合、以下のよう
な関数形式マクロ等を使用して記述してください。
 (例)
#define MEMCOPY ( a, b, c ) ¥
{¥
struct st { unsigned char d[ ( c ) ]; } ; ¥
* ( ( struct st * ) ( a ) ) = * ( ( struct st * ) ( b ) ) ; ¥
}
15
© 2014 Renesas Solutions Corp.
割り込み関数
 CA850
 割り込み/例外ハンドラの指定:
#pragma interrupt 割り込み要求名 関数名 [配置方法]
__interrupt 関数定義,または関数宣言
 多重割り込み/例外ハンドラを指定:
#pragma interrupt 割り込み要求名 関数名 [配置方法]
__multi_interrupt 関数定義,または関数宣言
 CA78K0R
 RL78ファミリでは、割り込み時のPC、PSWはスタックに退避されるため、通常割り込
み、多重割り込みの区別はありません。
#pragma interrupt 割り込み要求名 関数名 [レジスタバンク指定]
#pragma vect 割り込み要求名 関数名 [レジスタバンク指定]
 割り込み要求名は、マイコンに合わせて変更してください。
 レジスタバンクを指定する場合、重複しないように設定してください。また、レジスタ・バ
ンクが重複するような設定を行う場合は、それらの割り込みが重ならないように制御し
てください。
16
© 2014 Renesas Solutions Corp.
セクションアドレスの取得
 CA850
 各出力セクションの先頭アドレス,各出力セクションの終端を越える最初のアドレスを生
成します。
– 開始のアドレス : 出力セクションの名前の頭に“__s”を付加
– 終端を越える最初のアドレス : 出力セクションの名前の頭に“__e”を付加
– これらのシンボルは、アセンブラからのみ参照可能
 CA78K0R
 出力セクションの開始、終了のシンボルは生成しません。
 デフォルトの変数、初期値あり変数の初期値のセクションのシンボルは定義されていま
す。それ以外のセクションのアドレスが必要な場合には、プログラムにて定義をしてくだ
さい。
– 開始のアドレス : スタートアップルーチンで定義
– 終端を越える最初のアドレス : rom.asm で定義
17
© 2014 Renesas Solutions Corp.
 (例) スタートアップルーチンでの定義
R_UINIT CSEG
_R_UINIT_S:
UINIT
DSEG
_UINIT_S:
UDATA
DSEG
_UDATA_S:
セクション名
UNIT64KP
BASEP
再配置属性
元のセクションと同じにする
BASEP
開始のアドレスのシンボル
 (例) rom.asmでの定義
変更しないでください
NAME
@rom
PUBLIC
_R_UINIT_E,_UINIT_E,_UDATA_E
R_UINIT CSEG
_R_UINIT_E:
UINIT
DSEG
_UINIT_E:
UDATA
DSEG
_UDATA_E:
セクション名
18
PUBLIC宣言
UNIT64KP
BASEP
再配置属性
元のセクションと同じにする
BASEP
終端を越える最初のアドレスのシンボル
© 2014 Renesas Solutions Corp.
組み込み関数
 CA850とCA78K0Rの組み込み関数の違い(1)
CA850
CA78K0R
備考
割り込み制御
__DI
__EI
DI
EI
CA78K0Rは、#pragma DI,#pragma EI
指令をC ソースの先頭に記述
ノー・オペレーション
__nop
NOP
CA78K0Rは、#pragma NOP 指令をC ソー
スの先頭に記述
プロセッサの停止
__halt
HALT
STOP
CA78K0Rは、#pragma HALT、#pragma
STOP指令をC ソースの先頭に記述
飽和演算
__satadd
-
飽和減算
__satsub
-
ハーフワード・データのバイト・スワップ
__bsh
-
ワード・データのバイト・スワップ
__bsw
-
CA78K0Rでは、サポートされていない組み込み関数があります。
サポートされていない関数を使用した場合には、リンク時に、E3405エラーとなります。
移行後、他の組み込み関数をご使用するか、処理を実装してください。
詳細は、コンパイラユーザーズマニュアルを参照し変更してください。
19
© 2014 Renesas Solutions Corp.
 CA850とCA78K0Rの組み込み関数の違い(2)
CA850
CA78K0R
ワード・データのハーフワード・スワップ
__hsw
-
バイト・データの符号拡張
__sxb
-
ハーフワード・データの符号拡張
__sxh
-
mul 命令を用いて乗算結果の上位32ビット
__mul32
を変数に代入する命令
-
mulu 命令を用いて符号なし乗算結果の上
__mul32u
位32 ビットを変数に代入する命令
-
論理左シフト付きフラグ条件の設定
__sasf
備考
-
CA78K0Rでは、サポートされていない組み込み関数があります。
サポートされていない関数を使用した場合には、リンク時に、E3405エラーとなります。
移行後、他の組み込み関数をご使用するか、処理を実装してください。
詳細は、コンパイラユーザーズマニュアルを参照し変更してください。
20
© 2014 Renesas Solutions Corp.
マクロ
 CA850とCA78K0Rのマクロの違い(1)
CA850
__CA850
__CA850__
__v800
__v800__
__v850
__v850__
__v850e
__v850e__
__v850e2
__v850e2__
CPUマクロ名
「品種指定名」で示される文
字列の先頭と末尾に“__”を
付けたもの
CA78K0R
備考
__CA78K0R__
コンパイラ名称のマクロ
__K0R__
__RL78__
__RL78_1__
__RL78_2__
__RL78_3__
対象コアのマクロ
CPUマクロ名
「品種指定名」で示される文
対象CPUのマクロ
字列の先頭に”__”と末尾
に“_”を付けたもの
CA78K0Rでは、コア、マイコン、コンパイラ名称が違います。
条件コンパイルを指定する際に使用してください。
詳細は、コンパイラユーザーズマニュアルを参照し変更してください。
21
© 2014 Renesas Solutions Corp.
マクロ
 CA850とCA78K0Rのマクロの違い(2)
CA850
CA78K0R
__DATE__
__TIME__
__FILE__
__LINE__
__DATE__
__TIME__
__FILE__
__LINE__
__STDC__
__STDC__
__CHAR_SIGNED__
-
備考
__CHAR_UNSIGNED__ __CHAR_UNSIGNED__
__reg32__
__reg26__
__reg22__
__K0R_SMALL__
__K0R_MEDIUM__
__K0R_LARGE__
コンパイラのモードのマクロ
CA850:-regオプション
CA78K0R:-MS,-MM,-MLオプション
CA78K0Rでは、レジスタモード機能はなく、メモリモデル機能があります。
条件コンパイルを指定する際に使用してください。
詳細は、コンパイラユーザーズマニュアルを参照し変更してください。
22
© 2014 Renesas Solutions Corp.
株式会社ルネサス ソリューションズ
© 2014 Renesas Solutions Corp.