10.58 __attribute__((bitband)) 型属性

__attribute__((bitband)) は、メモリアーキテクチャの SRAM 領域とペリフェラル領域にあるシングルビット値への効率的なアトミックアクセスを可能にする型属性です。

リードモディファイライトという従来のアプローチに依存せずに、特定のメモリ領域への 1 回のメモリアクセスで直接シングルビットをセットまたはクリアすることができます。また、従来の読み取りの後でシフトおよびマスク操作を使用しなくても、直接シングルビットを読み取ることもできます。
以下に、__attribute__((bitband)) の使用例を示します。
typedef struct{
  int i : 1;
  int j : 2;
  int k : 3;
} BB __attribute__((bitband));
BB bb __attribute__((at(0x20000004));
void foo(void)
{
  bb.i = 1;
}
メモリアクセスの幅に依存するペリフェラルの場合、ビットバンド構造体のビットフィールドの char 型、 short 型、および int 型には、エイリアス空間に対するバイト、ハーフワード、およびワードのストアまたはロードがそれぞれ生成されます。
以下の例では、bb.i のビットバンドアクセスが生成されます。
typedef struct{
  char i : 1;
  int j : 2;
  int k : 3;
} BB __attribute__((bitband));
BB bb __attribute__((at(0x20000004)));
void foo()
{
  bb.i = 1;
}
__attribute__((at())) を使用せずにビットバンド変数をビットバンド領域に格納する場合、別の方法を使用して再配置する必要があります。その場合は、適切なスキャッタロード記述ファイルを使用するか、リンカのコマンドラインオプション --rw_base を使用します。詳細については、『リンカリファレンス』を参照して下さい。

制約条件

次の使用制限があります。
  • この型属性は struct でのみ使用できます。共用体型、または共用体をメンバとして持つその他の集合型はビットバンド化できません。
  • 構造体のメンバは個別にビットバンド化できません。
  • ビットバンドアクセスは、シングルビットのビットフィールドでのみ生成されます。
  • const オブジェクト、ポインタ、およびローカルオブジェクトについては、ビットバンドアクセスは生成されません。
  • ビットバンディングが利用できるのは一部のプロセッサに限られます。例えば、Cortex-M3 や Cortex-M4 プロセッサが該当します。
関連する参考文書
8.17 --bitband
10.64 __attribute__((at(address))) 変数属性
関連情報
--rw_base=address(リンカオプション)
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.