mikrocontroller.net

Forum: Compiler & IDEs Bitorder C Compiler


Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Ewald (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Matthias

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.