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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.