Forum: Compiler & IDEs Probleme mit Zuweisen von Werten an Strukturen


von Gast (Gast)


Lesenswert?

Hallo,

ich habe in einer Applikation eine globale Statusvariable SysCfg mit
folgender Struktur:


typedef unsigned char    u8;
typedef unsigned int    u16;

typedef enum {
    OPMODE_UNDEFINED = 0x00,
    NORMAL,
    DEBUG
} OperatingModeType_en;


typedef enum {
    CMD_UNDEFINED = 0x00,
    CAPTURE_START,
    CAPTURE_IN_PROGRESS,
    CAPTURE_COMPLETE
} AdcCtrlTypes_en;


typedef struct {
    u16  UcInputPins_u2:2;
    u16  DsrInputPins_u4:4;
} DigitalCaptureConfigType_t;


typedef struct {
    u16  UcInputPins_u2:2;
    u16  MuxInputPins_u5:5;
} AnalogueCaptureConfigType_t;


typedef union {
    OperatingModeType_en         OpMode;
    AdcCtrlTypes_en              AdcCtrl;
    DigitalCaptureConfigType_t   DigCap;
    AnalogueCaptureConfigType_t  AnaCap;
} SystemConfigurationType_t;

...

volatile SystemConfigurationType_t SysCfg;



Wenn ich nun einzelne Werte dieser Systemvariable verändern möchte,
z.B. mit

SysCfg.AdcCtrl = CAPTURE_START;      oder
SysCfg.DigCap.UcInputPins_u2 = 2;


werden immer _alle_ Member dieser Struktur auf den zugewiesenen Wert
gesetzt. Wenn die o.g. Beispielaufrufe tätige, bekommen _alle_ Member
zuerst den Wert 0x01, danach 0x02.

Hat jemand eine Ahnung, woran das liegen kann?

von Karl H. (kbuchegg)


Lesenswert?

Aehm.
Du hast keine Struktur. Du hast eine Union.
Bei einer Union teilen sich alle Member den Speicherplatz.
Sie ueberlagerb sich sozusagen.

typedef struct {
    OperatingModeType_en         OpMode;
    AdcCtrlTypes_en              AdcCtrl;
    DigitalCaptureConfigType_t   DigCap;
    AnalogueCaptureConfigType_t  AnaCap;
} SystemConfigurationType_t;

von Gast (Gast)


Lesenswert?

Hiho,

das Problem hat sich schon erledigt, ich hätte die Variable nicht als
'union' anlegen dürfen, zusätzlich hat AVRStudio die Werte der
Bitfelder nicht sauber dargestellt.

von Gast (Gast)


Lesenswert?

@Karl Heinz: die Erkenntnis war mir mittlerweile auch gekommen, ich war
nur langsamer beim tippen ;)

Danke!

von castle (Gast)


Lesenswert?

bei mir auch, war auch langsam...


castle

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.