カスタマーサポートセンター

FAQ~よくある質問~ | FAQマスタ詳細表示

FAQ詳細情報

ID 10810630
FAQカテゴリ(大) リンカ
最終更新日 2016-03-26

質問内容

TN75313: 隣接する変数

回答内容

ターゲット:ARM
コンポーネント:リンカ
公開日:2012年8月15日11時45分


概要
このテクニカルノートは、「構造体」を作ることが現実的ではない場合に、強制的に一定の順序でRAMに配置する方法に焦点を当てています。

サンプルプロジェクトは、Example project (ContiguousVariables).zip ファイルにあります。

問題 1
#pragma location を使用すると変数を特定のセクションに配置することができますが .map ファイルを見ると、書いた順と違う順に配置されます。

解決策 1
変数の配置順序を固定するには、変数を別々のセクションに置き、fixed order block と宣言し、 変数の配置順序、すなわちセクションの順序を定義します。

fixed order block は、やはり、勝手な場所に置かれますが、ブロックの配置のリンカディレクティブを用いることで、配置される場所を制御することができます。

1st、2nd、3rd という名の分割されたセクションに置かれた変数のある Cソースプログラム、

int ab[]   @ 1st = {1, 2, 3, 4, 5, 6, 7, 8};
int a[]    @ 2nd = {1, 2, 3, 4, 5 };
int abc[]  @ 3rd = {1, 2, 3, 4, 5, 6, 7};

 

変数が置かれたセクションの配置順序を定義する、リンカ設定ディレクティブの例

define block ARRAYS with fixed order
{
 section 1st,
 section 2nd,
 section 3rd
};

place in RAM_region { first block ARRAYS, readwrite, ... };

// first blockディレクティブにより、ブロックが RAM_region の初めに置かれます

 

問題 2
上の例のセクション 2nd の代わりに、予備のスペースを1st と 3rd の間に置く.

 


解決策 2
変数と変数の間に配置するブロックを定義し、keep リンカディレクティブを使用し、このブロックが出力ファイルに含まれるようにします。

上のサンプルの .icf ファイルを編集し、以下のリンカディレクティブわ使用します。

define block RESERVED_SPACE with alignment = 8, size = 1024 { };

define block ARRAYS with fixed order
{
  section 1st,
  block RESERVED_SPACE,
  section 3rd
};

keep { block RESERVED_SPACE };

 

全ての製品の名前は、それぞれの所有者の商標または登録商標です。

参考資料URL