PC kompatible structs

Gast #626680
Lesenswert?
• ▲
▼
Moin, moin,

zwischen einem AVR- und einem PC-Programm verschicke ich viele 
unterschidliche Nachrichtentypen (jeder Typ besteht aus einem eigenen 
Struct).
Bisher zerlege ich das Struct auf AVR-Seite in ein char-Array übertrage 
dieses und baue auf PC-Seite wieder ein Struct zusammen. Dadurch muss 
ich für jeden Nachrichtentyp zwei Funktionen schreiben, die die ganze 
Kommunikation sehr unflexibel gestalltet.
Ich würde nun gerne das Zerlegung/Zusammenbauen vereinheitlichen, dazu 
müsste aber die Speicherdastellung auf PC und AVR gleich aussehen. Gibt 
es eine Möglichkeit dies zu erreichen?

Beispiel:
1
typedef struct Tpacket {
2
  char c;
3
  int32_t i;
4
};
Speicherbelegung 8-Bit (AVR):
| c | i | i | i | i |
Speicherbelegung 32-Bit (PC):
| c |   |   |   | i | i | i | i |
Gast #626694
Lesenswert?
• ▲
▼
Ich würde lieber auf der AVR-Seite an den passenden Stellen Zusatzbytes 
einfügen bzw. die Reihenfolge der struct-Elemente geschickter wählen.
Am PC wird ein Fehlalingment nur mit langsamerem Zugriff bestraft, aber 
wenn du stattdessen mal was anderes verwendest, kann es je nach 
Plattform auch einen Crash geben. Dann bist du wieder zurück am Start.
Gast #626939
Lesenswert?
• ▲
▼
Du kannst ja auch beides kombinieren, also packen und die Elemente
nach absteigender Größe sortieren. Dann funktioniert's und die
Zugriffe sind maximal schnell. Machst dur beim Sortieren einen Fehler,
wird's zwar etwas langsamer, funktioniert aber auf Grund der Packerei
immer noch korrekt.

Das Ganze versagt natürlich, wenn de eines Tages auf einer der beiden
Seiten einen Prozessor mit anderer Endianness benutzt. Dann musst du
doch wieder die Strukturen elementweise in Bytearrays kopieren. Aber
wenn der AVR und der PC sozusagen ein untrennbares Gesamtsystem
bilden, ist das direkte Übertragen von Strukturen schon ok.
#626957
Lesenswert?
• ▲
▼
Mit Verlaub, aber das Geschwindigkeitsargument ist doch ziemlich 
daneben. Die Kosten für Misalignment auf dem PC kann man sich zwar 
ausrechnen, aber im Leben nicht messen, wenn die Kiste unter Windows 
oder Linux läuft - die gehen einfach im Rauschen unter.
Gast #627472
Lesenswert?
• ▲
▼
> Die Kosten für Misalignment auf dem PC kann man sich zwar
> ausrechnen, aber im Leben nicht messen, wenn die Kiste unter Windows
> oder Linux läuft - die gehen einfach im Rauschen unter.

Vermutlich. Wenn du dann allerdings statt eines PCs jemals was 
anschließen, das Misalignment gar nicht unterstützt, kannst du das 
Protokoll grad mal in die Tonne treten und alles nochmal 
umkonfektionieren.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.