Forum: Compiler & IDEs Bitorder C Compiler


von Wolfram (Gast)


Lesenswert?

Ist die Bitorder innerhalb einer Struct fest definiert oder unter jeder
Architektur /C Compiler anders.

Beispiel:
folgende Definition
union StatusWort{
  struct Status{
    unsigned long Motor_aktiv:1;
    unsigned long Kalibrierpunkt:1;
    unsigned long Motor_Minimum:1;
    unsigned long Motor_Maximum:1;
    unsigned long Kalibrierung_noetig:1;
    unsigned long ungueltige_Motorposition:1;
    unsigned long CRC_Fehler:1;
    }Status;
  unsigned long Gesamt;
}StatusWort;

sagen wir ich würde auf einem Mikrocontroller (AVR) in GCC
StatusWort.Gesamt per shiften in einzelbytes zerlegen seriell
übertragen und in einem  PC in einem VisualC Programm wieder mit
shiften zusammensetzen. Kann ich mich darauf verlassen das
StatusWort.Status.Motor_aktiv dem des Mikrocontrollers entspricht?

von Ewald (Gast)


Lesenswert?

Nein, das kannst Du nicht. Zwar ist die Anordnung mehrerer Bits in einem
Byte tatsächlich fast so etwas wie festgelegt, aber das Zusammensetzen
mehrerer Bytes zu einem 16-Bit oder gar 32-Bit-Wert ist nicht
festgelegt. Bei 8-Bit-Architekturen wie dem AVR bleibt das dem Belieben
des Compilers überlassen, bei richtigen 16- oder 32-Bit-Architekturen
ist das hingegen durch den Prozessor vorgegeben.
Das ist die sogenannte "endian-ness", "little-endian" und
"big-endian".

Beispiel:
Die Zahl 0x1234 wird von einem x86-Prozessor als Bytefolge 0x34 0x12 im
Speicher abgelegt, während ein 68k-Prozessor das als Bytefolge 0x12 0x34
im Speicher ablegt.

Dazu kommt noch, daß bei Prozessorarchitekturen mit mehr als 8 Bit
Wortbreite Strukturen im Speicher aus Performancegründen ausgerichtet
werden; dieses "Alignment" muss man berücksichtigen und
gegebenenfalls deaktivieren. Das geschieht mit MS-Compilern mit #pragma
pack.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

Das alignment sollte man aber wirklich nur abschalten wenns unbedingt
sein muss. Das kann sich sonst zur üblen Performancebremse auswachsen.

Matthias

von Wolfram (Gast)


Lesenswert?

Ich denke das alignment spielt hier erstmal keine Rolle, da durch die
union sowohl Status als auch Gesamt auf der gleichen Speicherstelle
liegen egal ob die aligned oder unaligned im Speicher liegt.
ob die Byteorder eine Rolle spielt das ist eine Teilfrage. Ich denke
nur
da es sich bei Gesamt um einen long handelt und bei Status um einen
struct der einen long enthält(effektiv ein long ist) müsste sich der
Compiler beim Zugriff gleich verhalten, egal wie die Zahl im Speicher
liegt. Einzelbitzugriffe auf der struct Status wären logische
Verknüpfungen die sich am Typ des Bitfeldes (long) orientieren. Oder
irre ich mich da?
Ein Zerlegen in Einzelbytes per shiften des long und auf der PC Seite
ein wiederzusammensetzen mit shiften sollte auch nicht destruktiv
sein.
Die eigentliche Frage die sich mir stellt ist die Bitorder festgelegt
oder macht das jeder Compiler anders?

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

IIRC ist die Anordung der einzelnen Bits eines Bitfield in ANSI-C
"implementation defined". Das kann sich also von Compiler zu Compiler
unterscheiden. Ich müßte das aber auch nochmal nachlesen.

Matthias

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.