1

私は C のチュートリアル (フランス語) を読んでいて、段落でビットフィールドについて話しています。

struct register {
   unsigned int mask : 3;
   signed int privilege : 6;
   unsigned int : 6; /* not used */
   unsigned int ov : 1;
};
  1. メモリレベルでのこの定義の結果は何ですか?

  2. この例の構造に名前を付けた教育上の理由はありますかregister(これはエレクトロニクスを思い起こさせます)。

  3. 例で「未使用」とコメントされているようなメンバーを誰かが宣言するのはなぜですか?

  4. この構造の実際の利点は何ですか?

  5. ビット フィールドにアドレスがないのはなぜですか? これはレジスターの仕様と一致しますか?

4

2 に答える 2

2

これは、モジュールのレジスタを作成するハードウェアで特に役立ちます。

現在、Registerさまざまbit-fieldsなサイズのbits. Registerしたがって、とを表す構造を作成しますbit-fields。基本的にハードウェアのレジスタは、モジュールに関する情報を格納する構造です。

たとえば、USB モジュールの場合、USB ハードウェア内のレジスタは、USB デバイスのステータスやその他多くの情報を保存します。

メモリの占有量が非常に少ないため、 のために予約するのではなく、struct内のデータ メンバーの長さを制限します。bitsuints(or any other primitive data types)bit-fields

また、ダミー宣言 unsigned int : 6;を使用して構造体をパディングし、構造体オブジェクトとアクセスがword alignedマシン アーキテクチャに従っているようにします。したがって、アクセスがプロセッサのワード境界に整列されている場合、レジスタ オブジェクトへのアクセスはより多くの時間を消費しません。基本的に、ワード、ハーフワード、またはバイトが、プロセッサのワードサイズの倍数であるアドレスに配置されている場合、一度に非常に効率的にアクセスできます。

たとえば、あなたのケースでRegisterは、16-bitsマスク、特権、および ov の 3 つのビットフィールドがあります。残り6-bitsは将来の使用のために予約されています。これがどのようRegisterに見えるかです、

bit-position     15  14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
                ---------------------------------------
                |ov |    reserved    | privilege |mask|
                ---------------------------------------

したがって、サイズが 16 ビットの構造体を作成することにより、この構造体のオブジェクトは、8、16、32 ....ビット ALU を備えたプロセッサで簡単にアクセスできます。

于 2013-08-15T08:40:13.727 に答える
1

問題のような構造を使用できる場所の 1 つの例は、ハードウェアレジスタのビットをエミュレートすることです (これは、名前から判断すると、この構造を使用する可能性が高いです)。

多くの小規模で組み込み可能なシステムでは、メモリ内で直接アドレス指定可能なハードウェア レジスタが存在する可能性があるため、このような構造を使用して、これらのレジスタ内のビットに直接アクセスできます。

于 2013-08-15T08:35:34.247 に答える