www.mikrocontroller.net

Forum: Compiler & IDEs Platzsparen mit struct?


Autor: Robert F. (fastred)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

für eine PWM Implementierung möchte ich folgendes struct als 
Datenstruktur verwenden:
typedef struct
{
  uint8_t value; 
  uint8_t state:1; 
  uint8_t chan_id:7; 
} pwm_chan_t;

Meines Wissens nach versucht der Compiler bei der "var:n"-Notation 
Variablen zusammenzufassen, in diesen Fall also (hoffentlich) das 
einzelne Bit von state und chan_id.


Ist das bei 8-bit Systemen (AVR) sinnvoll in Hinblick auf Verbrauch von 
(S)RAM und insbesondere bei Zugriffen?
Weil die Information, dass das x. Bit eines Registers zu einer (anderen)
Variable gehört, muss ja irgendwo gespeichert werden (Kosten: min. 
8bit), und abgerufen werden (Zugriffskosten)...


Vielen Dank

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

Bewertung
0 lesenswert
nicht lesenswert
Robert F. schrieb:

> Meines Wissens nach versucht der Compiler bei der "var:n"-Notation
> Variablen zusammenzufassen,

Es läuft darauf hinaus.
Aber eigentlich definierst du damit nur 2 Bitfelder.

> in diesen Fall also (hoffentlich) das
> einzelne Bit von state und chan_id.

Kann man so sagen

> Ist das bei 8-bit Systemen (AVR) sinnvoll in Hinblick auf Verbrauch von
> (S)RAM und insbesondere bei Zugriffen?

Kommt drauf an.
Wenn du 2 Millionen derartige Objekte hast, wird die Speicherersparnis 
schon beträchtlich sein.
Hast du aber nur 2 davon, spart das gerade einmal 2 Bytes ein :-)

aber

> Weil die Information, dass das x. Bit eines Registers zu einer (anderen)
> Variable gehört, muss ja irgendwo gespeichert werden

gespeichert in dem Sinne wird es nirgends im Programm. Der Compiler 
nimmt das zur Kentnis und muss beim Zugriff auf die Bitfelder Code 
generieren, die nur die angegebenen Bits setzen/löschen. In dem Sinne 
...

 (Kosten: min.
> 8bit), und abgerufen werden (Zugriffskosten)...

... werden die Zugriffskosten höher und logischerweise auch der 
Programmcode, der für den Zugriff verantwortlich ist.


In der Programmierung gibt es eine 'Faustregel - Grundgesetz':
"Time for Space, and vice versa"

Bedeutet: Man erkauft sich oft geringere Laufzeit mit mehr 
Speicherverbrauch. Und auch umgekehrt: geringeren Speicherverbrauch mit 
erhöhter Laufzeit.

Autor: Robert F. (fastred)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mhh d.h. bei meinem Target (atmega168) und meiner Anzahl von Instanzen 
des struct (1-16) macht das also eher keinen/noch keinen Sinn ...

Wenn ich am Wochenende mal Zeit habe, kann ich mir ja mal den 
generierten ASM Code anschauen und die Takte zählen ;)

Autor: Matthias Keller (mkeller)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also macht es vermutlich keinen Unterschied wenn man in diesem Beispiel 
die Variable state einfach als 8bit int deklariert? Damit dürft dann der 
Zugriff doch einfacher sein ( je nach dem wie man die Variable nutzt). 
Ist das so richtig?

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

Bewertung
0 lesenswert
nicht lesenswert
Matthias Keller schrieb:
> also macht es vermutlich keinen Unterschied wenn man in diesem Beispiel
> die Variable state einfach als 8bit int deklariert? Damit dürft dann der
> Zugriff doch einfacher sein ( je nach dem wie man die Variable nutzt).
> Ist das so richtig?

Vermutlich hast du recht.

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.