RENESAS TOOL NEWS 2008年06月16日 : 080616/tn4
| M16Cファミリ用Cコンパイラパッケージ ご使用上のお願い --ビット単位のand演算子でvolatile修飾した変数を 使用する際の注意事項 |
M16Cファミリ用Cコンパイラパッケージの使用上の注意事項を連絡します。
- ビット単位のand演算子でvolatile修飾した変数を使用する際の注意事項
1. 該当製品
(1) R32C/100シリーズ用Cコンパイラパッケージ V.1.01 Release 00
(2) M32Cシリーズ*1用Cコンパイラパッケージ(M3T-NC308WA)
V.1.00 Release 1 ~ V.5.41 Release 01
(3) M16Cシリーズ用*2Cコンパイラパッケージ(M3T-NC30WA)
M3T-NC30WA V.3.10 Release 1 ~ V.5.44 Release 00
*1 M32C/80、M16C/80、およびM16C/70シリーズの総称です。
*2 M16C/60、/30、/20、/10、/Tiny、およびR8C/Tinyシリーズの総称です。
2. 内容
volatile修飾した変数と1ビットのみ立っている2の累乗定数とのビット単位の
and演算結果で条件分岐すると、volatile修飾している変数の一部をアクセス
しないことがあります。
2.1 発生条件
以下の条件をすべて満たす場合に発生します。
(1) オプション -O[1-5]、-OR、および -OSのいずれかを使用している。
(2) volatile修飾された変数がある。
(3) if文の制御式で、(2)の変数と定数とのビット単位のand演算をしている。
(4) (3)のand演算で使用する定数は、1ビットのみ1である(2の累乗である)。
2.2 発生例
------------------------------------------------------------------------
#pragma BIT v
extern volatile unsigned int v;
extern unsigned int i, j;
void func(void)
{
if (v & 0x0004U) { // btst 02H,_v を生成、バイトアクセスする
i = j;
}
j = 0;
}
------------------------------------------------------------------------
3. 回避策
volatile変数を直接and演算に使用せずに、一時変数を作成しvolatile変数
の内容をロードし、一時変数と定数でand演算をしてください。
------------------------------------------------------------------------
#pragma BIT v
extern volatile unsigned int v;
extern unsigned int i, j;
void func(void)
{
unsigned int tmp; // 一時変数を作成
tmp = v; // ワードアクセス
if (tmp & 0x0004U) { // 一時変数とand
i = j;
}
j = 0;
}
------------------------------------------------------------------------
4. 恒久対策
次バージョンで修正する予定です。