我在嵌入式应用程序中使用旧代码。我看到两种不同的方法来设置标志位:
1-
#define BIT_0 0x1
#define BIT_1 0x2
#define BIT_2 0x4
#define BIT_3 0x8
#define Curr BIT_0
#define Ready BIT_1
#define Sleep BIT_2
#define Wait BIT_3
#define SET_BIT(var,bits) ((var) |= (bits))
#define CLEAR_BIT(var,bits) ((var) &= (~(bits)))
2-
struct PROCESS_FLAG
{
unsigned long Curr :1;
unsigned long Ready :1;
unsigned long Sleep :1;
unsigned long Wait :1;
};
union STATE_FLAG_REG
{
unsigned long All;
struct STATE_FLAG bit;
}
在第一个定义宏来获取和设置标志时,我可以设置任何标志变量,例如unsigned long flag
并使用SET_BIT(flag,3)
进行设置。
在第二个中,定义了一个位域结构。
我有一个问题:
- 节省内存的最佳方法是什么?
- 就 CPU 使用率而言,最佳方法是什么?
- 定义什么更合适?
注意:如果有其他好的方法,我很乐意了解更多信息。
最佳答案
What is the best way in terms of saving memory?
没有什么区别:如果您在原语中需要相同数量的位数,则两种方法都会导致使用相同数量的内存。如果您使用的位数超出了 int
的容纳范围,则 struct
可能会使用额外的内存:如果您在 32 位系统上需要 40 位,您的 struct
可能大于五个字节。
What is the best way in terms of CPU usage?
那里应该没有区别:没有神奇的方法来设置字节中的位,因此编译器将生成与宏执行相同操作的代码。
What is more proper to define?
由于位字段无法让您控制每个组件使用的确切位,因此当您必须访问特殊内存位置的硬件寄存器内的位时,只有第一种方法才有效。在所有其他情况下,决定取决于您,这是编码风格的问题。
关于c - 在c、位域结构或宏集中定义Flag并获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34510248/