Hallo zusammen,
habe ein Problem beim Anlegen eines verschachtelten Bitfeldes mit
Strukturen und Union.
Ziel ist folgendes:
Das gesamte "Konstrukt" soll/darf nur 1 Byte groß sein.
Die Bits 5, 6 und 7 sind ein einzelne Bitfelder (hier: c, b und a).
Die Bits 0+1 (f) sowie 2+3+4 (e) bilden jeweils ein weiteres
(Zahlen)Feld.
Diese, also die Bits 0 bis 4, sollen zeitgleich auch einen "Gesamtwert"
repräsentieren (d). Alles zusammen ist eine Kenngröße (g).
1 | Bits 7 6 5 4 3 2 1 0
|
2 | ----------------------------------
|
3 | | g |
|
4 | ----------------------------------
|
5 | | a | b | c | d |
|
6 | ----------------------------------
|
7 | | e | f |
|
8 | ----------------------
|
In C sieht das ganze bei mir so aus:
1 | typedef union
|
2 | {
|
3 | struct
|
4 | {
|
5 | uint8_t a : 1;
|
6 | uint8_t b : 1;
|
7 | uint8_t c : 1;
|
8 | union
|
9 | {
|
10 | struct
|
11 | {
|
12 | uint8_t f : 2;
|
13 | uint8_t e : 3;
|
14 | };
|
15 | uint8_t d : 5;
|
16 | };
|
17 | };
|
18 | uint8_t g;
|
19 | } TypeID;
|
Der so definierte Datentyp ist jedoch nicht 1 Byte, sondern 2 Byte groß
(sizeof(TypeID))! :-O
Begründet liegt das irgendwie an dem inneren Union. Definiere ich das
ganze so:
1 | typedef union
|
2 | {
|
3 | struct
|
4 | {
|
5 | uint8_t a : 1;
|
6 | uint8_t b : 1;
|
7 | uint8_t c : 1;
|
8 | uint8_t d : 5;
|
9 | };
|
10 | uint8_t g;
|
11 | } TypeID;
|
oder so
1 | typedef union
|
2 | {
|
3 | struct
|
4 | {
|
5 | uint8_t a : 1;
|
6 | uint8_t b : 1;
|
7 | uint8_t c : 1;
|
8 | uint8_t f : 2;
|
9 | uint8_t e : 3;
|
10 | };
|
11 | uint8_t g;
|
12 | } TypeID;
|
beträgt die Größe nur 1 Byte.
Klar kann ich jetzt Makros definieren um "d" maskieren und shiften um
"e" und "f" zur erhalten, das Ganze allerdings direkt über einen Zugriff
auf Variablen des Datentyps zu lösen ware mir um ein vielfaches lieber.
Wie bekomme ich denn den Datentyp auf 1 Byte !?
Danke für eure Hilfe!
Grüße
Michael