• 検索結果がありません。

組み込み C++ モードの有効化(-pe オプション)

コンパイラは、C++ のサブセットである、組み込みシステム・プログラミング用の 組み込み C++ のコンパイルをサポートします。組み込み C++ 規格では、組み込みシ ステムでサポートするにはあまり価値がない機能やコストがかかり過ぎる一部の機 能は省略しています。組み込み C++ 用にコンパイルする場合、コンパイラは省略さ れた機能を使用するための診断情報を生成します。

組み込み C++ を有効にするには、-pe コンパイラ・オプションを指定してコンパイ ルします。

組み込み C++ は、以下の C++ 機能を省略します。

❏ テンプレート

❏ 例外処理

❏ ランタイム型情報

❏ 新しいキャスト構文

❏ キーワード mutable

❏ 多重継承

❏ 仮想継承

組み込み C++ の標準定義では、namespace および using 宣言がサポートされていませ ん。しかし、TMS320C28x コンパイラでは、組み込み C++ でこれらの機能が使用で きます。これは、C++ ランタイムサポート・ライブラリがそれらの機能を利用する からです。さらに、これらの機能は、実行時にペナルティを課しません。

TMS320C28x コンパイラは、組み込み C++ のコンパイル用に _embedded_cplusplus マ

クロを定義しています。

コンパイラに付属している rts.src ライブラリは、組み込み C++ 用にコンパイルされ たモジュールとリンクするために使用することができます。

データ型

6.4 データ型

次の情報がデータ型に適用されます。

❏ すべての整数型(char、short、int、およびその符号なし)は同じ型であり、16 ビット・バイナリ値として表されます。

❏ long および unsigned long 型は、32 ビット・バイナリ値として表されます。

❏ long long および unsigned long long 型は、64 ビット・バイナリ値として表されます。

❏ signed 型は、2 の補数表記で表されます。

❏ char 型は signed 型で、int と同じです。

❏ enum 型のオブジェクトは 16 ビット値として表されます。式の中では、enum 型

は int と同じです。

❏ float と double 浮動小数点型は同じで、IEEE 単精度フォーマットとして表されま

す。

❏ long double 浮動小数点型は、IEEE 倍精度フォーマットとして表されます。

各スカラー・データ型のサイズ、表現、および範囲を表 6-1 に示します。

範囲値の多くは、ヘッダ・ファイル limits.h 内で標準マクロとして使用できます。こ のファイルは、コンパイラに付属しています。詳細は、6.14 節「コンパイラの限界」

(6-38 ページ)を参照してください。

データ型

表 6-1. TMS320C28x C のデータ型

: TMS320C28x のバイトは 16 ビット

範囲

型 サイズ 表現 最小 最大

char、signed char 16 ビット ASCII -32768 32767

unsigned char 16 ビット ASCII 0 65535

short 16 ビット 2 の補数 -32768 32767

unsigned short 16 ビット バイナリ 0 65535

int、signed int 16 ビット 2 の補数 -32768 32767

unsigned int 16 ビット バイナリ 0 65535

long、signed long 32 ビット 2 の補数 -2147483648 214783647

unsigned long 32 ビット バイナリ 0 4294967295

long long、

signed long long

64 ビット 2 の補数 -9223372036854775808 9223372036854775807

unsigned long long 64 ビット バイナリ 0 18446744073709551615

enum 16 ビット 2 の補数 -32768 32767

float 32 ビット IEEE 32 ビット 1.19209290e-38 3.4028235e+38

double 32 ビット IEEE 32 ビット 1.19209290e-38 3.4028235e+38

long double 64 ビット IEEE 64 ビット 2.22507385e-308 1.79769313e+308

pointers 16 ビット バイナリ 0 0xFFFF

far pointers 22 ビット バイナリ 0 0x3FFFFF

数字は最小精度。

データ型

6.4.1 64 ビット整数のサポート

現在、TMS320C28x コンパイラは long long および unsigned long long データ型をサ ポートしています。範囲値は、ヘッダ・ファイル limits.h 内で標準マクロとして使用 できます。

long long データ型は、レジスタのペアで格納されます。メモリ内では、ワード(32 ビット)で位置合わせされたアドレスに 64 ビット・オブジェクトとして格納されま す。

long long 型の整数定数は、接尾部 ll または LL が付いています。この接尾部がない

と、定数の値が定数の型を決定します。

C 入出力で long long の書式化規則は、書式文字列では ll が必要です。たとえば次の とおりです。

printf("%lld", 0x0011223344556677);

printf("%llx", 0x0011223344556677);

ランタイムサポート・ライブラリ関数 llabs()、strtoll()、および strtoull() が追加され ています。

6.4.2 C28x long double 浮動小数点型による変更

TMS320C28x 専用の C/C++ コードをコンパイルする場合、long double 浮動小数点型

は現在 IEEE 64 ビット倍精度です。書式を変更する浮動小数点型は他にはありませ

ん。 つまり、次のようになります。

C28x の浮動小数点型

型 フォーマット

float IEEE 32 ビット単精度

double IEEE 32 ビット単精度

long double IEEE 64 ビット倍精度

データ型

long double 型の 64 ビット IEEE 倍精度フォーマットへの変更に対応するため、C28x

呼び出し規則が変更されました。

すべての long double 型の引数は、参照渡しされます。long double 型の戻り値は、参 照によって戻されます。最初の 2 つの long double 型の引数は、XAR4 と XAR5 にそ れぞれのアドレスを渡します。他のすべての long double 型の引数は、スタックにア ドレスをセットして渡されます。これらの long double 型のアドレスは far メモリに 置かれると想定することが必要です。したがって、呼び出された関数は、long double 型の引数のアドレスに対して常に 32 ビットを読み出します。

関数が long double の値を戻す場合、その呼び出しを行う関数は戻りアドレスを

XAR6 に配置します。たとえば次のとおりです。

long double foo(long double a, long double b, long double c) {

long double d = a + b + c;

return d;

}

long double a = 1.2L;

long double b = 2.2L;

long double c = 3.2L;

long double d;

void bar() {

d = foo(a, b, c);

}

関数 bar() では、foo() の呼び出し時に、レジスタ値は次のようになります。

必要な long double 型の算術演算子および変換関数を含むように、ランタイムサポー ト・ライブラリはアップデートされています。すべての C27x/C28x 浮動小数点ラン タイムサポート・ルーチンには、アップデートされた名前があります。たとえば、以 前の浮動小数点呼び出しの加算ルーチンは、次のようなものでした。

レジスタ 等しくなる値

XAR4 a のアドレス

XAR5 b のアドレス

*-SP[2] c のアドレス

XAR6 d のアドレス

レジスタ変数