いつもお世話になっております。
以下のようなプログラムで、loop1()はwhileを抜けられず復帰しないのですが、 loop2()は、正しく復帰します。
loop1と、loop2の違いは、Delay()を呼ぶか、呼ばないかの違いしか有りません。
タイマー割り込みによりTimerは、0になります。 (Flagは0のままとします。)
多分?ループ最適化による影響ではないかと思うのですが、コンパイルオプションを替えても状況は変わりません。
どの様なオプションが影響するか お教え願えないでしょうか?
int Flag ;int Timer;
void Delay( void ) { asm("NOP"); }
void Interrupt_1ms( void ) { if ( Timer > 0 ) Timer--; }
int loop1( void ) { Flag = 0; Timer = 100; while(1) { if ( Flag ) break; if ( Timer == 0 ) { return( 1 ); } } return( 0 ); }
int loop2( void ) { Flag = 0; Timer = 100; while(1) { Delay(); // 重要 if ( Flag ) break; if ( Timer == 0 ) { return( 1 ); } } return( 0 ); }
にもち さん、こんにちは。NoMaYです。お久しぶりです。コンパイラは何をお使いですか? RZに関して質問されていることが多いようですので、GNUARMかIAR ARM C/C++コンパイラでしょうか?[追記]あと、割り込みルーチンで更新される変数Timerにvolatileが付いていませんが、今回の質問用に付けなかったものですか? それとも、普段から付けないでいたりしますか?
にもち さん、こんにちは。NoMaYです。私の追記が行き違ったかな、という予感がするので自己レスです。これは移植元のSH4用のソースに付いていなかったから、かな、、、という気がしてきました、、、> [追記]> あと、割り込みルーチンで更新される変数Timerにvolatileが付いていませんが、今回の質問用に付けなかったものですか? それとも、普段から付けないでいたりしますか?
> GCCでは変数のオプションとしては以下のものがありますね
大昔に廃止になってるので今使える状況は稀でしょう。
https://www.gnu.org/software/gcc/gcc-3.4/changes.html> GCC no longer accepts the options -fvolatile, -fvolatile-global and -fvolatile-static. It is unlikely that they worked correctly in any 3.x release.