在一个句子中调整多个寄存器中的相同位

时间:2011-11-19 10:22:29

标签: c embedded

我想知道是否可以使用C中的一个句子打开多个寄存器中的第1位。 我得到了灵感here。我通常会在2个寄存器寄存器中打开第1位,如下所示:

#define REG_NAME1 (*((volatile unsigned int *) 0x130031D4))
#define REG_NAME1 (*((volatile unsigned int *) 0x130031D4))
#define BIT1 0x1

REG_NAME1 |= 0x1;
REG_NAME2 |= 0x1;

但在这里我使用了2个句子。我怎么做1?我只是好奇。

最诚挚的问候!

3 个答案:

答案 0 :(得分:3)

这是代码混淆的烦恼,但是:

REG_NAME1 |= (REG_NAME2 |= BIT1) & BIT1;  

答案 1 :(得分:1)

逗号运算符怎么样:

REG_NAME1 |= 0x1, REG_NAME2 |= 0x1;

还有两个表达式(你无法逃脱)但只有一个陈述。

答案 2 :(得分:1)

如果寄存器相邻,则可以使用两个大小的类型的单个寄存器,并将其写入一个语句中。

假设unsigned int是32位且unsigned long long是64位:

#define REG_NAME1_NAME2 (*((volatile unsigned long long*) 0x130031D4))
REG_NAME1_NAME2 |= 0x0000000100000001ULL ;

当然,如果这些类型的尺寸不符合规定,则位掩码必须不同。我强烈建议您在任何情况下都使用诸如uint32_t和uint64_t之类的C99类型。