DSP 平塚エンジニアリング

TMS320C6713 Tips

DSP Guide

TMS320C6713 Tips



データ型について

TMS320C6000 C/C++ のデータ型は以下のようになっています。
サイズ 表 現 最 小 最 大
char、signed char 8ビット ASCII -128 127
unsigned char 8ビット ASCII 0 255
short 16ビット 2の補数 -32768 32767
unsigned short 16ビット 2進 0 65535
int、signed int 32ビット 2の補数 -2147483648 2147483647
unsigned int 32ビット 2進 0 4294967295
long、signed long 40ビット 2の補数 -549755813888 549755813887
unsigned long 40ビット 2進 0 1099511627775
long long、signed
long long
64ビット 2の補数 -9223372036854775808 9223372036854775807
unsigned long long 64ビット 2進 0 18446744073709551615
enum 32ビット 2の補数 -2147483648 2147483647
float 32ビット IEEE 32ビット 1.175494e-38† 3.40282346e+38
double 64ビット IEEE 64ビット 2.22507385e-308† 1.79769313e+308
long double 64ビット IEEE 64ビット 2.22507385e-308† 1.79769313e+308
ポインタ、参照、
データ・メンバを
指すポインタ
32ビット 2進 0 0xFFFFFFFF
† 数値は最小精度です。

●longは40ビットアクセスです。ご注意ください。
  32ビットアクセスを行いたい場合はintを使用してください。





プログラムは合っているのに正常に動かない!?

記述は明らかに間違っていないのに思ったとおりに動かない!
そんな時はありませんか?コンパイラの最適化が原因の場合が多くあります。
そのようなときにvolatileという修飾子を使います。
volatileはconstなどと同じ、型修飾子の一つです。PCなど汎用的なプログラムでは使うことはほとんどありませんが、メモリマップドIOなどにアクセスを行う組み込みプログラミングでは必須のキーワードです。 その役割はコンパイラの最適化を抑制するものです。

 例えば、外部IOのある0xA0000000番地に0x01をループで出力しようと思い、
while(1){
   *(int *)0xA0000000 = 0x05;
}
と記述したとします。このプログラムをCコンパイラの点からみると、
「0xA0000000に値を代入しているけど、参照はしていないや。無駄な処理なので削除してしまおう」と、最適化の対象になってしまいます。
 しかし、組み込みプログラマにとっては、0xA0000000番地に出力をするのが目的なので削除されては困ります。
 このような、場合volatileを使うことで、プログラマの意図どおりの動作を行うことができます。
while(1){
   *(volatile int *)0xA0000000 = 0x05;
}

このように、一目でわかり易い場合だけではなく、実際は思わぬところで最適化による不具合が起こる場合があります。プログラムの順番を変えたら動かなくなった!などの場合にはこの可能性が大いに考えられます。 動作がおかしいと思った場合、volatileを適宜使用すると良いと思います。また、コンパイラの最適化オプションのレベルを変えてみるというのも手かもしれません。



関連製品リンク
関連製品リンク
All Rights Reserved, Copyright (C) Hiratsuka Engineering Co.,Ltd. 2001-2023