Keil MDK: Alignment bei Bitfields

Gast #1392260
Lesenswert?

Hallo an alle,

ich schreibe gerade einen TCP/IP Stack für einen ARM. Ich benutze die 
Keil MDK in Version 3.5. Die Daten werden dabei mit Strukturen 
verwaltet.
1
typedef __packed struct  
2
{
3
        uint16_t srcPort;
4
        uint16_t dstPort;
5
        uint32_t seq;
6
        uint32_t ack;
7
        uint16 headerlen      : 4;
8
        uint16 res            : 6;
9
        uint16 flags          : 6;
10
        uint16_t windowSize;
11
        uint16_t checksum;
12
        uint16_t urgentPtr;
13
}
14
TCP_Header

Die Daten bis zum Bitfeld stimmen. Auch die Variablen danach haben die 
richtigen Werte. Nur die Variablen des Bitfeldes stimmen nicht. Daher 
vermute ich ein Alignment Problem.

So sollte es ausschen:
1
uint16_t 0x7002
2

3
.headerlen = 7
4
.res = 0
5
.flags = 2

Leider stimmen die Werte nicht. Wie kann ich Keil sagen, das Alignment 
anzupassen?

Danke im Voraus
lg Martin
#1392340
Lesenswert?

Versuchs mal mit __packed


Also so:

typedef __packed struct
{
        uint16_t srcPort;
        uint16_t dstPort;
        uint32_t seq;
        uint32_t ack;
        uint16 headerlen      : 4;
        uint16 res            : 6;
        uint16 flags          : 6;
        uint16_t windowSize;
        uint16_t checksum;
        uint16_t urgentPtr;
}
TCP_Header __packed

Gruss Helmi
Gast #1392353
Lesenswert?

Hallo Helmut,

__packed benutze ich ja bereits. Siehe obiges Snippet. Bei der 
Deklaration des Pointers hilft es auch nicht, wobei ich denke, dass das 
__packet hier nicht sinnvoll ist, oder?

lg Martin
Gast #1392382
Lesenswert?

Die Werte kommen per Netzwerk rein. Ein TCP_Header Zeiger zeigt mit 
einem Offset auf den Empfangspuffer. Der Wert 0x7002 für das 16-Bit Wort 
stimmt.

Die Aufteilung so habe ich schon gesehen, verstehe jedoch nicht warum 
diese so zustande kommt.
Gast #1392397
Lesenswert?

Hallo,

Ich dachte der Endian-Effekt tritt erst auf, wenn ich Variablen größer 1 
Byte habe.

Gibt es eine Möglichkeit, die Endian bei einem Bitfeld zu ändern??

Die anderen Werte stimmen. Bzw rechne ich bereits auf Little Endian um.

lg Martin
#1392398
Lesenswert?

Martin schrieb:
> Hallo,
>
> Ich dachte der Endian-Effekt tritt erst auf, wenn ich Variablen größer 1
> Byte habe.

Hast du doch: die 3 Bitfelder sind zusammen 16 Bit, also mehr als
eines. Und damit wird es gedreht...

>
> Gibt es eine Möglichkeit, die Endian bei einem Bitfeld zu ändern??

Nein.

>
> Die anderen Werte stimmen. Bzw rechne ich bereits auf Little Endian um.

Na dann...

>
> lg Martin

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