自作のプロセス内で、マップしたメモリ上のポインタ経由でブール型入力変数の値をループしてスキャンしようとしています。変数の値が変化しているはずなのに、ポインタの指している変数値が変化しない。


原因
これはご使用になっているコンパイラの最適化の問題によるものです。

(プログラム例)

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" の値は毎回評価されます。
最終更新:
2008-08-01 13:27
改訂:
1.0
評価点数:0 (0 件の投票)
Chuck Norris has counted to infinity. Twice.

このカテゴリー内のレコード

タグ