C位屏蔽寄存器

时间:2015-07-09 15:47:28

标签: c bitmask

我已经有一段时间了,因为我已经用C语言进行了编程并完成了任何掩码。

我的问题是,在我的设备启动期间,我的设备驱动程序正在初始化寄存器中的位,但只有一些被认为是可变的。我知道哪些位是可变的,我知道他们认为取决于内存位置。

例如: $ 0x00AA应该始终具有格式0b101XXX01,其中X&是可变的,其他一切应该保持不变。 该函数当前接收一个地址和一个值,并简单地将该值设置为该地址。我需要修改它,这样即使函数在寄存器$ 0x00AA的0b11111111中传递,它也应该设置为0b10111101。 同样,对于0b00000000到0b10100001。

1 个答案:

答案 0 :(得分:3)

您可以先使用按位AND屏蔽除可变位之外的任何内容,然后按位OR添加常量位。

void set_register(uint8_t value) {
    const uint8_t MUTABLE_BITS = 0x1C;  // 0b00011100 <- only mutable bits
    const uint8_t CONSTANT_BITS = 0xA1; // 0b10100001 <- constant 1-bits

    value &= MUTABLE_BITS; // remove any non-mutable bits
    value |= CONSTANT_BITS; // add the constant bits
    my_register = value;
}

这种方法具有硬编码常数位值的可疑特性(根据名称“常量”)。另一种方法是仅设置可变位并从寄存器本身获取其余值(按位AND与可变位掩码的补码),例如:

void set_register(uint8_t value) {
    const uint8_t MUTABLE_BITS = 0x1C;  // 0b00011100 <- only mutable bits

    value &= MUTABLE_BITS; // remove any non-mutable bits
    value |= my_register & ~MUTABLE_BITS; // take other bits from register
    my_register = value;
}

(至于对具有不同掩码的多个寄存器执行此操作的要求,我希望它们的数量足够有限,您可以逐个设置它们。如果您确实需要一个接收指针的函数一个值,然后你必须检查指针对已知的保护地址并以某种方式获得适当的掩码。从if / elseswitch到二分搜索到某种类型的选择哈希映射。)