Was packt __attribute__ packed ?

Gast #3063983
Lesenswert?

Worin liegt der Sinn des packed atributes?

Wie wird das packen erreicht? Ist das WinZIP für Microchip? :-)
1
typedef char byte;
2

3
struct led_portd {
4
  byte b0:1;
5
  byte b1:1;
6
  byte b2:1;
7
  byte b3:1;
8
  byte b4:1;
9
  byte b5:1;
10
  byte b6:1;
11
  byte b7:1;
12
} __attribute__((packed));
#3063990
Lesenswert?

simon schrieb:
> Worin liegt der Sinn des packed atributes?

Weniger Platzverbrauch im RAM zu Lasten von höherem Platzverbrauch im 
ROM und höherer Laufzeit.

> Wie wird das packen erreicht? Ist das WinZIP für Microchip? :-)

Es werden zwischen den einzelnen Daten keine Löcher gelassen. So wird
 struct {
    char c;
    int  i;
 };
zwischen c und i ein 3 Byte grosses Loch gelassen. Gepackt nicht.
Gast #3064013
Lesenswert?

Teilweise werden hier selbst arrays von 6 byte gepackt.

Nur warum lässt der compiler hier lücken dazwischen?!
Und zu Weiviel Byte wird das ganze gepackt?
1
// Structure to contain a MAC address
2
typedef struct __attribute__((__packed__))
3
{
4
    BYTE v[6];
5
} MAC_ADDR;
#3064020
Lesenswert?

simon schrieb:
> Nur warum lässt der compiler hier lücken dazwischen?!

Einige 32-Bit-Prozessoren (z.B. ARM7 (ARMv5), wenn ich mich richtig 
erinnere) können nur 4-byte-aliged lesen und schreiben. Bei denen wird 
natürlich dann auch die Struct so angelegt, dass jedes Byte so einen 
32-Bit-Bereich besetzt, damit direkt darauf zugegriffen werden kann.
Warum das so ist: Naja, man kann natürlich die Architektur des 
Prozessors so massiv vereinfachen.
Wenn Du Platz sparen willst, musst Du beim Zugriff auf die Datenstruktur 
die Daten jedesmal zurechtpfrümeln. Das kostet Laufzeit und ROM. Aber 
spart RAM.
Gast #3064027
Lesenswert?

Johann L. schrieb:
> Was aber vom ABI anhängt.  Ein avr-gcc macht auch ohne packed keine
> Lücke zwischen c und i.


Naja AVR hab ich für das Projekt sein lassen, Atxmega und es gibt keinen 
TCP Stack, wlan müsste man auch von grund auf an wieder zurecht basteln, 
das sind alles dinge die haste bei Microchip echt out of the box.
#3064029
Lesenswert?

Das __attribute__((packed)) hat nur Einfluß, wenn die Elemente einer 
Struct unterschiedliche Größe haben und die kleineren zuerst stehen.

Da hier aber alle gleich groß sind (1Bit), kann man es auch weglassen.
Es ist also reine Gewohnheit, jemand hat das mal so gesehen und 
übernommen.
Beim AVR-GCC mache ich das auch so (sbit.h).
#3064081
Lesenswert?

simon schrieb:
> Johann L. schrieb:
>> Was aber vom ABI anhängt.  Ein avr-gcc macht auch ohne packed keine
>> Lücke zwischen c und i.
>
> Naja AVR hab ich für das Projekt sein lassen ...

Das ist nicht der Punkt. Der Punkt ist, daß das Alignment von 
struct-Members vom ABI (oder platter gesagt: von der Plattform und dem 
verwendeten Compiler) abhängt.

Wenn der Compiler von vornherein kein Alignment macht, dann ist das 
"packed" Attribut ohne Funktion.


XL
Gast #3064092
Lesenswert?

Ich frage mich immer wieder woher man diese infos bekommt, also von 
packed hab ich in keinem C Buch je was gelesen. selbst im C18 Manual von 
Microchip ist es nicht drinne.


Habt ihr da geheime Quellen? :-)
Gast #3064234
Lesenswert?

simon schrieb:
> Ich frage mich immer wieder woher man diese infos bekommt, also von
> packed hab ich in keinem C Buch je was gelesen. selbst im C18 Manual von
> Microchip ist es nicht drinne.

Das hat auch erstmal nichts mit C zu tun, sondern mit der Plattform, auf 
der Du arbeitest.

Es gibt viele CPU-Architekturen, bei denen es unter Strafe verboten ist, 
mit 16/32/64-Bit-breiten Zugriffen auf ungerade Adressen zuzugreifen.
Z.B. der MSP430, der C167 und der PIC24.

Wenn man dies tut, gibt's einen Trap.
Aus diesem Grund ist es eine Hilfe des (plattform-abhängigen) 
C-Compilers, die Adressen bzw. Offsets so zu legen, daß es 
(normalerweise) nicht zu diesem Trap kommt. Wer weiß, was er tut, kann 
dieses Hilfe abschalten, indem er "packed" verwendet.
Auf einem 8-Bitter braucht man dies i.a.R. nicht, da dieser eh auf alle 
Adressen (gerade und ungerade) nur 8-Bit-breit zugreifen kann und daher 
diese Einschränkung nicht hat.

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