7.21 __at セクションの自動配置

__at セクションはリンカによって自動的に配置されますが、無効にすることができます。

__at セクションの自動配置はデフォルトで有効になっています。この機能を制御するには、リンカコマンドラインオプション --autoat を使用します。

__at セクションは、位置非依存の実行領域では使用できません。

--autoat オプションを使用してリンクするとき、 __at セクションはスキャッタロードセレクタによって配置されません。代わりに、リンカによって __at セクションは互換領域に配置されます。互換領域が見つからない場合は、__at セクションのロード領域と実行領域が作成されます。

リンカの --autoat オプションによって作成された実行領域はすべて UNINIT スキャッタロード属性を持ちます。ZI __at セクションをゼロで初期化する必要がある場合、このセクションは互換領域内に配置する必要があります。リンカの --autoat オプションによって作成された実行領域のベースアドレスは少なくとも 4 バイト境界で整列されている必要があります。領域が正しく整列されていない場合は、リンカのエラーメッセージが生成されます。

互換領域とは、以下のような領域です。

  • __at のアドレスが実行可能領域のベースおよびリミットの範囲内にある。ここで、リミットはベースアドレスに実行領域の最大サイズを加えた値です。最大サイズが設定されていない場合、__at セクションの配置リミットは __at セクションを含まない実行領域の現在のサイズに定数を加えた値に設定されます。この定数のデフォルト値は 10240 バイトですが、--max_er_extension コマンドラインオプションを使用して変更できます。

  • 実行領域は、以下の条件を少なくとも 1 つ満たします。

    • 標準的なスキャッタロード規則によって __at セクションを一致させるセレクタがある。

    • __at セクションと同じ種類(RO、RW、または ZI)のセクションが少なくとも 1 つある。

    • EMPTY 属性がない。

      リンカでは、種類が RW の __at セクションは、RO と互換性があると見なされます。

以下の例は、種類が RO のセクション .ARM.__at_0x0000 、種類が RW のセクション .ARM.__at_0x2000 、 種類が ZI のセクション .ARM.__at_0x4000 、および種類が ZI のセクション .ARM.__at_0x8000 を使用して実現される C または C++ コードでの変数の手動配置を示しています。

// RW 変数を .ARM.__at_0x02000 という名前のセクションに配置する int foo __attribute__((section(".ARM.__at_0x2000"))) = 100; // ZI 変数を .ARM.__at_0x04000 という名前のセクションに配置する int bar __attribute__((section(".ARM.__at_0x4000"), zero_init)); // ZI 変数を .ARM.__at_0x8000 という名前のセクションに配置する int variable __attribute__((section(".ARM.__at_0x8000"), zero_init));

The following scatter file shows how the placement of __at sections is achieved automatically:

LR1 0x0 {     ER_RO 0x0 0x2000     {         *(+RO)      ; .ARM.__at_0x0000 は ER_RO の範囲内にある     }     ER_RW 0x2000 0x2000     {         *(+RW)      ; .ARM.__at_0x2000 は ER_RW の範囲内にある     }     ER_ZI 0x4000 0x2000     {         *(+ZI)      ; .ARM.__at_0x4000 は ER_ZI の範囲内にある     } } ; __at セクション .ARM.__at_0x8000 は対象となるすべての領域の範囲外にあるため ; そのロード領域と実行領域がリンカによって作成される。
関連する概念
7.19 特定のアドレスに __at セクションの配置
7.22 __at セクションの手動配置
7.23 __at セクションを使用したフラッシュメモリでのキーの配置
8.6 実行領域の記述
7.18 __attribute__((section("name"))) を使用したコードとデータの配置
7.20 __at セクションの配置に関する制限
関連する作業
7.24 __at セクションを使用したペリフェラルレジスタに対する構造のマッピング
関連する参考文書
12.10 --autoat、--no_autoat
12.119 --ro_base=address
12.123 --rw_base=address
12.171 --xo_base=address
12.175 --zi_base=address
8.8 実行領域の属性
12.97 --max_er_extension=size
非機密扱いPDF file icon PDF 版ARM DUI0474JJ
Copyright © 2010-2013 ARM.All rights reserved.