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


(プログラム例)
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-07-31 13:50
改訂:
1.1
評価点数:0 (0 件の投票)
Chuck Norris has counted to infinity. Twice.

最も人気の FAQ RSS

  1. LD言語で、ある接点がFALSEの場合、それ以降のファンクションブロックを実行しないように出来るか? (44513 回の閲覧)
  2. SFC要素の「ステップ」と「トランジション」の意味と役割を教えてください。 (43415 回の閲覧)
  3. ISaGRAF WorkbenchをWindows 7で使用するにはどうしたらよいでしょうか? (40929 回の閲覧)
  4. ISaGRAFはIEC1131-3のシステム定義に準拠しているか? (38989 回の閲覧)
  5. PLCプログラムをより早く動かすにはどうすればよいですか? (38818 回の閲覧)
  6. LD言語で、立ち上がり・立ち下がりの出力はあるか? (36875 回の閲覧)
  7. VxWorksターゲットにおける変数管理の留意点について (36382 回の閲覧)
  8. 日立製作所製SHマイコン用コンパイラ使用時の注意事項 (35574 回の閲覧)
  9. Cファンクション/ファンクションブロックの"Hidden" パラメータとはどのようなものか (35525 回の閲覧)
  10. FBD/LD言語で同じ行に複数の演算がある場合の実行順序は? (33516 回の閲覧)

最近の FAQ RSS

  1. ファンクションブロックはネストできますか。 (2016-08-05 15:07)
  2. Cファンクション/ファンクションブロックの"Hidden" パラメータとはどのようなものか (2015-01-30 14:24)
  3. 前のISaGRAFで作成したプロジェクトをインポートしたら、コメントが文字化けを起こしています。 (2014-05-07 06:52)
  4. 前のバージョンで作成したプロジェクトは読み込めますか。 (2014-03-07 07:46)
  5. ISaGRAFでコンフィグレーション、リソースそれにPOUはそれぞれいくつ作成できますか。 (2014-03-07 02:06)