Hallo! Bei mir klappt absolut kein vernünftiges Arbeiten mit 32Bit Variablen ( unsigned long, uint32_t ) Beispiel: uint32_t foo; foo = (1<<18); sollte ja eigentlich gehen Compiler sagt: warning: left shift count >= width of type Wie kann das sein? Egal was ich mach, ich kann nur die ersten 16bit erreichen, der Rest existiert quasi gar nicht. Vielen Dank! rralf
@ Ralf Ramsauer (rralf)
>warning: left shift count >= width of type
Klar, weil 1 eine 16 Bit 1 ist, weil alle Konstanten implizit vom Typ
int sind.
Probier mal
1 | |
MFG Falk
Konstante Zahlen sind beim avr-gcc standardmäßig 16 Bit breit, um sie auf 32 Bit zu kriegen muss man am Ende L (long) bzw UL (unsigned long) anfügen. Also foo = (1UL<<18);
Heil am Sack. Ich hab mir heute stundenlang den Kopf darüber zerschlagen warum das nicht geht, und ich hab mir sowas in der Art schon fast gedacht. Ich wollte von meinem Computer per Uart eine 32Bit Variable auf den AVR übertragen, also hab ich die am PC in 4Bytes gesplittet und die auf dem AVR rübergeschickt, welcher die dann wieder zusammenbauen sollte. 16Bits gingen wunderbar, aber was drüber war ging nicht. Würde dann folgender Code funktionieren ( am AVR ):
1 | |
2 | |
3 | |
4 | |
5 | |
Tausend Dank! Ralf
Gast
#1042144
bau dir ne union, 4 char, ein long. Brauchst du nichts zu shiften und anderen Kram.
Davon hab ich schon mal gelesen. Beitrag "32bit long in 4 byte aufteilen" Wie schaut das dann aus? Sowas wie:
1 | |
2 | |
3 | |
4 | |
Und wenn ich dann b fülle steht in l automatisch der long wert oder was? Danke!
Gast
#1042170
rischtisch
@ Ralf Ramsauer (rralf)
>Und wenn ich dann b fülle steht in l automatisch der long wert oder was?
Ja, denn die Variablen liegen "übereinander" an der gleichen Adresse,
NICHT hintereinander wie in einem stuct.
MfG
Falk
Gast
#1042192
nur aufpassen beim Eintüten -big/little endian.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.