mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8 Bytes für 8 Bit Zustände oder lieber 1 Byte?


Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
C kann ja von Hause aus keinen Datentyp für ein Bit.
Also nimmt man entweder ein Byte für ein ganzes Bit oder benutzt ein 
Byte um acht Bits zu speichern und greift dann etwas komplizierter 
darauf zu.
z.B.: status & _BV(sleep)

Die erste Lösung belegt natürlich viel Speicher im Stack, weil alle 
Variablen permanent geladen sind.
Dafür ist die Programmausführung effektiver und der Code kleiner.

Bei der zweiten Lösung bleibt der Stack klein, dafür wird das Programm 
größer und langsamer.
Für den bitweisen Zugriff auf ein Byte gibt es auch schicke Abkürzungen:
struct test {
  byte b0:1;
  byte b1:1;
  byte b2:1;
  byte b3:1;
  byte b4:1;
  byte b5:1;
  byte b6:1;
  byte b7:1;
} __attribute__((packed));

oder einfach über defines.
Aber egal wie, die bitweise Methode ist umständlicher (mehr 
Operationen).

Kann man generell sagen, welche Methode besser ist?
Habe ich noch etwas übersehen, was man beachten sollte?

Grüße

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Flo wrote:
> Kann man generell sagen, welche Methode besser ist?
Nö. Punkt.

Die Vor- und Nachteile beider Methoden hast du vollkommen richtig 
erfasst. Nun ists an dir, abzuwägen, wo es zeitkritisch ist und/oder wo 
es vom Speicher her eng wird.

> Habe ich noch etwas übersehen, was man beachten sollte?
Denke nicht. Wobei du aber beim AVR richtig gut optimieren kannst, was 
solche Bitvektoren angeht. Der AVR hat nämlich Instruktionen wie 
"Springe wenn Bit gesetzt" und so weiter; schau dir am besten mal das 
Assemblerlisting des Compilers nachher an.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Flo wrote:
> Die erste Lösung belegt natürlich viel Speicher im Stack, weil alle
> Variablen permanent geladen sind.
> Dafür ist die Programmausführung effektiver und der Code kleiner.

Dann mußt Du erstmal sagen, welche Architektur Du meinst.
Beim AVR mag das stimmen.
Beim 8051 oder ARM Cortex M3 aber nicht, die haben spezielle Bitbefehle 
direkt auf den SRAM, d.h. da ergeben Bitzugriffe auch kleineren Code.


Peter

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein ganzes Byte pro Bit zu nehmen hat auch noch den Vorteil, daß man 
kein Locking braucht, wenn nebenläufige Prozesse auf die Bits zugreifen.

Jürgen

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Neuere AVRs haben mit GPIOR0-2 3 freie Register im bitadressierbaren 
I/O-Bereich, die sich recht gut für häufig verwendete Statusbits eignen.

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.