2011-05-23 41 views
7

我一直在尋找這個ITE8712看門狗定時器的演示代碼,當我看到這一點:C++中「變量|變量」是什麼意思?

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(「||」)。

回答

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端口o ˚F某種你正在寫和cSetWatchDogUnitcSetTriggerSignal將是你把輸出命令(設置觸發信號和使用的監督單位值)位掩碼。這個命令在實踐中意味着什麼可以被推斷出來,但是你更安全地參考看門狗電路本身的文檔。

而且,在關閉的機會,你不知道什麼是看門狗電路是的,這是一個簡單的電路,如果你不把它往往不夠(與另一命令),它會踢重置您的系統,可能是通過在您使用的任何處理器上激活重置引腳。

這是檢測自動嚴重行爲的軟件和設備返回到一個已知的初始狀態的方式,訂閱的理論,這是更好地重啓不是繼續執行不好。

+0

感謝您的意見,併爲其他內容加倍努力! – IBG 2011-05-23 09:19:10

1

x | y,通常使用與普通老式DATAS在C/C++。這意味着按位或

例如

char x = 0x1, y = 0x2; 
x | y ==> 0x3 

[注:operator |可以根據您的需要進行重載class/struct]

1

|按位或。如果任一整數中的同一位的一個或另一個打開,它將觸發位(1而不是0)。

||邏輯或。如果一個或另一個爲真,它將返回true。

0

好的,這裏是爲什麼你用這個按位或者,或者看他們用過,在這種情況下。

很多時候,這些變量是用於將多個數據塊打包成一個字符

如果cSetWatchDogUnitcSetTriggerSignal

具有非重疊位(想象cSetWatchDogUnit = 1 << 0cSetTriggerSignal = 1 << 1以後可以檢查標記看他們是否被設置與按位和,這樣人爲的例子:

if cData & cSetWatchDogUnit 
    do something 
if cData & cSetTriggerSignal 
    do something else 

整個過程中,這兩個FLA的gs可以包裝進去並在一個字符中傳遞。這樣,你不會傳遞一個布爾數組,你可以添加新的常量cSetSomeOtherDamnfoolThing = 1 << 2,你可以在代碼中將標誌作爲變量引用。

相關問題