もちろん、次の 2 つのコマンドのシーケンス:
A |= 0x02;
A &= 0x02;
以下と同一です:
A = 0x02;
A
が変数ではなく、ハードウェア レジスタでない限り。この場合、MCU/CPU (またはマッピングされたペリフェラル) のマニュアルを参照して、このシーケンスが正確に必要な理由を確認する必要があります。
アップデート
変数 vs ハードウェア レジスタ
上記のコメントで、OP は変数とレジスタを区別する方法を尋ねました。
これは非常に簡単です。あなたがする必要があるのは、定義を見ることだけです。典型的な変数は次のように定義されますが:
unsigned char A;
ハードウェア レジスタの定義は次のようになります。
#define A (*(volatile uint16_t *)(0x1234))
ここで、A
はハードウェア レジスタの値として定義され、 のアドレスにマップされます0x1234
。すべてのマイクロコントローラーまたは CPU には独自のハードウェア レジスタ セットがあり、アーキテクチャやモデルの種類が異なるだけでなく、製造元によっても異なります。ソース コードが十分に文書化されていない場合、特定のハードウェア レジスタが何であるかを知る唯一の方法は、ハードウェア データシートを調べることです。また、一部の高度なアーキテクチャでは、一部のペリフェラルのハードウェア レジスタを CPU アドレス空間にマップできるため、外部コンポーネントのハードウェア レジスタに同じ方法でアクセスできます。
volatile
キーワードに注意してください。ウィキから:
このキーワードは、最適化コンパイラが後続の読み取りまたは書き込みを最適化して、古い値を誤って再利用したり、書き込みを省略したりするのを防ぎます。揮発性の値は、主にハードウェア アクセス (メモリ マップド I/O) で発生します。この場合、メモリからの読み取りまたはメモリへの書き込みが周辺デバイスとの通信に使用されます。スレッド化では、別のスレッドが値を変更した可能性があります。