Forum: Mikrocontroller und Digitale Elektronik Daten in einer Struktur


von Struktur (Gast)


Lesenswert?

1
#define NAMENSLAENGE 20
2
#define DATUM 6
3
4
typedef struct
5
{                        
6
 uint16_t  Nummer;
7
 char    Name  [NAMENSLAENGE];
8
 uint8_t  Tag  [DATUM];
9
 float          Wert;
10
 uint16_t   CRC;
11
} MeineStruktur;
12
13
14
MeineStruktur Struktur1 =
15
{
16
10,
17
"HansMüller"
18
{1,1,1,1,1,1},
19
1.2,
20
33
21
};


Hallo,

liegen die Daten in dieser Struktur wirklich komplett hintereinander weg 
im Speicherbereich oder können die aus irgendwelchen Gründen verteilt 
auftreten?



Funktioniert der Aufruf unten?
1
MeineKopierFunktion(uint8_t *data, uint32_t Laenge)
2
{mach was}
3
4
5
6
Aufruf:
7
MeineKopierFunktion(uint8_t*)&Struktur1 , Laengenangabe);

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Struktur schrieb:
> oder können die aus irgendwelchen Gründen verteilt auftreten?
Sie liegen schon hintereinander, aber je nach Zielplattform können 
Stuffbytes eingefügt sein, um das Alignment auf 16 oder 32 Bit zu 
korrigieren.

von Stefan F. (Gast)


Lesenswert?

Der C Compiler hat die Freiheit, Füllbytes einzufügen. Bei vielen 
Prozessoren kann er so due Performance verbessern. Bei manchen 
Prozessoren ist es sogar zwingen nötig.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Stefan U. schrieb:
> Der C Compiler hat die Freiheit, Füllbytes einzufügen.

Es ist zwar "Implementation defined", aber freiheit hat ein Compiler 
nicht wirklich, da er sich i.d.R. an eine EABI hält, die solche Dinge 
festlegt.

von Cyblord -. (cyblord)


Lesenswert?

_attribute_ ((packed)) weist z.B. den GCC Compiler an, alles direkt 
hintereinander abzulegen.

von Struktur (Gast)


Lesenswert?

wie nutze ich dieses Attribute?
Magst du mir einen Beispielode geben?

Ich möchte bzw. muss die Struktur Bytewese an eine andere Funktion 
übergeben und möchte da natürlich genau die gleiche Reihenfolge 
wiederfinden wie in meiner ursprüngichen Struktur.
Beim Debuggen kommen im Moment am Anfang die Daten richtig an, dann 
irgendwann nicht mehr. Ich habe keine Ahnung warum und daher die Frage 
oben...

von Cyblord -. (cyblord)


Lesenswert?

Struktur schrieb:
> wie nutze ich dieses Attribute?
> Magst du mir einen Beispielode geben?

http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/015_c_strukturen_012.htm

von Peter II (Gast)


Lesenswert?

Struktur schrieb:
> Ich möchte bzw. muss die Struktur Bytewese an eine andere Funktion
> übergeben und möchte da natürlich genau die gleiche Reihenfolge

warum musst du das überhaupt?

So etwas ist oft eine schlechte Idee.

von Struktur (Gast)


Lesenswert?

Tausend DANK!

Funktioniert mit der pragma directive.


Eine Frage:
Woher weiß man das?

Ich brauche wikrlich dringend ein C Buch, das diese ganzen Dinge, die 
man einfach wissen muss behandelt. So etwas kommt irgendwie immer zu 
kurz.

von Dirk B. (dirkb2)


Lesenswert?

Struktur schrieb:
> Ich möchte bzw. muss die Struktur Bytewese an eine andere Funktion
> übergeben und möchte da natürlich genau die gleiche Reihenfolge
> wiederfinden wie in meiner ursprüngichen Struktur.

Wenn das mit denselben Compilereinstellungen compiliert wurde, spielen 
die Füllbytes keine Rolle

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Die pragma directiven sind am besten in der Dokumentation vom Compiler 
beschrieben, da jeder Compiler andere unterstützt.

von Cyblord -. (cyblord)


Lesenswert?

Ja also die ganze Vorgehensweise ist schon falsch. Wann braucht man das 
überhaupt? Bei Embedded meist wenn man Daten physikalisch woanders hin 
haben will, sei es in einen Flash-Speicher schreiben oder über eine 
Schnittstelle senden. Dann kann man ein Struct nehmen und in einen void 
Pointer stopfen und das wird dann übertragen. Hier möchte man keine 
Lücken, weil man sonst am anderen Ende die Daten nicht mehr so leicht 
zusammenbauen kann.

Aber innerhalb eines Programmes, innerhalb des RAMs so einen Stunt zu 
machen ist meist unnötig. Entweder man greift direkt über die Feldnamen 
zu, oder man kopiert in diesselbe Struktur an einer anderen 
Speicherstelle. In beiden Fällen ist es egal wie die Daten gepackt sind.

Mich würde die konkrete Anwendung interessieren.

von Struktur (Gast)


Lesenswert?

Es handelt sich tatsächlich um die Übertragung in einen Flashspeicher 
und genau da sind mir mittendrin Daten verloren gegangen.

von Cyblord -. (cyblord)


Lesenswert?

Struktur schrieb:
> Es handelt sich tatsächlich um die Übertragung in einen Flashspeicher
> und genau da sind mir mittendrin Daten verloren gegangen.

Sagen wir mal so. Wenn die Daten übertragen und irgendwann wieder in 
diese Struktur zurückgelesen werden, dann dürfte es auch kein Problem 
geben. Erst wenn du die Daten mit einem anderen Programm verarbeiten 
willst, sollten dir die Lücken auffallen.

von Wilhelm M. (wimalopaan)


Lesenswert?

Das Problem tritt regelmäßig auf, wenn man eine Datenstruktur in einem 
binären Datenstrom bspw. über ein Netzwerk auf eine andere Maschine 
übertragen will. Die andere Maschine verwendet i.A. nicht nur ein 
anderes Alignment (und damit ein anderes padding zwischen den 
Datenelementen des struct), sondern hat ggf. andere Größen der 
primitiven DT und ggf. eine andere Endianess.

Deswegen benutzt man eine solche binäre Serialisierung ungern. Entweder 
verwendet man ein sog. External Data Representation wir XDR oder 
verpackt alles als ASCII bspw. in XML.

Innerhalb eines Systems ist das natürlich kein Problem (sofern man mit 
dem "Verschwenden" des Speichers leben kann).

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.