Main Content

型修飾子 constvolatile を使用したグローバル データの保護

C では、アプリケーションのコードによって変数に新しい値が割り当てられないようにする場合、型修飾子 const を使用します。外部アクター (ハードウェア デバイスなど) による変数の値の操作が可能なアプリケーションでは、キーワード volatile を使用することで、コンパイラによるアセンブリ コードの最適化によって変数の値の整合性が損なわれないように防止できます。volatile を使用すると、実行時にパラメーターの値を調整する場合などに、const データのストレージがコンパイラで削除されないように防ぐこともできます。

  • 非バーチャル バスまたはパラメーター構造体を使用してカスタムの構造体を作成する場合など、モデル内の個々のデータ項目に修飾子を適用するには、該当する事前定義済みのストレージ クラスをデータ項目に直接適用します。ストレージ クラスを適用すると、[既定のパラメーター動作] などの最適化によってデータ項目のストレージが削除されなくなります。例については、型修飾子を参照してください。ストレージ クラスを直接適用することによる最適化の回避の詳細については、生成されたコードによる内部信号、状態、パラメーター データの保存方法を参照してください。

    事前定義済みのストレージ クラスが要件を満たさない場合は、独自のカスタム ストレージ クラスを作成できます。カスタム ストレージ クラスで修飾子を適用するには、カスタム ストレージ クラス デザイナーで、該当する組み込みのメモリ セクションまたは作成するメモリ セクションに対して [メモリ セクション] を設定します。詳細については、カスタム ストレージ クラス デザイナーを使用したストレージ クラスの作成を参照してください。

  • パラメーターや状態などのモデル データのカテゴリに既定で修飾子を適用できます。モデルにブロックを追加すると、それらのカテゴリの新しいデータ項目に指定した修飾子が継承されます。詳細については、Configure Default Code Generation for Dataを参照してください。

    事前定義済みのストレージ クラスが要件を満たさない場合は、Embedded Coder ディクショナリを使用して独自に作成できます。ディクショナリにおいて、新しいストレージ クラスについて [修飾子] の該当するチェック ボックスをオンにします。詳細については、Create Code Definitions for Use in the Code Mappings Editorを参照してください。

エントリポイント関数の引数における const の正確性を維持

生成されたエントリポイント関数を外部コードで呼び出し、その関数の引数 (仮パラメーター) を通じて const データを渡す場合、関数定義の対応する引数を const にするには、実行 (ステップ) エントリポイント関数インターフェイスをカスタマイズします。

生成された関数に volatile データを渡す際の不正確な結果や未定義の動作

モデルのエントリポイント関数以外の関数を生成コードで定義して呼び出すことができます。たとえば、Atomic サブシステムをコードに個別の関数として表示するように構成できます。また、n-D Lookup Table などのルックアップ テーブル ブロックは、一般に個別のユーティリティ関数になります。

生成コードで引数 (仮パラメーター) をもつ関数を定義する場合、関数定義では引数に volatile が適用されません。そのため、その関数を他の生成コードや外部コードで呼び出し、引数の値として volatile 変数を渡すと、呼び出された関数は暗黙的に不揮発性としてキャストします。

呼び出された関数をアプリケーションで実行する際に volatile データの値が変わっていると、不正確な結果や未定義の動作になることがあります。特に、キャリブレーション用にルックアップ テーブル データを準備する場合は、constvolatile を適用して、アプリケーションでのルックアップ ユーティリティの実行時にデータのキャリブレーションが行われないように注意してください。

関連するトピック