Die Lösung findest du hier. Dort ist genau dein Problem angesprochen .. die Lösung: Bitfelder.
Grüße Tobi
Hallo,
in meinem Programm brauche ich einige Variable, die nur den Wert 1 oder 0 speichern müssen.
Wie programmiert man so etwas speichersparend?
Die Variable Char oder Short Int braucht mindestens ein ganzes Byte; ich muß aber nicht pro Variable 256 verschiedene Möglichkeiten speichern, sondern nur zwei.
Kann mir jemand bitte weiterhelfen?
Ali_Baba
Die Lösung findest du hier. Dort ist genau dein Problem angesprochen .. die Lösung: Bitfelder.
Grüße Tobi
Herzlichen Dank!!
Falls es um avr-gcc geht: Den Code, den der für Bitfelder produziert, ist monströs. Um ein paar Bytes RAM zu sparen, wird man nich den Code dermassen aufblähen wollen, wie der avr-gcc das (noch) für Bitfelder tun.
Eine Alternative ist Bitfummelei mit Masken, die aber zugegebenermassen nicht schon zu lesen ist. Über Makros kann man das etwas schönschminken.
Wie auch immer: Ob Bitfelder oder Bitgefummel; um zB ein einziges Bit zu setzen braucht man mindestens 10 Bytes an Programmspeicher, bei Bitfeldern eher doppelt so viele. Von der Laufzeit dafür ganz zu schweigen.
Einige neue AVR-Derivate haben GPIOR-Register, die man zur freien Verfügung hat. Auf einem ATmega*8 zum Beispiel liegt GPIOR0 im Bit-adressierbaren SFR-Bereich.
Dieses Register ist damit optimal prädestiniert, um Flags darin unterzubringen: Setzen bzw. Rücksetzen kosten jeweils 2 Byte und 2 Ticks, und ein Abtesten 4 Bytes.
Weiterer Vortail: Die Zugriffe sind atomar, d.h. man kann die Flags zur Kommunikation zwischen ISRs und Anwendung hernehmen, ohne beim Setzen/Rücksetzen ständig die IRQs deaktivieren/reaktivieren zu müssen. In dem Fall spart das weitere kostbare Zeit und Speicherplatz.
Zum Schreiben eines solchen Flags sollten immer 0 bzw. 1 verwendet werden, um den besten und atomaren Code zu bekommen, auch wenn's etwas mehr hinzutexten ist:
Code:#define FLAGS GPIOR0 // gut if (x) FLAGS |= (1 << 3); else FLAGS &= ~(1 << 3); // schlecht: FLAGS = (FLAGS & ~(1 << 3)) | ((x & 1) << 3);
Disclaimer: none. Sue me.
Lesezeichen