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


von klaus (Gast)


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 ?

von Karl H. (kbuchegg)


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.

von (prx) A. K. (prx)


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.

von klaus (Gast)


Lesenswert?

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

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

:-)
Viele Grüße

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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).

von klaus (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

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.