Ich habe einen Code gelesen, um einen auf einem Arduino ATMEGA328P zu verwenden, und ich kann nicht herausfinden, was diese Codezeile tut.
ASSR &= ~(_BV(EXCLK) | _BV(AS2));
Ich weiß, dass ASSR das asynchrone Statusregister ist und dass EXCLK AS2 sind Bits in diesem Register. Ich bin mir ziemlich sicher, dass _BV() verwendet wird, um dieses Bit zu setzen, korrigieren Sie mich, wenn ich falsch liege. Was ich nicht weiß, ist, was dieser Code tatsächlich tut? Es scheint, dass dieser Code bitweise Operationen verwendet, um das Register ASSR mit einem einzelnen Bit ( ~(_BV(EXCLK) | _BV(AS2))
) zu vergleichen und dieses Register dann auf ein einzelnes Bit, eins oder null, zu setzen. Das macht für mich keinen Sinn, da dieses Register 7 Bit groß ist und nicht mit einem einzelnen Bit verglichen werden kann. Jede Hilfe ist willkommen, danke.
Relevante Dokumentation:
Ich habe wenig Erfahrung mit Arduino, aber es sieht so aus, als würde diese Zeile die Bits EXCLK und AS2 löschen.
Aus dem Kontext sollte BV() Ihnen das Bitgewicht geben.
AS2 ist Bit 5 (von rechts beginnend bei 0 gezählt) im Register, _BV(AS2)
sollte dann 32 zurückgeben (
). Nach der gleichen Logik _BV(EXCLK)
sollte 64 zurückgegeben werden, da EXCLK Bit 6 ist.
also in binär haben wir
_BV(AS2) = 00100000
Und_BV(EXCLK) = 01000000
Wenn wir oder diese Werte erhalten wir 01100000
Das ~
invertiert die Werte, sodass wir 10011111 erhalten
Dann &=
behält der alle Bits, die beim vorherigen Ergebnis 1 sind, unverändert bei und setzt die verbleibenden Bits (5 und 6) auf 0.
_BV
ist ein Makro, das eine Linksverschiebung durchführt. EXCLK
und AS2
sind Bitpositionen innerhalb ihres Registers. Der Code verknüpft also die Bitwerte mit ODER, invertiert das Ganze (alle 8 Bits) und UND verknüpft sie mit dem Register. Kurz gesagt, es löscht diese Bits.
Kat
Bruno Ferreira
_BV()
kann es auch als Rechtsruck angesehen werden (tatsächlich wird es so definiert).