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.
© Copyright 2024 ExpyDoc