直接在GCC中访问联合元素

tkqqtvp1  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(154)

使用IAR编译器,可以定义匿名联合,如下所示:

typedef struct
  {
    unsigned char no0:1;
    unsigned char no1:1;
    unsigned char no2:1;
    unsigned char no3:1;
    unsigned char no4:1;
    unsigned char no5:1;
    unsigned char no6:1;
    unsigned char no7:1;
  } __BITS8;

__saddr __no_init volatile union
{
  unsigned char P0;
  __BITS8       P0_bit;
} @ 0xFFF00;

并且可以直接访问P0或P0_bit:

P0 = 0x80;

由于它们具有相同的地址,因此会更改另一个变量:

P0_bit.no7 == 1 // returns true

我的问题是,如果在GCC中有这样的可能性,但是没有绝对寻址,基本上我只需要有两个变量P0和P0_bit共享同一个地址。

gkn4icbw

gkn4icbw1#

我认为你所寻求的可以这样实现:

union {
    struct {
        unsigned char bitone:1;
        unsigned char bittwo:1;
        unsigned char bitthree:1;
        unsigned char bitfour:1;
        unsigned char bitfive:1;
        unsigned char bitsix:1;
        unsigned char bitseven:1;
        unsigned char biteight:1;
    } bits;
    unsigned char byte;
}

这里的位序列和字节是在一个联合体中,所以它们仍然占用相同的内存。注意,这个例子没有使用任何typedef 'ing,也没有定义任何结构或联合体类型名。如果你愿意,你仍然可以这样做。
附言:你不应该在你的typedef中使用__BITS8作为名字;这是一个保留的标识符。

相关问题