[Erledigt] Alternative zum Bitfield gesucht
-
Werte Forumsbesucher,
meine embedded- Compiler fressen so Zeug ganz brav und packen nur ein Byte in die Union:
typedef struct _bit_def_ { char b0:1; char b1:1; char b2:1; char b3:1; char b4:1; char b5:1; char b6:1; char b7:1; } bit_def; typedef union _byte_def_{ bit_def bit; char byte; } byte_def;
Weil die Turnaroundzeiten am PC doch kürzer sind und Teile der Hardware noch nicht fertig, wurstle ich gerade am PC und da geht es schon los, daß er int als Typ des Bitfields haben mag und dann auch tatsächlich 8 ints in die struct packt. Also Code wie dieser:
byte_def attributes; #define flags attributes.byte #define rapid attributes.bit.b0 #define running attributes.bit.b1 // ... if (rapid) { rapid = 0; running = 1; // do something flags = 0x22; }
fliegt voll auf die Nase. Mir ist schon klar, daß die Bitfields und Unions "implementation defined" sind sowie daß der "kompatible" Weg über Bitshift und Verunden/Verodern läuft. Aber dann sehen meine embedded- Compiler nicht mehr, daß sie Bitbefehle einsetzen und Rechenzeit sparen können, möchte das also nicht final ändern. Eigentlich fällt mir nur ein, das über einen globalen define zu machen, was in eine ziemliche ifdef- Orgie mit Codevarianten ausarten würde.
Gibt es irgendwas cooles, z.B. über Präprozessor- Macros, um möglichst wenig ändern zu müssen.
Danke für's Nachdenken!
-
Such mal nach #pragma pack in der Forensuche. Ich muss gestehen, ich hatte solche Probleme noch nicht, weiß also nicht genau, ob #pragma pack dafür geeignet ist, aber ich glaube schon.
-
^^ für'n GCC heisst das: __attribute__(packed) oder so ähnlich.
-
feigling schrieb:
Such mal nach #pragma pack in der Forensuche. Ich muss gestehen, ich hatte solche Probleme noch nicht, weiß also nicht genau, ob #pragma pack dafür geeignet ist, aber ich glaube schon.
Also mit #pragma pack kann man das Alignment von Structmembern beeinflussen, aber nicht unter ein Byte runter.
Hab' eine zeitlang herumgespielt, bis ich auf 'nen switch gestoßen bin, daß er auch char als Bitfield- Typ zuläßt, jetzt verbrät er 8 Byte in der Struct, was mir aber auch nicht wirklich weiterhilft.~fricky schrieb:
^^ für'n GCC heisst das: __attribute__(packed) oder so ähnlich.
Ist kein GCC, sodern Pelles C für Windows. Hast Du nicht irgendeinen Link auf 'ne Präprozessor- Macro- Hexenküche, von der man sich beim Drübersurfen inspirieren lassen könnte?
-
Fragt mich nicht, was ich gemacht hab'. Ich habe die Projektsteuerdatei gesichert und mal wüst an allen Compilerschaltern gedreht und auf einmal war wirklich nur noch ein Byte in der union. Muß jetzt noch gucken, ob der Zugriff nun wirklich bitweise geht, wenn ja, war's das.
EDIT: Jo, wirklich bitweise
-
pointercrash() schrieb:
Mir ist schon klar, daß die Bitfields und Unions "implementation defined" sind sowie daß der "kompatible" Weg über Bitshift und Verunden/Verodern läuft. Aber dann sehen meine embedded- Compiler nicht mehr, daß sie Bitbefehle einsetzen und Rechenzeit sparen können...
und/oder/xor/not mit zweierpotenzen (oder invertierten zweierpotenzen), was man ja dafür braucht, erkennt fast jeder compiler als einzelbit-zugriff. schon mal ausprobiert?
mit bitfields kannst du noch mehr pech haben, z.b. kann die reihenfolge vertauscht sein. d.h. deine union ist zwar 8 bits gross, aber beim einen compiler ist bit0 rechts, beim anderen links.
-
~fricky schrieb:
und/oder/xor/not mit zweierpotenzen (oder invertierten zweierpotenzen), was man ja dafür braucht, erkennt fast jeder compiler als einzelbit-zugriff. schon mal ausprobiert?
Ich hab' mich an die FAQ hier gehalten und das erkennen meine zwei Hauptkameraden nicht als Bitzugriff.
~fricky schrieb:
mit bitfields kannst du noch mehr pech haben, z.b. kann die reihenfolge vertauscht sein. d.h. deine union ist zwar 8 bits gross, aber beim einen compiler ist bit0 rechts, beim anderen links.
Die Endian- Formate stimmen glücklicherweise überein, alle Compiler machen das gleich.
Mich hat nur die Panik gebeutelt, weil das teilbestückte Zeug der Targethardware erst in 10 Tagen da sein wird und ich eh schon wieder hintendran bin.Naja, für jetzt tut's jetzt ja, für Tiefenforschung hab' ich sowieso keine Zeit.