Forum: Mikrocontroller und Digitale Elektronik Bitfeld alignment und #pragma pack


von pc (Gast)


Lesenswert?

Hallo,

ich habe ein Bitfeld, bei dem der IAR-Compiler wegen "illegal struct 
load - too low alignment" einen Fehler rauswirft.
1
typedef struct
2
{
3
  unsigned  RDY_n    :1;  
4
  unsigned  WEN    :1;  
5
  unsigned  BP0    :1;  
6
  unsigned  BP1    :1;  
7
  unsigned  Res_4_to_6  :3;
8
  unsigned  WPEN    :1;  
9
}
10
T_STATUS_REG;

Stelle ich ein #pragma pack(1) voran kommt die Warnung nicht mehr. Gilt 
das #pragma pack(1) für den gesamten Code oder nur für dieses Struct?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

pc schrieb:
> Gilt das #pragma pack(1) für den gesamten Code oder nur für dieses
> Struct?

Es gilt für alles, was folgt.

Du musst auf Deine Strukturdeklaration ein korrespondierendes #pragma 
pack mit dem für den restlichen Code gewünschten Wert folgen lassen.

von pc (Gast)


Lesenswert?

Hab gerade ein bisschen rumprobiert und kam zum selben Ergebnis. Es ist 
so wie du sagst. Danke!


Lösung:
1
#pragma pack(1)
2
3
typedef struct
4
{
5
  unsigned  RDY_n    :1;  
6
  unsigned  WEN    :1;  
7
  unsigned  BP0    :1;  
8
  unsigned  BP1    :1;  
9
  unsigned  Res_4_to_6  :3;
10
  unsigned  WPEN    :1;  
11
}
12
T_STATUS_REG;
13
14
#pragma pack()

von Mitlesa (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Es gilt für alles, was folgt.

Nebenfrage dazu:

Gilt das Pragma nur für das aktuelle Modul das compiliert
wird oder global für alle folgenden Übersetzungen?

(überleg, überleg ...: eigentlich wird der Compiler nichts
wissen mit welchen Parametern er zuvor beauftragt wurde zu
compilieren, also wird er beim nächsten Modul die Pragma-
Veränderung vom vorherigen Lauf nicht mehr kennen, richtig?)

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Mitlesa schrieb:
> Gilt das Pragma nur für das aktuelle Modul das compiliert
> wird oder global für alle folgenden Übersetzungen?
Ohne es genau zu wissen, denke ich, dass es sich auf eine 'translation 
unit' beschraenkt.

von weiss was (Gast)


Lesenswert?

pc schrieb:
> unsigned  RDY_n    :1;

Das ist verbesserungsfähig:
unsigned uint8_t RDY_n : 1;

Bei nur unsigned wird pauschal ein unsigned int mit 16 Bit verwendet.

von HildeK (Gast)


Lesenswert?

weiss was schrieb:
> Das ist verbesserungsfähig:
> unsigned uint8_t RDY_n : 1;

Das auch!
Wenn schon, dann
uint8_t RDY_n : 1;

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.