2017-12-01 4 views
0

Ich bin neu in Bit-Operationen und versuche, ein wenig zu experimentieren.Wie schreibe und lese ich spezifische Bit eines 32-Bit-Registers

lassen Sie uns sagen, ich habe ein 32-Bit-Register, das ist wie folgt aufgebaut:

Bit 31:12 RESERVED 
Bit 11 CONFIG1 
Bit 10 CONFIG2 
Bit 9:0 DATA 

Es existiert bereits eine Funktion, um Daten in das Register zu schreiben:

#define WR_REG_32(address, value) (*((volatile u32 *)(address)) = (value)) 

Gerne möchte ich schreiben Wert 0x0 bei Bit 10 (CONFIG2). Der Wert sollte wie zum Beispiel im Format:

0x00005000 

So, wie das, was Hex-Wert wissen, zu verwenden, um zu Bit 10 den Wert 0x0 zu schreiben, ohne die anderen Bits zu berühren?

Was ist auch der einfachste Weg, um aus dem 32-Bit-Register nur die Werte von Bit 0 - 9 zu lesen?

+1

Bitweise Operationen wie Verschiebung, und oder usw. werden für diesen Zweck gemacht. Wenn das Register 32 Bits hat, werden 32 Bits gelesen. Nur dann können Sie die oben genannten Operationen verwenden, um die gewünschten Bits zu erhalten. – zubergu

+0

von der Spitze der verbundenen Liste: [Wie können Sie ein einzelnes Bit setzen, löschen und umschalten?] (Https://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle -a-single-bit? rq = 1) ... – ilkkachu

+1

Auch: https://stackoverflow.com/questions/10493411/what-is-bit-masking – ilkkachu

Antwort

1

Sie müssen zuerst das Register lesen, um die gleichen Bits zu schreiben, außer das Bit 10, das auf Null gesetzt wird.

Um einen Bit auf Null, Zwangsbit 10, Sie die bitweise AND zwischen dem aktuellen Wert und all-Bits-zu-1-Ausnahme-Bit-10 (null)

newValue = currentValue & ~(1<<10) 

Die verwenden ~ Operator invertieren Bits. & ist bitweise UND. Verwenden der Makro,

value = RD_REG_32(address) ; To read the current value 
WR_REG_32(address, value & ~(1<<10)) 

RD_REG_32 den aktuellen Wert zu lesen.

Um die Bits 0 bis 9, setzen die anderen auf 0

(read value from register) 
value &= 0x3FF;  // keeps only the first 10 bits, from 0 to 9 

Lesen Sie auch Erics Kommentar unten zu lesen. Ihre Architektur könnte sich auf die Art auswirken, wie Sie mit 32-Bit-Werten umgehen können.

+2

'int' kann 16 Bit sein, in diesem Fall' ~ (1 << 10) "ergibt" ~ 1024 "und dann" 64512 "(unter Annahme des Zweierkomplements), und dann löscht" Wert & ~ (1 << 10) "die oberen 16 Bits des" Wertes ". Im Allgemeinen ist es bei der Verwendung bitweiser Operationen sinnvoll, einen vorzeichenlosen Typ der gewünschten Breite zu verwenden, wie bei "Wert & ~ ((u32) 1 << 10)". –

Verwandte Themen