带有寄存器的枚举和按位运算符

Eng_Mike

我们都习惯了这种操作寄存器:

SomeRegister |= (1 << What_ever_bit_I_wanna_change ) // we do this for changing a specific bit to one without changing the others.

SomeRegister &= ~(1 << What_ever_bit_I_wanna_change ) // we do this for changing a specific bit to zero without changing the others.

我打算使用相同的范式,但使用枚举,如下所示:

typedef enum  {
Acc_2g  (Something to change only the desired bits in the related register that I don't know how to do),
Acc_4g (Something to change only the desired bits in the related register that I don't know how to do)
}Res;

知道如何在枚举中使用按位运算符吗?

克利福德

枚举只是一组整数常量,它们不能在运行时对数据进行操作。例如,虽然您可以定义:

typedef enum  
{
    Acc_2g = 1 << 2,
    Acc_4g = 1 << 4
} Res ;

这不会按照问题中的要求“改变”任何位。您仍然必须使用相同的习语:

SomeRegister |= Acc_2g ;
SomeRegister &= ~(Acc_4g) ;  

您可能需要的是一个带有位域的结构。但是请注意,如果目的是访问某些硬件寄存器中的特定位,则您需要查阅编译器的文档,了解它如何根据位顺序和填充来打包位字段 - 这些东西取决于实现/目标,但这当寄存器也是特定于目标时,不一定要避免。

例如,对于一些假设的 8 位寄存器:

typedef union
{
    uint8_t byte;

    struct
    {
         uint8_t bit012 : 3;
         uint8_t bit34  : 2;
         uint8_t bit5   : 1;
         uint8_t bit6   : 1;
         uint8_t bit7   : 1;
    } bits ;

} registerType;

那么这个类型可以用来创建一个指向寄存器的指针:

registerType *pReg = (registerType*)0x00008000;

寄存器可以作为位域访问:

pReg->bits.bit5 = 1;
pReg->bits.bit012 = 7;

或者作为一个完整的寄存器:

pReg->byte = 0x55;

例如,可以通过为单个外设的所有寄存器定义一个结构来更进一步。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MSP430寄存器上的按位运算符,无需取消引用

来自分类Dev

为什么按位运算符没有逻辑“和/或”运算符那么聪明

来自分类Dev

按位运算符和for循环

来自分类Dev

按位运算符和位操作

来自分类Dev

按位'&'运算符

来自分类Dev

按位或运算符

来自分类Dev

OpenCL:更好地使用更多的寄存器,还是使用位移运算符打包值?

来自分类Dev

Java中的按位和运算符

来自分类Dev

重载类函数中的按位And(&)运算符和“ * this”

来自分类Dev

用按位和运算符分配值

来自分类Dev

使用按位和运算符c ++

来自分类Dev

.NET Framework方法中的按位和运算符

来自分类Dev

组合按位和与补运算符

来自分类Dev

C中的按位运算符和移位问题

来自分类Dev

有符号整数上的按位运算符

来自分类Dev

有符号整数上的按位运算符

来自分类Dev

具有按位运算符的C ++中的算法

来自分类Dev

按位逻辑运算符和移位运算符

来自分类Dev

hashCode中按位运算符>>>

来自分类Dev

运算符按位左移

来自分类Dev

按位运算符的优先顺序

来自分类Dev

按位运算符违反Misra

来自分类Dev

了解&按位运算符的用法

来自分类Dev

按位运算符的说明

来自分类Dev

按位运算符如何工作

来自分类Dev

按位运算符的通用约束

来自分类Dev

Gremlin中的按位运算符

来自分类Dev

if语句中的按位运算符

来自分类Dev

按位运算符如何工作?