データ型について
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を適宜使用すると良いと思います。また、コンパイラの最適化オプションのレベルを変えてみるというのも手かもしれません。
|