用于从 H/W 寄存器读取的位字段

lin*_*eak 4 c bit-manipulation bitwise-operators unions bit-fields

我想从32位寄存器中读取第2位、第5位和第6位。我决定使用结构位字段来存储它们。下面的数据结构正确吗?

struct readData
{
    int unwanted:1;
    int reqbit1:1;
    int unwanted1:2;
    int reqbit2:2;
    int unwanted2:26;
};
Run Code Online (Sandbox Code Playgroud)

我不确定如何创建位字段。我将使用一个 API 将字节从 h/w 寄存器直接复制到该结构。在这种情况下,reqbit1 会包含第 2 位吗?根据我的理解,编译器将第一位分配给 int 变量,第二位分配给另一个 int 变量,因此 reqbit1 不会从寄存器读取任何数据。下面的union不是更适合这种情况吗?

union readData
{
    struct readBits
    {
        bool unwanted:1;
        bool reqbit1:1;
        xxx unwanted1:2;
        short reqbit2:2;
        xxx unwanted2:26;
    };

    int regValue;
};
Run Code Online (Sandbox Code Playgroud)

如果这是正确的,我应该将unknown2声明为什么?

Ale*_*lex 5

通常使用以下联合:

union readData {
   struct {
      unsigned int unwanted:1;
      unsigned int reqbit1:1;
      unsigned int unwanted1:2;
      unsigned int reqbit2:2;
      unsigned int unwanted2:26;
   } readBits;
   unsigned int regValue;
};
Run Code Online (Sandbox Code Playgroud)

编辑 :

用法是:

 #define REG_ADDRESS 0x12345678 // e.g.

 union readData* rd = (union readData*)REG_ADDRESS;

 char bit2 = rd->readBits.reqbit1;
 char bits56 = rd->readBits.reqbit2;
Run Code Online (Sandbox Code Playgroud)