1 Bit Variabel deklarieren

Gast #431944
Lesenswert?

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 !
#431948
Lesenswert?

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
Gast #431963
Lesenswert?

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;
Gast #431972
Lesenswert?

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
#431976
Lesenswert?

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
#431980
Lesenswert?

> 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.
#432029
Lesenswert?

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
Gast #432033
Lesenswert?

@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!

Gast #432038
Lesenswert?

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.
Gast #432052
Lesenswert?

@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
#432128
Lesenswert?

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
Gast #432320
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren