www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Struct C30(PIC)


Autor: cnewbe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte eine struct folgend benutzen:
struct {
    char ch;
    int i;
    char ch2;
}daten;

char *ptr = (char*)&daten;

daten.i = 1000;
//usw OK
for(....)
{
*ptr++=wertX;
}
nun hab ich das Problem das der C30 Compiler die 2 chars auf int 
auffüllt.
Wie kann man sowas umgehen?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
struct .. { ... } __attribute__((_packed_));

Besser: die struct umsortieren, vom grossen ins kleine, also erst alle 
int, dann alle char.

Autor: cnewbe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry vielleicht zu unverständlich Formuliert.

Ich will Daten die über eine Schnittstelle kommen im richtigen Format 
haben.
=> 6 Zeichen über den pointer in die struct geschrieben sollen dann als 
2x char und 1x int wert verarbeitet werden können

vielen Dank für Hilfe

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorher dachte ich, ich hätte es verstanden. Jetzt verstehe ich garnichts 
mehr. Sorry.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
> Vorher dachte ich, ich hätte es verstanden. Jetzt verstehe ich garnichts
> mehr. Sorry.

Ich denke, du hast ihn schon richtig verstanden und er sucht
nach einer Möglichkeit das Padding abzustellen.
Wie du schon geschrieben hast:

struct .. { ... } __attribute__((packed));

macht das beim gcc.

Ob er allerings einen gcc zum compilieren nimmt, kann er nur
selbst sagen :-)

Falls sein Compiler sowas nicht unterstützt (was unwahrscheinlich
ist), kann ich nur sagen:
Die oberste Compiler-Direktive beachten, die da lautet:
Du sollst deinen Compiler nicht anlügen!

char *ptr = (char*)&daten;

ptr zeigt nicht auf ein char Feld. ptr zeigt immer noch auf eine
Struktur. Auch der cast ändert daran nichts.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:

> Ob er allerings einen gcc zum compilieren nimmt, kann er nur
> selbst sagen :-)

Ich ging stillschweigend davon aus, dass er den C30 Compiler von 
Microchip meint. Wenn er natürlich TIs C30 meint...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
> Karl heinz Buchegger wrote:
>
>> Ob er allerings einen gcc zum compilieren nimmt, kann er nur
>> selbst sagen :-)
>
> Ich ging stillschweigend davon aus, dass er den C30 Compiler von
> Microchip meint. Wenn er natürlich TIs C30 meint...

Keine Ahnung. Kenne die PIC Compiler nicht.
Aber irgendsoeine Einstellung zum Einstellen des Paddings
hat wohl jeder Compiler.
Vielleicht gibt es ja irgendwas in der Form
#pragma pack(1)

Für den OP: Sowas ist immer Compilerabhängig. Wie das bei
dir konkret heist, steht in der Doku zum Compiler.
Mit dem Stichwort 'Padding' solltest du im Index der Doku
fündig werden.

Autor: cnewbe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,
leider bin ich durch die Datenfolge an die struct gebunden.
Die __attribute__((packed)) wird bei mir vom Compiler mit einer 
Warnung Ignoriert.
beste grüsse

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cnewbe wrote:

> Die __attribute__((packed)) wird bei mir vom Compiler mit einer
> Warnung Ignoriert.

Wurde schon genannt: Doku lesen.

Und wir wissen immer noch nicht, welcher C30 es ist. In der Doku vom 
Microchip jedenfalls steht das drin, der akzeptiert das angeblich.

Autor: cnewbe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der C30 von Microchip = gcc.
Sorry die Antworten haben sich überschnitten die Info mit der 
Schnittstelle waren als Anhang gedacht nicht als Antwort auf die erste 
Antwort von  Andreas Kaiser.
Die oberste Compiler-Direktive beachten, die da lautet:
Du sollst deinen Compiler nicht anlügen!
Irgendwie muss ich Ihn doch anlügen um das uneffiziente Datengeschiebe 
zu vermeiden.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cnewbe wrote:
>
> Die oberste Compiler-Direktive beachten, die da lautet:
> Du sollst deinen Compiler nicht anlügen!
> 
> Irgendwie muss ich Ihn doch anlügen um das uneffiziente Datengeschiebe
> zu vermeiden.

:-)
Solange du weist was du tust, ist das auch ok.
Die Sache ist die: Wenn du casten musst, dann übernimmst du
alleine die Verantwortung dafür, dass das was du schreibst
auch korrekt ist. Der Compiler hält sich dann vollständig
raus und akzeptiert jede Zuweisung, auch wenn sie noch so
falsch ist.
Wenn du also weißt, dass dein Speicherlayout deiner Struktur
tatsächlich so ist, dass da ein Byte nach dem anderen folgt,
dann kannst du das tatsächlich mit dem cast so machen. Wenn
du sicherstellen kannst (und genau das macht das packing
Attribut), dass das so ist, dann ist nichts gegen den cast
einzuwenden. Aber du musst es sicherstellen.

Autor: cnewbe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,
danke für die Hilfe jetzt gehts.
struct {
    char ch;
    int i __attribute__((packed));
    char ch2 __attribute__((packed));
}daten;
//oder
struct {
    char dummy __attribute__((aligned));
    char ch;
    int i __attribute__((packed));
    char ch2 __attribute__((packed));
}daten;
Das erste ch lässt sich nicht auf eine ungerade Adresse zwingen.
Hab ein Dummybyte eingefügt da sonst der int wert nicht an einer geraden 
Adresse ist und der Compiler sonst byte zugriffe verwendet(besonders 
störend bei einem noch dazukommenden long).

mfg

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.