C -> Bitfeld

OP #6042590
Guten Morgen,

wenn ich jetzt ein Bitfeld habe
1
typedef struct
2
{
3
  uint8_t bStepperActive  :1; // Schrittmotoren sind aktiv (beide)
4
  uint8_t bStepperAutoOff :1; // Automatische Motorabschaltung nach Zeit
5
  uint8_t bButtonStart  :1; // Start wurde gedrückt
6
  uint8_t bChangeRotation  :1; // Richtung wurde geändert
7
  uint8_t bRotation    :1; // 0 = links (default) , 1 = rechts
8
}sFlags_t;

Kann ich davon ausgehen das z.B "bStepperActive" immer das erste Bit im 
"Byte" ist?
Sprich das der erste Eintrag in diesem Fall "bStepperActive" immer das 
erste Bit ist..
Gast #6042601
> Kann ich davon ausgehen das z.B "bStepperActive" immer das erste Bit
> im "Byte" ist?

Nicht vom C-Standard her - der schreibt keine Reihenfolge vor.  Wovon du 
allerdings ausgehen kannst, ist, dass ein bestimmter Compiler immer die 
gleiche Reihenfolge verwendet.
Gast #6042632
Die Idee ist doch sicher Binärdaten auf irgendeiner Schnittstelle zu 
empfangen und die Auswertung statt mit Hilfe der üblichen Bitschubserei 
elegant durch das Lesen/Schreiben der Felder im Bitfield zu erledigen.

Die Idee hatten schon viele zuvor und alle sind zur selben ernüchternden 
Erkentnis gelangt, dass dieser Code schlecht wartbar und unportierbar 
wird.
Gast #6042649
foobar schrieb:
> Nicht vom C-Standard her - der schreibt keine Reihenfolge vor.  Wovon du
> allerdings ausgehen kannst, ist, dass ein bestimmter Compiler immer die
> gleiche Reihenfolge verwendet.

Wobei "bestimmter Compiler" sehr eng zu sehen ist. Ich hatte schon mal 
den Brüller, dass bei einem Update des Compilers die Reihenfolge sich 
umdrehte.

Es soll ja auch Compiler geben, die per Kommandozeilenargument oder 
Pragma Anweisung da was drehen. Hölle, wenn man 2 fremde Bibliotheken 
einbinden muss, die das unterschiedlich handhaben.
#6042659
fop schrieb:
> Wobei "bestimmter Compiler" sehr eng zu sehen ist. Ich hatte schon mal
> den Brüller, dass bei einem Update des Compilers die Reihenfolge sich
> umdrehte.

Um welchen Prozessor ging es dabei? Man kann sowas nämlich auch in 
Hardware falsch machen, um das später zu korrigieren.

Motorola hatte sich auf Befehlsebene ins Knie geschossen, weshalb die 
Einzelbitbefehle der 68000 von rechts nach links adressierten, die mit 
68020 hinzu gekommenen Bitfeldbefehle aber von links nach rechts.

> Es soll ja auch Compiler geben, die per Kommandozeilenargument oder
> Pragma Anweisung da was drehen.

Die Anordnung von Bitfeldern orientiert sich sinnvollerweise nicht an 
der offiziellen Bitreihenfolge des Prozessors, sondern an dessen 
Bytereihenfolge. Also ob das obere oder das untere Byte eines Wortes im 
Speicher adressiert wird. Es gibt allerdings Architekturen, bei denen 
diese Bytereihenfolge erst im Rahmen der Systemimplementierung 
festgelegt wird. Weshalb Compiler flexibel sein müssen.
Gast #6042672
Bitfields sind zu vermeiden:

- Register mit unterschiedlicher Bedeutung der Daten für Lesen und 
Schreiben

- Register mit spezieller Behandlung einzelner Bits, z.B. Quittierung 
von Interrupts
Gast #6042686
Bei MCs die einzelne Bits manipulieren können werden Bitfields vom 
Kompiler meist nicht effizient umgesetzt. Ist mir z.B. beim 8051 
aufgefallen. Es werden immer alle 8 Bits behandelt.
#6042692
fop schrieb:
> Wobei "bestimmter Compiler" sehr eng zu sehen ist. Ich hatte schon mal
> den Brüller, dass bei einem Update des Compilers die Reihenfolge sich
> umdrehte.

Deswegen sagte ich ja: implementation-defined.

Ändert sich dahingehend das ABI, hat man den Salat ...

(wobei das recht selten vorkommt ;-))

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.