原因
これはご使用になっているコンパイラの最適化の問題によるものです。
(プログラム例)
char *booPtr = memory_address; while( *booPtr && !time_out ) time_out--; |
上記のようなループでは、変数が定数として最適化されてしまう場合があります。例えば、下記のように最適化されてしまいます。
char *booPtr = memory_address; while( !time_out ) time_out--; |
つまり、ループ内では *booPtr に対して演算をしていないため、コンパイラの最適化でこの変数は定数として扱われ、ループから外してしまうのです。
対策
ANSI-Cの規格にあるvolatileキーワードをつけて変数を宣言します。
これは、他のプロセスから変更される可能性のある変数を最適化しないようにコンパイラに知らせるものです。
上記の場合のポインタの宣言は以下のようにしてください。
volatile char *booPtr; /* ポインタで指している変数の値は 'volatile' */ |
こうすればループの最適化が行われても、"*booPtr" の値は毎回評価されます。