当我看到这个时,我正在研究这个ITE8712看门狗定时器演示代码:
void InitWD(char cSetWatchDogUnit, char cSetTriggerSignal)
{
OpenIoConfig(); //open super IO of configuration for Super I/O
SelectIoDevice(0x07); //select device7
//set watch dog counter of unit
WriteIoCR(0x72, cSetWatchDogUnit|cSetTriggerSignal);
//CloseIoConfig(); //close super IO of configuration for Super I/O
}
并且,我想知道这条线是什么意思:
cSetWatchDogUnit|cSetTriggerSignal
因为WriteIoCR函数如下所示:
void WriteIoCR(char cIndex, char cData)
{
//super IO of index port for Super I/O
//select super IO of index register for Super I/O
outportb(equIndexPort,cIndex);
//super IO of data for Super I/O
//write data to data register
outportb(equDataPort,cData);
}
所以cIndex应该是0x72,但是cData怎么样?我真的没有得到“|”因为我只在条件语句中将它用于OR(“||”)。
答案 0 :(得分:14)
这是一个按位or
,与您的正常逻辑or
不同。如果设置了任一源变量中的相应位,它基本上设置目标变量中的位。
例如,表达式43 | 17
可以计算为:
43 = 0x2b = binary 0010 1011
17 = 0x11 = binary 0001 0001
==== ====
"or" them: 0011 1011 = 0x3b = 59
请参阅this answer以更全面地检查各种按位运算符。
当您想要操纵数据类型中的特定位时,通常使用它,例如控制嵌入式系统中的监视程序计时器(您的特定用例)。
您可以使用or (|)
打开位,然后and (&)
将其关闭(使用用于打开它们的位掩码的反转。
因此,要打开b3
位,请使用:
val = val | 0x08; // 0000 1000
要关闭它,请使用:
val = val & 0xf7; // 1111 0111
要检测当前是否设置了b3
,请使用:
if ((val & 0x08) != 0) {
// it is set.
}
您通常会看到位掩码定义如下:
#define B0 0x01
#define B1 0x02
#define B2 0x04
#define B3 0x08
#define B4 0x10
或:
enum BitMask {
B0 = 0x01,
B1 = 0x02,
B2 = 0x04,
B3 = 0x08,
B4 = 0x10
};
至于这意味着什么:
WriteIoCR (0x72, cSetWatchDogUnit|cSetTriggerSignal);
很可能,0x72
将是您正在写入的某种类型的I / O端口,而cSetWatchDogUnit
和cSetTriggerSignal
将是您组合输出命令的位掩码(设置触发信号并使用看门狗的单位值)。可以推断出该命令在实践中意味着什么,但是参考看门狗电路本身的文档更安全。
而且,如果您不知道看门狗电路的用途是什么,这是一个简单的电路,如果你不经常踢它(用另一个) 命令),它会重置您的系统,可能是通过激活您正在使用的任何处理器上的重置引脚。
这是一种自动检测性能不佳的软件并将设备恢复到已知初始状态的方法,订阅了重新启动比继续执行更好的理论。
答案 1 :(得分:8)
那是bitwise or。 它用于组合标志。
答案 2 :(得分:1)
x | y
通常与C / C ++中的Plain Old Data一起使用。这意味着按位OR 。
e.g。
char x = 0x1, y = 0x2;
x | y ==> 0x3
[注意:operator |
根据您的需要可以为class/struct
重载。]
答案 3 :(得分:1)
|
是按位或。如果一个整数中的一个或另一个相同的位打开,它会打开(1而不是0)的位。
||
是逻辑或。如果一个或另一个为真,则返回true。
答案 4 :(得分:0)
好的,这是为什么你在这种情况下使用bitwise或者看到它们的用法。
通常,这些变量是用于将多个数据打包成一个char
的标志如果cSetWatchDogUnit
和
cSetTriggerSignal
有非重叠位(想象cSetWatchDogUnit = 1 << 0
和cSetTriggerSignal = 1 << 1
,您可以稍后查看它们是否按位设置,就像这个人为的例子一样:
if cData & cSetWatchDogUnit
do something
if cData & cSetTriggerSignal
do something else
一直以来,这两个标志都可以打包并在一个字符中传递。这样,你最终不会传递一个bool数组,你可以添加新的常量cSetSomeOtherDamnfoolThing = 1 << 2
,你可以在代码中将flags作为变量引用。