Forum: Mikrocontroller und Digitale Elektronik Bytes zusammenfassen


von Name N. (mar75)


Lesenswert?

Hallo Leute,

ich habe folgendes Code geschrieben, um 4 Bytes zu uint32 zu 
convertieren:

int main(void)
{
  typedef union typ
  {
    uint32_t b_32;
    uint8_t b_8[4];
  }typ_array;

  typ_array x;

  while (1)
  {
    x.b_8[0] = 1;
    x.b_8[1] = 2;
    x.b_8[2] = 3;
    x.b_8[3] = 4;
  }
}

Wenn ich x.b_32 ausgabe, bekomme ich 0x0201 (Es sollte aber 0x04030201 
sein)

weiss jemand, warum dies nicht funktioniert, wie ich es möchte?

Vielen Dank

: Gesperrt durch User
von I_ H. (i_h)


Lesenswert?

Fehler liegt wohl in deiner Ausgaberoutine.

von R. W. (quakeman)


Lesenswert?

Alternativ könntest du die vier Bytes natürlich auch mit Hilfe eines 
Pointers an die vier Adressen im RAM schreiben an welcher die 32Bit 
Variable liegt.
Das wäre der Weg den ich eher gehen würde als über eine Union und ein 
Array.
Problem dabei wäre natürlich, daß du dafür natürlich die Reihenfolge 
beachten müsstest, in welcher der Compiler die Variable im Speicher 
ablegt (little endian oder big endian). Diese Lösung "kann" also auf 
unterschiedlichen Compilern zu fehlerhaftem Verhalten führen.

Dann könntest du ebenfalls noch folgende Möglichkeit verwenden:
b_32 = 4 * 0x1000000
b_32 += 3 * 0x10000
b_32 += 2 * 0x100
b_32 += 1
Ein guter Compiler würde natürlich keine Multiplikation ausführen, da 
die Faktoren die Zahlen eben immer nur um jeweils ein Byte weiter nach 
oben in die 32Bit Zahl schreiben würde. Um sicherzugehen würde ich mir 
natürlich den generierten Assemblercode zu diesen Zeilen anschauen um 
sicherzugehen. ;)
Bei dieser Version bist du zumindest schon mal Compiler unabhängig.

Ebenso könntest du auch mit Schiebeoperationen arbeiten und was es nicht 
noch alles für Möglichkeiten gibt.

Also es führen wirklich viele Wege nach Rom, man muß sich nur für einen 
entscheiden. :)

Ciao,
     Rainer

von Tho W. (tommyprog)


Lesenswert?

>     uint32_t b_32;
>     uint8_t b_8[4];

Grüß Dich,

vorsicht mit dieser deklaration. es sind gewisse Variablennamen nicht 
erlaubt (weis ich vom letzten Freitag^^), z.b. wenn du 
test_integer_32bit benutzt, müsste er es bei dir unterringeln.
Ich arbeite mit den neuesten Atmelstudio und einen ATmega8 und ATmega32.

Vielleicht sind es bei dir andere Variablennamen. Probier einfach namen 
aus wie pizza_schnitte oder sowas, und versuche es dann nochmals.


Gehört eigentlich die Zuweisung
1
 x.b_8[0] = 1;
2
    x.b_8[1] = 2;
3
    x.b_8[2] = 3;
4
    x.b_8[3] = 4;
nicht einmal ausgeführt, und somit nicht in die while-schleife?

mfg,
tommyProg

von Karl H. (kbuchegg)


Lesenswert?

Tho Wes schrieb:
>>     uint32_t b_32;
>>     uint8_t b_8[4];
>
> Grüß Dich,
>
> vorsicht mit dieser deklaration. es sind gewisse Variablennamen nicht
> erlaubt (weis ich vom letzten Freitag^^), z.b. wenn du
> test_integer_32bit benutzt, müsste er es bei dir unterringeln.
> Ich arbeite mit den neuesten Atmelstudio und einen ATmega8 und ATmega32.
>
> Vielleicht sind es bei dir andere Variablennamen. Probier einfach namen
> aus wie pizza_schnitte oder sowas, und versuche es dann nochmals.

Sorry.
Aber das ist (fast) alles kompletter Blödsinn.

Ja, es gibt reservierte Schemata für Variablennamen.  Nein, seine 
gehören nicht dazu.

> Gehört eigentlich die Zuweisung
>
>
1
>  x.b_8[0] = 1;
2
>     x.b_8[1] = 2;
3
>     x.b_8[2] = 3;
4
>     x.b_8[3] = 4;
5
>
> nicht einmal ausgeführt, und somit nicht in die while-schleife?

Auch das ist Blödsinn. Darum gehts überhaupt nicht.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Jetzt seh ichs erst.
Das Posting ist von 2008 und sein Problem ist ganz einfach, dass er 
wahrscheinlich die falsche Ausgabefunktion benutzt hat. Eine für 
uint16_t und nicht eine für uint32_t.

: Bearbeitet durch User
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.