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


von Flo (Gast)


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

von Sven P. (Gast)


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.

von Peter D. (peda)


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

von Jürgen (Gast)


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

von Andreas K. (a-k)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.