Forum: Compiler & IDEs msp430 packed structs


von Heiko (Gast)


Lesenswert?

Hallo,

wenn ich beim MSP430-gcc eine struct mit _attribute_ ((packed)) 
definiere, kann ich auf Wörter die an ungeraden Speicherstellen liegen 
nicht zugreifen.
Ist das ein bug im Compiler? - Gibt es einen workaround?
Ich muss für ein Protokoll ständig Buffer auf eine solche Struct casten 
um dann einzelne Werte auszulesen. Sowohl auf meinem PC als auch auf 
einem testweise zu Hilfe gezogenem LPC2148 funktioniert der Code 
tadellos...

Grüße,
Heiko

von Uhu U. (uhu)


Lesenswert?

Nein, der MSP430 kann Worte nur an geraden Adressen lesen und schreiben.

Mit _attribute_ ((packed)) weist du den Compiler an, Worte nicht auf 
gerade Adressen zu justieren. Der Prozessor nimmts dann übel...

von Heiko (Gast)


Lesenswert?

Hab ich mir auch ungefähr so gedacht. Aber ist denn nicht ein Bug, dass 
der Compiler das trotzdem so umsetzt?

von Uhu U. (uhu)


Lesenswert?

Nein. Automatisch macht er es ja richtig. Wenn du ihm was anderes sagst, 
dann geht er eben davon aus, daß du weißt, was du tust.

von Heiko (Gast)


Lesenswert?

Ok. Kann ich denn Byteweise auf die ungeraden Speicherstellen zugreifen 
und mir die Wörter selbst zusammenbauen.

Also ungefähr so:

/*Hilfskonstrukt für msp430 der nur auf gerade wörter zugreifen kann*/
uint8 *hlp = (uint8*) &entry->filesize;
res->filesize = (((uint32)(*(hlp+3)))<<24) + (((uint32)(*(hlp+2))<<16)) 
+ (((uint32)(*(hlp+1))<<8)) +(uint32)*(hlp) ;

wobei entry->filesize an einer ungeraden Speicherstelle liegt und ein 
unsigned long ist.

von Uhu U. (uhu)


Lesenswert?

> Ok. Kann ich denn Byteweise auf die ungeraden Speicherstellen zugreifen
> und mir die Wörter selbst zusammenbauen.

Klar doch. Du tauschst damit sozusagen Ram gegen Flash.

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.