RENESAS TOOL NEWS 2008年10月16日 : 081016/tn8
| M32Cシリーズ用Cコンパイラパッケージ (M3T-NC308WA)
ご使用上のお願い |
M32Cシリーズ用 Cコンパイラパッケージ (M3T-NC308WA) の使用上の注意事項を連絡
します。
- Cコンパイラの拡張機能 #pragma DMAC を使用する場合の注意事項
M32Cシリーズは、M32C/80, M16C/80およびM16C/70シリーズの総称です。
1. 該当製品
M32Cシリーズ用Cコンパイラパッケージ (M3T-NC308WA)
V.5.00 Release 1 ~ V.5.41 Release 01
2. 内容
if文の副文中、もしくはifおよびelse文の副文中で、
拡張機能#pragma DMACで指示した変数に定数を代入した場合、その定数の値を
DMACレジスタへ書き込まない誤ったコードを生成することがあります。
2.1 発生条件
以下の条件をすべて満たす場合に発生します。
(1) #pragma DMACで指示した変数が存在する。
(2) else文を含まないif文の場合、if文の副文は、(1)の変数へ
整数定数を代入する式のみである。
else文を含むif文の場合、ifおよびelse文の副文は両方とも、(1)の変数へ
整数定数を代入する式のみである。
(3) (2)のif文に対して、STZX, STZ または STNZのいずれかの命令が生成
されている。
なお、if文の制御式の内容によっては、上記の命令が生成されないことが
あり、その場合には問題はありません。
2.2 発生例
------------------------------------------------------------------------
unsigned int dmd0;
#pragma DMAC dmd0 DMD0 /* 発生条件(1) */
/* elseのない場合の発生例 */
void exam1(int mode)
{
if (mode == 0) {
dmd0 = 0x00f0; /* 発生条件(2) */
}
}
/* elseがある場合の発生例 */
void exam2(int mode)
{
if (mode == 0) {
dmd0 = 0x0070; /* 発生条件(2) */
} else {
dmd0 = 0x00f0; /* 発生条件(2) */
}
}
------------------------------------------------------------------------
3. 回避策
該当箇所のif文の副文の最初に、ダミーのasm関数を挿入してください。
else文を含む場合もif文の副文に挿入するだけで十分です。
-------------------------------------------------------------------------
void exam2(int mode)
{
if (mode == 0) {
asm(); /* ここに asm(); を挿入してください。 */
dmd0 = 0x0070;
} else {
dmd0 = 0x00f0;
}
}
-------------------------------------------------------------------------
4. 恒久対策
次バージョンで改修する予定です。