Forum: Mikrocontroller und Digitale Elektronik Pointer bitwise operator


von Gerhard (Gast)


Lesenswert?

Ich versuche mit einem Pointer die Struktur eines Structs zu umgehen.
Leider bekomme ich immer die Fehlermeldung
"expression must have integral type".
Kann mir jemand weiterhelfen?
1
struct fnc_lat
2
{
3
  unsigned int pv      :2;    // Prescaler Value
4
  unsigned int pd2    :1;    // Power Down 2
5
  unsigned int cs2    :3;    // Current Setting 2
6
  unsigned int cs1    :3;   // Current Setting 1
7
  unsigned int tcc    :4;    // Timer Counter Control
8
  unsigned int fm      :1;   // Fastlock Mode
9
  unsigned int fe      :1;    // Fastlock Enable
10
  unsigned int cdt    :1;    // CP Threestate
11
  unsigned int pcp    :1;    // PD Polarity
12
  unsigned int mux    :3;    // MUX Control
13
  unsigned int pd1    :1;    // Power Down 1
14
  unsigned int cr      :1;    // Counter Reset
15
  unsigned int cb      :2;    // Control Bit
16
} f_lat_data, i_lat_data;
17
  
18
struct fnc_lat *pointer_f_lat_data = &f_lat_data;
19
20
//...
21
22
*pointer_f_lat_data &= 0x1FF803;
23
*pointer_f_lat_data |= (p.data & 0x1FF) << 2;
24
*pointer_f_lat_data |= (p.data & 0xE00) << 21;

DANKE

Gerhard

von Kindergärtner (Gast)


Lesenswert?

Verwende eine union:
1
union fnc_lat
2
{
3
  struct {
4
  unsigned int pv      :2;    // Prescaler Value
5
  unsigned int pd2    :1;    // Power Down 2
6
  unsigned int cs2    :3;    // Current Setting 2
7
  unsigned int cs1    :3;   // Current Setting 1
8
  unsigned int tcc    :4;    // Timer Counter Control
9
  unsigned int fm      :1;   // Fastlock Mode
10
  unsigned int fe      :1;    // Fastlock Enable
11
  unsigned int cdt    :1;    // CP Threestate
12
  unsigned int pcp    :1;    // PD Polarity
13
  unsigned int mux    :3;    // MUX Control
14
  unsigned int pd1    :1;    // Power Down 1
15
  unsigned int cr      :1;    // Counter Reset
16
  unsigned int cb      :2;    // Control Bit
17
  } BITS;
18
  uint32_t RAW;
19
} f_lat_data, i_lat_data;
20
21
f_lat_data.BITS.pv = 3;
22
f_lat_data.RAW &= 0x1FF803;
23
f_lat_data.RAW |= (p.data & 0x1FF) << 2;
24
f_lat_data.RAW |= (p.data & 0xE00) << 21;

von Gerhard (Gast)


Lesenswert?

DANKE!!!

Das kannte ich noch nicht.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Gerhard schrieb:
> *pointer_f_lat_data |= (p.data & 0xE00) << 21;

Da sollte wohl "<< 12 stehen.

Den Vorschlag vom Kindergärtner solltest du gut testen, da nicht 
garantiert ist, dass er funktioniert. Ob er funktioniert hängt von der 
internen Darstellung der Bitfelder und dem überlagerten uint32_t ab.

Aber warum willst du überhaupt den Zugriff über die Bitfelder umgehen? 
Die hast du (oder jemand anderer) doch gerade deswegen angelegt, um den 
Zugriff auf die einzelnen Elemente komfortabler und durchsichtiger zu 
machen.

von Kindergärtner (Gast)


Lesenswert?

Yalu X. schrieb:
> Ob er funktioniert hängt von der
> internen Darstellung der Bitfelder und dem überlagerten uint32_t ab.
Das würde aber auch für jegliche andere Form von Direkt-Zugriff (ohne 
Bitfield) gelten (wie zB wildes casten). Wobei ich auch da lieber 
nochmal den Standard konsultieren würde, ob das für Bitfelder nicht 
vielleicht doch garantiert ist...!

von Yalu X. (yalu) (Moderator)


Lesenswert?

Kindergärtner schrieb:
> Yalu X. schrieb:
>> Ob er funktioniert hängt von der
>> internen Darstellung der Bitfelder und dem überlagerten uint32_t ab.
> Das würde aber auch für jegliche andere Form von Direkt-Zugriff (ohne
> Bitfield) gelten (wie zB wildes casten).

Klar, das macht keinen großen Unterschied. Deswegen habe ich ihn ja 
gefragt, warum er überhaupt mit solchen Tricks arbeiten will. Er kann 
die Zuweisung der einzelnen Elemente ja auch über die Bitfelder machen. 
Er könnte auch auf die Bitfelder (und die Struktur) komplett verzichten 
und alle Operationen mit Bit-Arithmetik auf einem 32-Bit-Int machen. Nur 
beide Methoden zu mischen ist weniger ratsam. Aber selbst das ist 
möglich (Portabilität steht auf diesem hardwarenahen Level wohl kaum im 
Vordergund), man muss es eben ausgiebig testen.

Ich habe das Beispiel auf dem PC getestet, da hat es schon einmal nicht 
funktioniert, wenn man davon ausgeht, dass durch die beiden letzten 
Anweisungen die Bit-Felder fm, fe, cdt, pcp, mux, pd1 und cr sowie pv 
und pd2 beschrieben werden sollen.

> Wobei ich auch da lieber
> nochmal den Standard konsultieren würde, ob das für Bitfelder nicht
> vielleicht doch garantiert ist...!

Für Bitfelder ist im Standard fast nichts garantiert ;-)

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.