Forum: Compiler & IDEs LSB(word) = reg; MSB(word) =reg;


von Stefan Salewski (Gast)


Lesenswert?

Ich lese die Bytes aus dem USB-FIFO nacheinander aus in der Art

uint8_t byte1, byte2;

byte1 = fiforeg;
byte2 = fiforeg;

Wie kann ich am besten ein Word auslesen?
MSB() und LSB() kennt der avr-gcc wohl nicht, also geht nicht:

unit16_t word;
LSB(word) = fiforeg;
MSB(word) = fiforeg;

Einen Funktionsaufruf möchte ich aus effizienzgründen nicht machen.
Mit einem union wäre es natürlich möglich -- ist effizient aber etwas 
viel Schreib-Aufwand. Mit Bitmasken und Schiebeoperationen kann man 
wahrscheinlich auch etwas basteln, aber es darf dadurch nicht 
uneffizient werden.

Wie mache ich das am besten?

Gruß

Stefan Salewski


von Wolfram (Gast)


Lesenswert?

>Einen Funktionsaufruf möchte ich aus effizienzgründen nicht machen.
>Mit einem union wäre es natürlich möglich -- ist effizient aber etwas
>viel Schreib-Aufwand. Mit Bitmasken und Schiebeoperationen kann man
>wahrscheinlich auch etwas basteln, aber es darf dadurch nicht
>uneffizient werden.

Wie wäre es erstmal etwas funktionierendes zu schreiben und dann sich 
Gedanken über die Effizienz zu machen?

von Tim S. (suxx)


Lesenswert?

1
#define MAKEWORD(a, b)      ((uint16_t)(((uint8_t )(a)) | ((uint16_t)((uint8_t )(b))) << 8))

sollte der compiler auch entsprechend effizient umsetzen können.

mfg tim

von Stefan Salewski (Gast)


Lesenswert?

@Wolfram:

Wie sagte DIETER NUHR so treffend:
"Man muss nicht zu allem einen Kommentar abgeben - wenn man keine Ahnung 
hat
EINFACH MAL DIE KLAPPE HALTEN"


Tim S. (suxx) schrieb am 27.12.2006 um 12:02 Uhr:
>#define MAKEWORD(a, b)      ((uint16_t)(((uint8_t )(a)) | >((uint16_t)((uint8_t 
)(b))) << 8))
>sollte der compiler auch entsprechend effizient umsetzen können.

Danke für den Tipp -- ich werde es mal ausprobieren und mir den 
erzeugten Assembler-Code ansehen.

Ich hatte eigentlich gehofft, dass es für dieses Problem ein 
Standard-Makro oder ähnliches geben würde. Aber gut, dann weiss ich 
Bescheid.

Gruß

Stefan Salewski

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.