自
- 自作のプロセス内で、マップしたメモリ上のポインタ経由でブール型入力変数の値をループしてスキャンしようとしています。
変数の値が変化しているはずなのに、ポインタの指している変数値が変化しない。
(プログラム例)
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" の値は毎回評価されます。 ... - 自作のプロセス内で、マップしたメモリ上のポインタ経由でブール型入力変数の値をループしてスキャンしようとしています。
変数の値が変化しているはずなのに、ポインタの指している変数値が変化しない。
(プログラム例)
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" の値は毎回評価されます。 ... - 自社製品のマニュアルなどの文書にISaGRAF Ver.4/5 の商標名を記載したいが、注意点はあるか?
下記のような文面を記載するようにしてください。 ISaGRAF Ver.4/5はICS Triplex ISaGRAF Inc.の登録商標です。 ... - 自作のプロセス内で、マップしたメモリ上のポインタ経由でブール型入力変数の値をループしてスキャンしようとしています。
変数の値が変化しているはずなのに、ポインタの指している変数値が変化しない。
原因 これはご使用になっているコンパイラの最適化の問題によるものです。 (プログラム例) 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" の値は毎回評価されます。 ... - 自作のプロセス内で、マップしたメモリ上のポインタ経由でブール型入力変数の値をループしてスキャンしようとしています。変数の値が変化しているはずなのに、ポインタの指している変数値が変化しない。
(プログラム例) 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 ; /* ... - 自作のプロセス内で、マップしたメモリ上のポインタ経由でブール型入力変数の値をループしてスキャンしようとしています。変数の値が変化しているはずなのに、ポインタの指している変数値が変化しない。 (プログラム例) 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" の値は毎回評価されます。 ... - 自作のプロセス内で、マップしたメモリ上のポインタ経由でブール型入力変数の値をループしてスキャンしようとしています。変数の値が変化しているはずなのに、ポインタの指している変数値が変化しない。
原因 これはご使用になっているコンパイラの最適化の問題によるものです。 (プログラム例) 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" の値は毎回評価されます。 ... - 自分で移植したアーキテクチャ用プロジェクトを作成するにはどうすればよいですか?
PRDKを用いて移植したアーキテクチャ用のプロジェクトを作成するには以下のようにしてください。 1. PRDKに収録されているTarget Difinition Builder(Windows用TDBuild.exe, PRDKのTdbuildディレクトリに収録)を用いて、ターゲット定義ファイルを作成する。 2. WorkBench内でプロジェクトを右クリックしてメニューを開き、「インポート」-> 「ターゲット定義をインポート」を選択、 エクスプローラーから"1."で作成したターゲット定義ファイルをインポートする。 3. コンフィグレーションのプロパティで "2."でインポートしたターゲットを選択する。 ...