mikrocontroller.net

Forum: Compiler & IDEs Bitfelder für MCU Register?


Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich arbeite zur Zeit mit einem TriCore MCU und mir ist aufgefallen,
das die Libraries für den Zugriff auf die Register Bitfelder benutzen.
Nun habe ich auch hier im Forum schon einige Beiträge gefunden
in denen die Leute für den Zugriff auf Speicherregister Bitfelder 
nutzen.

Zur Frage:

Ich hatte in Erinnerung, dass der Compiler bei Bitfeldern in C die 
Reihenfolge der Elemente verändern darf, wodurch das ganze natürlich für 
den Zugriff auf Register denkbar ungeeignet wäre. Hat sich da was 
geändert ? Gibt es Compiler Optionen, die das sicherstellen oder was 
muss man beachten wenn man Bitfelder benutzen möchte ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klaus schrieb:

> Ich hatte in Erinnerung, dass der Compiler bei Bitfeldern in C die
> Reihenfolge der Elemente verändern darf, wodurch das ganze natürlich für
> den Zugriff auf Register denkbar ungeeignet wäre.

Im Prinzip: ja.
Allerdings kiffen ja auch die Compilerbauer sich nicht jeden Tag zu, 
sondern allokieren die Bits normalerweise in der Reihenfolge, in der sie 
definiert werden. Maximal die Reihenfolge 0->7 oder 7->0 ist 
üblicherweise verschieden (wenn überhaupt)

Was allerdings ein Problem sein kann: Wenn der Compilerbauer so schlau 
war, und Bits so durch die Gegend schiebt, dass er bei Mehrbitzugriffe 
nicht über Bytegrenzen hinweg arbeiten muss.

> Hat sich da was
> geändert ?

Nein

> Gibt es Compiler Optionen, die das sicherstellen

Hängt vom Compiler ab.
Aber erwarte dir von einem Compiler, der nicht aussschliesslich für 
µC-Belange entwickelt wurde, nicht allzuviel. Desktopprogrammierern ist 
diese Reihenfolge (so sie überhaupt Bitfelder benutzen) normalerweise 
schnurzegal.

> oder was
> muss man beachten wenn man Bitfelder benutzen möchte ?

IM Grunde gar nichts.
Wenn dein Compiler eine bestimmte Reihenfolge hat, und du sie kennst, 
benutze sie. Wenn dir das Risiko zu gross ist, dann benutze sie nicht.

Rein von der Laufzeit her, bringen Bitfelder sowieso nichts. Auch ein 
Compiler kann nicht zaubern und muss mittels Maskierungen die Bits bei 
Manipulationen freischafeln. Zugegeben: Die Syntax wird mit Bitfeldern 
ein wenig ansehnlicher, aber das wars dann auch schon.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klaus schrieb:

> Ich hatte in Erinnerung, dass der Compiler bei Bitfeldern in C die
> Reihenfolge der Elemente verändern darf, wodurch das ganze natürlich für
> den Zugriff auf Register denkbar ungeeignet wäre.

Kann ich mich nicht dran erinnern.

Richtig ist aber ohnehin, dass Bitfelder nicht universell portabel sind, 
entsprechende 1:1 Abbildungen von I/O-Registern also ein bestimmtes 
Verhalten des Compilers voraussetzen.

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Antworten.
Ich denke dann bleibe ich mal beim gewährten:

#define REG (*((volatile int32u*)0xDEADBEEF))

:-)
Viele Grüße

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klaus schrieb:

> Ich hatte in Erinnerung, dass der Compiler bei Bitfeldern in C die
> Reihenfolge der Elemente verändern darf, ...

Nein, die Reihenfolge darf er nicht ändern.  Allerdings ist im
Standard nicht festgelegt, in welcher Richtung die Bits nummeriert
werden, sondern das hat man als implementation-defined gelassen,
das heißt, dein Compiler ist verpflichtet zu dokumentieren, in
welcher Reihenfolge er es implementiert.  Außerdem ist im Standard
festgelegt, dass aufeinanderfolgende Bitfelder auch aufeinander-
folgend im Speicher stehen müssen, Lücken dürfen höchstens dann
gelassen werden, wenn das nächste Bitfeld nicht mehr in die aktuelle
Speicherstelle hinein passt (wobei es offen gelassen ist, um wie
viele Byte es sich dabei handelt).

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,

hast du mir dazu mal nen Tipp: Wo kann ich den aktuellen C Standard (C99 
vermute ich mal) idealerweise kostenlos herbekommen ?

Viele Grüße
Klaus

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1336.pdf

Die genannten Bitfeld-Geschichten sind in

6.7.2.1 Structure and union specifiers

beschrieben.

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.