PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Was bringt _BV()



michaelb
17.10.2005, 20:46
Hi Leuts,
hab ne simple Frage!!:
oft werden Bits mit _BV() gesetzt! zb:


UCSRB = _BV(RXCIE) | _BV(TXCIE) | _BV(RXEN) | _BV(TXEN);
man kann die Bits doch auch so setzen!:


UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<TXCIE);
was ist besser? ist _BV(); ne Bibliotheksfunktion?
Gruß Michi

Joerg
17.10.2005, 21:48
Hallo Michael,

rein codemäßig bringen beide Varianten keinen Unterschied.

Aus

UCSRB = _BV(RXCIE) | _BV(TXCIE) | _BV(RXEN) | _BV(TXEN);

wird

ldi r24,lo8(-40)
out 42-0x20,r24

und aus der (1<<x) Variante genauso. Das heißt beide Konstantenausdrücke werden vom Compiler aufgelöst und dementsprechend richtig ausgerechnet übersetzt.

Auch beim Zugriff auf Ports macht es keinen Unterschied welche Variante benutzt wird.
Sowohl PORTB |= _BV(PB2); als auch PORTB |= 1<<PB2;
wird zu: sbi 56-0x20,2

Viele Grüße
Jörg

Felix G
17.10.2005, 23:52
prinzipiell sind die Varianten natürlich gleichwertig,
aber ich bevorzuge dennoch die (1 << x) Variante, da diese Compilerunabhängig ist.

SprinterSB
18.10.2005, 10:18
Das heißt beide Konstantenausdrücke werden vom Compiler aufgelöst und dementsprechend richtig ausgerechnet übersetzt.


prinzipiell sind die Varianten natürlich gleichwertig,
aber ich bevorzuge dennoch die (1 << x) Variante, da diese Compilerunabhängig ist.

Die Ausdrücke sind nicht nur gleichwertig, sondern ein und dasselbe. _BV() wird nicht vom Compiler ausgewertet, sondern ist lediglich ein Macro und wird damit vom Präprozessor aufgelöst.


#define _BV(bit) (1 << (bit))

avr/sfr_defs.h wird von avr/io.h includet, so daß man es eh dabei hat.

In sfr_defs.h werden auch Sachen defined wie
bit_is_clear(sfr, bit)
loop_until_bit_is_set(sfr, bit)
etc...

Mit der Compilerabhängigkeit ist das so ne Sache.
Hardwarenahe Dinge werden durch verschiedenen Compiler meist verschieden ausgedrückt, wie zB die Definition von Interrupts und Signals. Alles andere hat mit dem Compiler eigentlich nix zu tun. Jedenfalls lassen sich Makros wie bit_is_clear() leichter portieren als wenn man immer selber hinschreibt, zu was das Makro expandiert. Beim Compilerumstieg braucht man dann nämlich nur eine Zeile im Header anzufassen und nicht die ganze Quelle nachzukontrollieren.

Felix G
18.10.2005, 16:42
Jedenfalls lassen sich Makros wie bit_is_clear() leichter portieren als wenn man immer selber hinschreibt, zu was das Makro expandiert. Beim Compilerumstieg braucht man dann nämlich nur eine Zeile im Header anzufassen und nicht die ganze Quelle nachzukontrollieren.
Wenn man aber keine Makros verwendet muss man garnichts nachkontrollieren, denn Standard-C versteht jeder Compiler.

michaelb
18.10.2005, 18:22
Hi,
Danke!! Danke!!
Mal schauen was ich so verwende! Bisher hab ich immer die (1<<PD5)
Variante benutzt!
Gruß Michi