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?
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;
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.
@Karl Heinz: die Erkenntnis war mir mittlerweile auch gekommen, ich war nur langsamer beim tippen ;) Danke!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.