7.10 ルート実行領域と FIXED 属性

スキャッタファイルで実行領域の FIXED 属性を使用して、ロードアドレスと実行アドレスを固定したルート領域を作成できます。

FIXED 実行領域属性を使用して、特定の領域のロードアドレスと実行アドレスに同じアドレスを指定します。

FIXED 属性を使用して、ROM 内の特定のアドレスに任意の実行領域を配置できます。

例えば、以下のメモリマップは固定実行領域を示しています。

図 7-3 固定実行領域のメモリマップ
この図を表示するには、ご使用のブラウザが SVG 形式をサポートしている必要があります。ネイティブでサポートしているブラウザをインストールするか、次のような適切なプラグインをインストールします。Adobe SVG Viewer。.

以下の例では、対応するスキャッタロード記述を示しています。

LR_1 0x040000              ; ロード領域を 0x40000 から開始する    {                          ; 実行領域の開始位置の記述           ER_RO 0x040000         ; load address = execution address     {         * (+RO)            ; init.o 以外の RO セクション     }     ER_INIT 0x080000 FIXED ; この実行領域のロードアドレスと                            ; 実行アドレスが 0x80000 に固定される     {         init.o(+RO)        ; init.o のすべての RO セクション     }
    …                    ; 残りのスキャッタロード記述 }

この属性を使用して、関数または定数テーブルやチェックサムなどのデータブロックを ROM 内の固定アドレスに配置することで、ポインタを使用して容易にアクセスできます。

初期化コードを ROM の最初に配置し、チェックサムを ROM の最後に配置するような場合には、メモリの一部が使用されない可能性があります。 * または .ANY モジュールセレクタを使用することで、初期化ブロックの最後とデータブロックの最初の間にある領域を充填できます。

コードの保守とデバッグを容易にするには、スキャッタファイル内での配置に関する指定を最小限に抑え、関数とデータの詳細な配置はリンカに委ねることを推奨します。

FIXED 属性と 1 つのロード領域を使用することが適切ではない場合があります。固定位置の指定に関しては以下のような方法もあります。

  • ローダで複数のロード領域を処理できる場合には、RO コードまたはデータを専用のロード領域内に配置します。

  • 関数またはデータを ROM 内の固定位置に配置する必要がない場合には、 FIXED 属性の代わりに ABSOLUTE 属性を使用します。この属性を使用すると、ローダはロード領域から RAM 内の指定されたアドレスにデータをコピーします。 ABSOLUTE がデフォルトの属性です。

  • メモリマップされた I/O の位置にデータ構造を配置するには、2 つのロード領域を使用して UNINIT 属性を指定します。UNINIT を指定すると、そのメモリ位置はゼロで初期化されません。

FIXED 属性の誤った使用を示す例

以下の例では、FIXED 実行領域属性の誤った使用の一般的な事例を示しています。

LR1 0x8000 {     ER_LOW +0 0x1000     {         *(+RO)     } ; この時点で、次の使用可能なロードアドレスと実行アドレスが 0x8000 + ; ER_LOW の内容のサイズになります。最大サイズは 0x1000 に制限されているため、次の使用可能なロードアドレスと ; 実行アドレスは最大で 0x9000 になります。     ER_HIGH 0xF0000000 FIXED     {         *(+RW+ZI)     } ; 必要な実行アドレスとロードアドレスは 0xF0000000 です。ロードアドレスと ; 実行アドレスが一致するように、リンカによって 0xF0000000 - (0x8000 + (ER_LOW) のサイズ) バイトの ; パディングが挿入されます。} ; その他の FIXED の誤った使用の一般的な事例として、次の使用可能なロードアドレスよりも ; 下位の実行アドレスを指定することがあります。LR_HIGH 0x100000000 {     ER_LOW 0x1000 FIXED     {         *(+RO)     } ; LR_HIGH の次の使用可能なロードアドレスは 0x10000000 です。必要な実行 ; アドレスは 0x1000 です。LR_HIGH の次の使用可能なロードアドレスは単調に ; 増加させる必要があるため、リンカは ER_LOW に 0x10000000 よりも下位のロードアドレスを指定できません。}
関連する概念
8.6 実行領域の記述
関連する参考文書
8.5 ロード領域の属性
8.8 実行領域の属性
8.9 ロード領域と実行領域のアドレス属性
非機密扱いPDF file icon PDF 版ARM DUI0474JJ
Copyright © 2010-2013 ARM.All rights reserved.