Moin ! Kurze Frage: Falls ich eine Variabl, die nur 1Bit groß ist deklarieren möchte, wie mach ich das am besten? bit x = 0; erkennt mein Keil Compiler nicht an? mfg Daniel
In C? Das geht nicht. Die kleinste Einheit ist in C ein Byte. Allerdings kann man auf jedes einzelne Bit eines Byte zugreifen, indem man Maskierungen benutzt. Ganz genau so, wie du in einem Register ein Bit setzt um eine Funktionalität ein oder auszuschalten.
Hi ! In C...das muss doch auch irgendwie gehen? Also ich bin mir ziemlich sicher, dass es geht? Genau wie char x , muss das auch als bit x funktionieren? Mit meinem CodeVision AVR C Compiler geht das auch in C !
da es genau abzuwägen gilt, ob der Verwaltungsaufwand durch die Ersparnis von Speicherplatz gerechtfertigt ist. Den von Dir gewünschten Datentyp gibt esv nicht! Du kannst Dir ein Hilfskonstrukt basteln, wobei ich Dir zum Basistyp unsigned char raten würde. Du dimensionierst Dein Array der Länge n dann eben auf n/8+1 und speicherst das Element mit ungeraden Indizes im ersten Bit, die mit geraden Indizes kommen in die restlichen 7. oder du machst dir ne bool varialbe die kann auch nur 1 oder 0 sein :D:D:D:D
da habe ich auch schon mal was von gehört !? bool x = 0; Definition so ok ?
Mit bool oder boolean hatte ich es auch schon probiert. Will der Compiler aber nicht. Habs damals im WinAVR ausprobiert. Aber mag ja sein, dass es mittlerweile geht?!
Nee ..habe ich gerade mal ausprobiert..nichts geht? bool,Bool, BOOL erkennt der Compiler nicht an ! Das kann doch nicht so unständlich sein...?
wenn Du mehr als ein Boolean brauchst, kannst Du ein char definieren und die Bits dann einzeln setzen, löschen und auswerten.
Mensch bevor ihr irgend etwas Postet sollt ihr mal erst suchen, um die Falsh Antworten oder besser gesagt falsche information zu reduzieren. Es geht natürlich, man kann in C(gcc) ein bit Variable deklarieren siehe dazu gcc tutorial diese Seite Bitfelder http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial struct { unsigned char bStatus_1:1; // 1 Bit für bStatus_1 unsigned char bStatus_2:1; // 1 Bit für bStatus_2 unsigned char bNochNBit:1; // Und hier noch mal ein Bit unsigned char b2Bits:2; // Dieses Feld ist 2 Bits breit // All das hat in einer einzigen Byte-Variable Platz. // die 3 verbleibenden Bits bleiben ungenutzt } x;
jawollo. öhm, und bool (boolean) nimmt unter C imho auch ein ganzes byte weg - der zustand darf aber nur TRUE oder FALSE sein. da muss man sich was eigenes basteln (siehe GISMO's beitrag). pumpkin
Daniel Blum wrote: > Moin ! > Kurze Frage: Falls ich eine Variabl, die nur 1Bit groß ist deklarieren > möchte, wie mach ich das am besten? > > bit x = 0; > > erkennt mein Keil Compiler nicht an? Tut mit leid, aber ich kann nicht in Deinen Kopf sehen. Welcher Keil ? Welches Target ? Welche Fehlermeldung ? Der Keil C51 für 8051-er kennt jedenfalls den bit Typ. Und der 8051 hat auch direkte Bitbefehle (setzen, löschen, umdrehen, testen usw.). Peter
> Es geht natürlich,
Das kommt drauf an wie man es sieht.
Natürlich sind das Bitvariablen. Sie verbrauchen allerdings
immer noch 1 Byte an Speicherplatz (alle zusammen). Du hast
damit als Vorteil gegenüber einer Maskierungslösung lediglich,
dass dir der Compiler die lästige Maskierung und Bitschieberei
abnimmt. Das Problem dabei ist: Die Maskiererei und Bitschieberei
passiert unter Decke und so mancher Programmierer ist sich des
Aufwands den der dem Programm mit einem simplen
bStatus = 1;
aufbürdet, gar nicht bewusst.
Karl heinz Buchegger wrote: > Das Problem dabei ist: Die Maskiererei und Bitschieberei > passiert unter Decke und so mancher Programmierer ist sich des > Aufwands den der dem Programm mit einem simplen > > bStatus = 1; > > aufbürdet, gar nicht bewusst. Nun, beim 8051 passiert das direkt in Hardware, er hat ja 128 Bitvariablen mit diesen Befehlen: SETB bit CLR bit CPL bit JB bit JBC bit JNB bit MOV C, bit MOV bit, C ORL C, bit ORL C, /bit ANL C, bit ANL C, /bit Bitzugriffe sind also überhaupt kein Aufwand für den Compiler. Diese Befehle gehen natürlich auch auf die Ports und andere bitadressierbare IO-Register. Man hatte sich damals (1982) ne Menge äußerst cleverer Gedanken gemacht, um Steuerungen effektiv zu programmieren. Peter
@Peter KEIL µVision3 ARM7 STR7 #20: identifier "bit" is undefined Naja, wenn er bit nicht kennt, dann gibt er natürlich diese Fehlermeldung aus. Ich dachte es wäre relativ simpel sowas zu deklarieren, wie beim CodeVision AVR Compiler, da gibt es das "bit" halt auch!
@Peter Die neueren AVRs können so etwas auch mit den GPIORs. Genau das tut der CodeVision mit Bitvariablen. - Michael
tja, bei Einzelbitverarbeitung ist der 8051 schon ne Klasse für sich. Wie sieht das eigentlich bei den moderneren Derivaten aus, die nicht mehr mit clk/12 arbeiten? Profitieren die Einzelbitbefehle genauso wie der Rest? Und wie sieht es beim AVR mit den GPIORx aus? Gibts irgendwo eine Übersicht, welche Typen diese I/O-Bitregister haben (können direkt mit SBI,CBI,SBIS,SBIC benutzt werden)? Bis jetzt sind sie mir nur beim Tiny2313 bewusst untergekommen. Die vereinfachen das Einzelbit-handling schon eneorm.
Probiers doch mal mit: const char VARIABLE = 1; wäre dann bit 0 und const char VARIABLE = 8; wäre bit 7. Vorausgesetzt du programmierst in C.
@crazy horse Von der CV Homepage: Support for placing bit variables in the General Purpose I/O Registers (GPIOR) available in the new chips (ATtiny2313, ATmega48/88/168, ATmega165/169/325/3250/329/3290/645/6450/649/6490, ATmega1280/1281/2560/2561/640, ATmega406) - Michael
crazy horse wrote: > tja, bei Einzelbitverarbeitung ist der 8051 schon ne Klasse für sich. > Wie sieht das eigentlich bei den moderneren Derivaten aus, die nicht > mehr mit clk/12 arbeiten? Profitieren die Einzelbitbefehle genauso wie > der Rest? Natürlich, warum sollte es da anders sein ? Allerdings könne die auch nicht hexen, d.h. die Befehle laufen parallel ab (Ausführung eines Befehls + holen des nächsten Befehls). Das ergibt dann auch diesen lustigen Effekt, wenn man einen Portpin setzt und direkt danach testet, daß er noch den alten Zustand hat. Peter
Hi! GPIOR ist die neue Form und wenn vorhanden nehme ich die auch. Meistens ist ein uC aber nicht zu 100% ausgelastet und man hat irgendwo ein Register was eigentlich nicht benötigt wird und auch keine Aktionen erzeugt. UBRRL wenn ohne UART,EEAR/EEDR wenn kein EE verwendet,OCR1AL...... sind zb. solche. Da verstecke ich meistens meine "Programmbits". Das ist zwar nicht unbedingt ein sauberer Stiel, aber recht hilfreich. Wenn man die Sache auch noch vernünftig deklariert bleibt es auch lesbar. MFG Uwe
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.