Renesas Synergy™

FAQ 104085 : for文などループ処理から、条件を満たしてもループを抜けません。

回答

最適化などの処理により条件に指定している変数に最適化がかかり、ループから抜けない事が考えられます。
外部変数に対して最適化を抑止するvolatile指定が必要になります。
以下に例を示します。

(例)
char c=0;
void sub(void)
{ for(;;)
{ if(c==1) break; //割り込みでc=1になるまでループ }
}
アセンブラ出力
[volatile指定なしの場合] (c=1になってもループを抜けない例)
_sub   6A2800FFE424     MOV.B  @_c:32,R0L
00000842 A801        CMP.B   #H'01,R0L
00000844 46FC        BNE    @H'0842:8 <-新規に参照を行わない
00000846 5470        RTS   
[volatile指定ありの場合] (c=1でループを抜ける例)
_sub   6A2800FFE424     MOV.B  @_c:32,R0L
00000842 A801        CMP.B   #H'01,R0L
00000844 46F6        BNE    @_sub:8  <-その都度参照を行う
00000846 5470         RTS 

外部変数に対して最適化を抑止するには下記のいずれかの設定して下さい。

  • 変数宣言時にvolatile宣言を行う。 (任意の外部変数対象)
  • コンパイラオプション"Volatile"指定を行う。 (すべての外部変数対象)

適用製品

SuperHファミリ用C/C++コンパイラパッケージ
H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージ
他にご質問がございましたら、リクエストを送信してください