未初期化データがゼロで初期化されないようにする方法

ANSI C の仕様では、明示的に初期化されていない静的データはゼロで初期化されることになっています。したがって、デフォルトでは、コンパイラはゼロで初期化されたデータと未初期化データを同じ ZI データセクションに配置します。このセクションには、C ライブラリ初期化コードによっ実行時にゼロが設定されます。

そのデータを別のセクションに配置することで、未初期化データがゼロで初期化されないようにすることができます。そのためには、#pragma arm section を使用するか、--gnu を使用してコンパイルする際に GNU 属性 __attribute__((section("name"))) を使用します。

Example 40. #pragma arm section を使用した未初期化データの保持

#pragma arm section zidata = “non_initialized”
int i, j; // 未初期化データを non_initialized セクションに配置(プラグマを指定しない場合、
             デフォルトで .bss セクションに配置される)
#pragma arm section zidata // デフォルト(.bss セクション)に戻す
int k = 0, l = 0; // ゼロで初期化されたデータを .bss セクションに配置

さらに non_initialized セクションを独自の UNINIT 実行領域に配置:

LOAD_1 0x0
{
  EXEC_1 +0
  {
    * (+RO)
    * (+RW)
    * (+ZI) ; ZI データをゼロで初期化
  }
  EXEC_2 +0 UNINIT
  {
    * (non_init) ; ZI データをゼロで初期化しない
  }
}

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0472EJ
Non-ConfidentialID081711