这是一个远射,但也许会有一些想法。在我编程的系统中,我定义了结构来编程处理器寄存器。寄存器由几个位组成,每个位都有几个位,其间可能有“保留”位。写入寄存器时,保留位必须写为零。如何将预定义的值赋给类型定义上的结构成员?
例如:
typedef struct {
uint32_t power : 3;
uint32_t reserved : 24;
uint32_t speed : 5;
} ctrl_t;
void set_ctrl()
{
ctrl_t r = {
.power = 1;
.speed = 22;
.reserved = 0;
}
uint32_t *addr = 0x12345678;
*addr = *((uint32_t *) &r);
return;
}
我希望能够给reserved
字段设置为(在本例中为0)的默认值,并腾出一个明确的赋值需要(发生了很多我们的系统)。
注意,如果实例化的对象是静态的,则默认情况下未初始化的字段将是0。然而,在上面的例子中,没有保证的,也是我需要设置任意值。
恐怕你不能。如果你的变量不是静态的,那么你需要明确地初始化它。 –
关于位域的特定布局不能保证。如果你需要,他们不是一个好主意。改用'unit32_t'和shift/masking。你施放调用未定义的行为;你必须以不同的类型访问一种类型的对象!阅读有效类型(aka严格别名)规则。 – Olaf
@Olaf - 在给定的实现(我们的嵌入式开发环境)中,行为应该被很好地定义(因为它恰好是)。我使用all-'uint32_t'结构的事实确保了这些字段是右对齐的,并且该结构的大小恰好是32位。 – ysap