gpt4 book ai didi

c - 位操作良好实践

转载 作者:太空狗 更新时间:2023-10-29 16:21:15 26 4
gpt4 key购买 nike

作为初学者的 C 程序员,我想知道,在设备中设置控制位的最佳易读和易于理解的解决方案是什么。有什么标准吗?有什么示例代码可以模仿吗?谷歌没有给出任何可靠的答案。

比如我有一个控制 block 图: map

我看到的第一种方法是简单地设置所需的位。评论里要一堆解释,好像不是很专业。

DMA_base_ptr[DMA_CONTROL_OFFS] = 0b10001100;

我看到的第二种方法是创建一个位域。我不确定这是否是我应该坚持的,因为我从未遇到过以这种方式使用它(与我提到的第一个选项不同)。

struct DMA_control_block_struct
{
unsigned int BYTE:1;
unsigned int HW:1;
// etc
} DMA_control_block_struct;

其中一个选项比另一个更好吗?是否有任何我看不到的选项?

任何建议将不胜感激

最佳答案

位字段的问题在于 C 标准并未规定它们的定义顺序与它们的实现顺序相同。因此,您可能没有设置您认为的位。

C standard 的第 6.7.2.1p11 节状态:

An implementation may allocate any addressable storage unit large enough to hold a bit- field. If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit. If insufficient space remains, whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is implementation-defined. The order of allocation of bit-fields within a unit (high-order to low-order or low-order to high-order) is implementation-defined. The alignment of the addressable storage unit is unspecified.

举个例子,看Linux下/usr/include/netinet/ip.h文件中struct iphdr的定义,它代表一个IP头:

struct iphdr
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned int ihl:4;
unsigned int version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
unsigned int version:4;
unsigned int ihl:4;
#else
# error "Please fix <bits/endian.h>"
#endif
u_int8_t tos;
...

您可以在此处看到位域的放置顺序因实现而异。您也不应该使用此特定检查,因为此行为取决于系统。这个文件是可以接受的,因为它是系统的一部分。其他系统可能会以不同的方式实现这一点。

所以不要使用位域。

最好的方法是设置所需的位。但是,为每个位定义命名常量并对要设置的常量执行按位或操作是有意义的。例如:

const uint8_t BIT_BYTE =     0x1;
const uint8_t BIT_HW = 0x2;
const uint8_t BIT_WORD = 0x4;
const uint8_t BIT_GO = 0x8;
const uint8_t BIT_I_EN = 0x10;
const uint8_t BIT_REEN = 0x20;
const uint8_t BIT_WEEN = 0x40;
const uint8_t BIT_LEEN = 0x80;

DMA_base_ptr[DMA_CONTROL_OFFS] = BIT_LEEN | BIT_GO | BIT_WORD;

关于c - 位操作良好实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53118858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com