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...
Karl-heinz Strunk wrote:
> Woher kommt das zusätzliche Byte? "Optimierung"?
Ich habe mal alle Optimierungen ausgeschaltet. Nutzt nichts.
Gast
#1112467
Hallo, Variablen mit mehr als 1 Byte werden standardmässig immer an geraden Speicheradressen abgelegt ! Gruß Franky
> (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.
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!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.