struct größer als erwartet

Gast #2471698
Lesenswert?

Hallo,

ich versuche die Konfigurationsparameter für einen externen Baustein, 
der über eine serielle Schnittstele an meinen Controller angeschlossen 
ist, in eine struct zu packen. Das mache ich, weil das Protokoll die 
Daten in einer bestimmten Reihenfolge verlangt. Vor der struct wird ein 
Header gesendet, dahinter eine Checksumme.
1
struct
2
{
3
  uint8_t  flags;
4
  uint32_t baudrate;
5
  uint8_t  mode;
6
} com_config_t;

Leider funktioniert das nicht. Komischerweise liefert 
sizeof(com_config_t) auch mehr als die erwarteten 6 Bytes zurück.

Was macht der Compiler da? Könnte das damit zusammenhängen, dass ich auf 
einem 32bit-System bin und er alles in 32 bit Schritten zusammenbaut?

Wenn ja, wie kriege ich dann meine struct implementiert, so dass ich sie 
direkt über die Schnittstelle senden kann?

Grüße und frohe Weihnachten,
der Rob
#2471709
Lesenswert?

Robert Zelder schrieb:
> Was macht der Compiler da?

Er "alignt"

Robert Zelder schrieb:
> Wenn ja, wie kriege ich dann meine struct implementiert, so dass ich sie
> direkt über die Schnittstelle senden kann?

Du bist auf einem 32-Bitter mit vermutlich vielen MHz und Flash 
unterwegs. Unabhängig davon würde ich die Felder einzeln rausschreiben.

"packed" löst das Problem, aber wenn das mal aus Versehen gelöscht wird 
... anders formuliert hängt die logische Korrektheit Deiner Applikation 
von einer relativ technischen Einstellung ab, die man eher aus 
RAM-Mangel wählt.

Beim Portieren von 8-Bit-Code auf 32-Bit habe ich damit viel "Spass" 
gehabt.
#2471855
Lesenswert?

Roland H. schrieb:
> "packed" löst das Problem, aber wenn das mal aus Versehen gelöscht wird
> ... anders formuliert hängt die logische Korrektheit Deiner Applikation
> von einer relativ technischen Einstellung ab, die man eher aus
> RAM-Mangel wählt.

Davon abgesehen gibt es durchaus Architekturen, die den Zugriff auf 
solche Strukturen gar nicht unterstützen. Andere können es, aber 
brauchen dann mehr Zeit für den Zugriff.
#2472267
Lesenswert?

Rolf Magnus schrieb:

> Davon abgesehen gibt es durchaus Architekturen, die den Zugriff auf
> solche Strukturen gar nicht unterstützen. Andere können es, aber
> brauchen dann mehr Zeit für den Zugriff.

Das ist eher eine Frage des Compilers. Denn ein Compiler kann - wenn er 
will - auch bei Architekturen, die keinen unaligned access unterstützen, 
einen Code erzeugen, der mit gepackten Strukturen umgehen kann. Die 
Effizienz ist dabei natürlich nicht berauschend.
Persönliche Seite #2472277
Lesenswert?

"packed" ist keine Lösung.

Die Lösung ist es für Binäre Protokolle keine Structs zu verwenden, 
sondern alles per Hand zusammenzubauen. Das steht hier vielfach im Forum 
und wird durch Profis wie Karl-Heinz Buchegger (hoffe keinen Unsinn zu 
erzählen ;-)) u.Ä. auch so unterstützt.

Genau so bei Bitfelder im Ürbrigen. Die Anordnung der Bits ist von 
mehreren Parameter abhängig (Endianess z.B.).
#2472280
Lesenswert?

Karl Heinz Buchegger schrieb:

> Gabs nicht auch bei den 68000 derartige Restriktionen? Ich meine mich zu
> erinnern, dass A0 da gar nicht am Adressbus verfügbar war.

Ob man die Leitungen für die Byteselektion nun LDS/UDS (68000) oder 
A0/HBE (8086) nennt ist dafür irrelevant. Krass war nur TI 9900, denn 
der hatte überhaupt keine, d.h. konnte nicht einmal byteweise schreiben, 
musst bei Byteoperationen vorher lesen.

Es ist aber richtig, dass 68000 Code und 16/32-Bit Daten an ungeraden 
Adressen nicht zuliess.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren