Forum: Mikrocontroller und Digitale Elektronik Struct C30(PIC)


von cnewbe (Gast)


Lesenswert?

Hallo,
ich möchte eine struct folgend benutzen:
1
struct {
2
    char ch;
3
    int i;
4
    char ch2;
5
}daten;
6
7
char *ptr = (char*)&daten;
8
9
daten.i = 1000;
10
//usw OK
11
for(....)
12
{
13
*ptr++=wertX;
14
}
nun hab ich das Problem das der C30 Compiler die 2 chars auf int 
auffüllt.
Wie kann man sowas umgehen?

von Andreas K. (a-k)


Lesenswert?

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

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

von cnewbe (Gast)


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

von Andreas K. (a-k)


Lesenswert?

Vorher dachte ich, ich hätte es verstanden. Jetzt verstehe ich garnichts 
mehr. Sorry.

von Karl H. (kbuchegg)


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.

von Andreas K. (a-k)


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...

von Karl H. (kbuchegg)


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.

von cnewbe (Gast)


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

von Andreas K. (a-k)


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.

von cnewbe (Gast)


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.
1
Die oberste Compiler-Direktive beachten, die da lautet:
2
Du sollst deinen Compiler nicht anlügen!
Irgendwie muss ich Ihn doch anlügen um das uneffiziente Datengeschiebe 
zu vermeiden.

von Karl H. (kbuchegg)


Lesenswert?

cnewbe wrote:
>
1
> Die oberste Compiler-Direktive beachten, die da lautet:
2
> Du sollst deinen Compiler nicht anlügen!
3
>
> 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.

von cnewbe (Gast)


Lesenswert?

Hallo nochmal,
danke für die Hilfe jetzt gehts.
1
struct {
2
    char ch;
3
    int i __attribute__((packed));
4
    char ch2 __attribute__((packed));
5
}daten;
6
//oder
7
struct {
8
    char dummy __attribute__((aligned));
9
    char ch;
10
    int i __attribute__((packed));
11
    char ch2 __attribute__((packed));
12
}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

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.