Forum: Mikrocontroller und Digitale Elektronik IAR MSP430 Union-Problem


von Karl-heinz S. (cletus)


Lesenswert?

Hi,

ich habe folgenden Code:
 typedef struct{
  union sc {
    UCHAR scbyChar;
    struct {
      USIGN8 x1 : 1;
      USIGN8 x2 : 1;
      USIGN8 x3 : 1;
      USIGN8 x4 : 1;
      USIGN8 x5 : 1;
      USIGN8 x6 : 1;
      USIGN8 iPData : 1;
      USIGN8 eD : 1;
    } scbyStruct;
  } scunion;


  union eq1 {
    UCHAR eqbyChar;
    struct {
      USIGN8 i : 3;
      USIGN8 r : 1;
      USIGN8 t : 2;
      USIGN8 m : 2;
    } eqbyStruct;
  } eq1union;

  USIGN16 ec1;

  union eq2 {
    UCHAR eqbyChar;
    struct {
      USIGN8 i : 3;
      USIGN8 r: 1;
      USIGN8 t : 2;
      USIGN8 m : 2;
    } eqbyStruct;
  } eq2union;

  USIGN16 ec2;

[...]
} eb_t;

Jetzt belegt dieser dämliche IAR-Compiler für eq1 richtigerweise 1 Byte.
Für eq2 reserviert er aber 2 Byte (bzw der Abstand zu ec2 beträgt 2 
Byte).

Woher kommt das zusätzliche Byte? "Optimierung"?

Und vor allem: Wie werde ich es wieder los?

Ich will mit Zeigern arbeiten, aber das vermasselt er mir hier 
gewaltig...

von Karl-heinz S. (cletus)


Lesenswert?

Karl-heinz Strunk wrote:

> Woher kommt das zusätzliche Byte? "Optimierung"?

Ich habe mal alle Optimierungen ausgeschaltet. Nutzt nichts.

von Franky (Gast)


Lesenswert?

Hallo,

Variablen mit mehr als 1 Byte werden standardmässig immer an geraden
Speicheradressen abgelegt !

Gruß

Franky

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> (bzw der Abstand zu ec2 beträgt 2 Byte).
16-Bit Prozessor?
Das Stichwort wäre dann Alignment.
Irgendwie solltest du deinen Compiler auf Byte-Alignment umstellen 
können.

von Karl-heinz S. (cletus)


Lesenswert?

Lothar Miller wrote:
>> (bzw der Abstand zu ec2 beträgt 2 Byte).
> 16-Bit Prozessor?
> Das Stichwort wäre dann Alignment.
> Irgendwie solltest du deinen Compiler auf Byte-Alignment umstellen
> können.


Jau:
#pragma pack(1)

Und das geht auch.

Wieder was gelernt!

Danke Schön!

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.