モジュールの整合性チェック
ここでは、ランタイムモデル属性の概念について概要を説明します。これは、IARが提供するツールで使用されるメカニズムで、アプリケーションにリンクされているモジュールに互換性があること、つまり互換性のある設定を使用してビルドされていることを確認します。ツールでは、定義済のランタイムモデル属性のセットを使用します。これらに加えて、互換性のないモジュールが一緒に使用されないようにするため、独自のものを定義することができます。
注記
定義済の属性のほかに、AEABIランタイム属性に対しても互換性がチェックされます。これらの属性は、主にオブジェクトコードの互換性を対象にします。コンパイル設定を反映して、ユーザ設定はできません。
ランタイムモデル属性
ランタイム属性は、名前付きのキーと対応する値のペアで構成されます。一般的に、2つのモジュールの両方で定義されている各キーの値が同一の場合にのみ、これらのモジュールをリンクできます。
属性の値が*の場合は、その属性は任意の値に一致します。これをモジュールで指定して、整合性プロパティが考慮されていることを示すことができます。これにより、モジュールがその属性に依存しないことが保証されます。
注記
IARの定義済ランタイムモデル属性の場合、リンカはいくつかの方法でそれらをチェックします。
例
以下の表では、オブジェクトファイルでcolorとtasteの2つのランタイム属性を定義可能であること(ただし必須ではない)が示されています。
オブジェクトファイル | 色 | taste |
|---|---|---|
|
| 未定義 |
|
| 未定義 |
|
|
|
|
|
|
|
|
|
この場合は、file1は、ランタイム属性colorが他のファイルと一致しないため、他のファイルとはリンクできません。また、file4とfile5は、tasteランタイム属性が一致しないため、一緒にリンクすることはできません。
一方で、file2とfile3は互いにリンクできます。file4またはfile5のどちらかとはリンクできますが、両方とリンクすることはできません。
ランタイムモデル属性の使用
他のオブジェクトファイルとのモジュール整合性を保証するには、#pragma rtmodelディレクティブを使用して、ランタイムモデル属性をC/C++ソースコードに指定してください。たとえば、2つのモードで実行できるUARTがある場合は、uartなどのランタイムモデル属性を指定できます。モードごとに、mode1、mode2などのように値を指定します。UARTが特定のモードであることを前提とする各モジュールで、これを宣言する必要があります。モジュールの1つは以下のようになります。
#pragma rtmodel="uart", "mode1"または、rtmodelアセンブラディレクティブを使用して、ランタイムモデル属性をアセンブラソースコードに指定することもできます。以下に例を示します。
rtmodel "uart", "mode1"注記
先頭に2つの下線を持つ名前は、コンパイラで予約済です。ランタイムモデル属性の指定に関する詳細は、rtmodelおよびアセンブラディレクティブRTMODELのリファレンス文書(モジュール制御ディレクティブ)を参照してください。
リンカは、ランタイム属性が衝突するモジュールが同時に使用されないようにすることで、リンク時にモジュール整合性をチェックします。衝突が検出された場合は、エラーが発生します。