7

これを見たとき、私はこの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 ("||") にのみ使用したためです。

4

5 に答える 5

14

or通常の logical とは異なり、ビット単位orです。ソース変数のいずれかの対応するビットが設定されている場合、基本的にターゲット変数のビットを設定します。

たとえば、式は次の43 | 17ように計算できます。

43 = 0x2b = binary 0010 1011
17 = 0x11 = binary 0001 0001
                   ==== ====
        "or" them: 0011 1011 = 0x3b = 59

さまざまなビット演算子のより詳細な調査については、この回答を参照してください。

これは通常、組み込みシステムでのウォッチドッグ タイマーの制御など、データ型内の特定のビットを操作する場合に使用されます (特定のユース ケース)。

を使用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 ポートになり、コマンドを出力するために組み合わせるビットマスクになります (トリガー信号を設定し、ウォッチドッグに単位値を使用します) cSetWatchDogUnitcSetTriggerSignalそのコマンドが実際に何を意味するかは推測できますが、ウォッチドッグ回路自体のドキュメントを参照する方が安全です。

また、ウォッチドッグ回路が何のためにあるのかわからない場合に備えて、これは単純な回路であり、(別のコマンドで)頻繁にキックしないと、システムをリセットする可能性があります。使用しているプロセッサのピンをリ​​セットします。

これは、動作の悪いソフトウェアを自動的に検出し、デバイスを既知の初期状態に戻す方法であり、動作の悪い状態を続けるよりも再起動する方がよいという理論に基づいています。

于 2011-05-23T04:36:18.493 に答える
8

それはビット単位の orです。ここではフラグを組み合わせるために使用されます。

于 2011-05-23T04:35:06.960 に答える
1

x | y通常、C/C++ の Plain Old Data で使用されます。これは、ビットごとのORを意味します。

例えば

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

[注:必要operator |に応じてオーバーロードできclass/structます。]

于 2011-05-23T04:37:10.563 に答える
1

|ビットごとのor です。いずれかの整数の同じビットの一方または他方がオンの場合、ビットをオンに切り替えます (0 ではなく 1)。

||論理和です。一方または他方が true の場合、true を返します。

于 2011-05-23T04:38:12.250 に答える
0

OK、これが、この種の状況でビット単位の or を使用する理由です。

多くの場合、これらの変数は、複数のデータを 1 つの文字にパックするために使用されるフラグです。

もしcSetWatchDogUnit、そして cSetTriggerSignal

オーバーラップしていないビットを持っています (想像cSetWatchDogUnit = 1 << 0cSetTriggerSignal = 1 << 1てみてください。ビットごとに設定されているかどうかを後で確認できます。この不自然な例のように:

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

常に、これらのフラグは両方とも 1 つの文字にまとめて渡すことができます。そうすれば、bool の配列を渡すことはなく、新しい定数cSetSomeOtherDamnfoolThing = 1 << 2を追加したり、フラグをコード内の変数として参照したりできます。

于 2011-05-23T04:39:41.177 に答える