Keil MDK: Alignment bei Bitfields

Gast #1392260
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
#1392297
> Leider stimmen die Werte nicht.

Bei so einer tollen Fehlerbeschreibung kommen bestimmt tolle Antworten.

Ok, hier die erste: wer sagt denn, daß headerlen in den oberen
Bits untergebracht wird und flags in den unteren, und nicht einfach
umgedreht?
#1392340
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.