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?
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.
Hi Das alignment sollte man aber wirklich nur abschalten wenns unbedingt sein muss. Das kann sich sonst zur üblen Performancebremse auswachsen. Matthias
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.