Hallo, Gibt es bei AVR-Studio/AtmelStudio in C gar kein Datentyp der ein bit enthält? Boolean oder so? bool und boolean werden bei mir nicht erkannt, hat jemand einen Tipp?
#include <stdbool.h> aber warum nicht uint8_t nehmen? Platz sparst du damit eh nicht.
Peter II schrieb: > aber warum nicht uint8_t nehmen? Platz sparst du damit eh nicht. Warum spar ich keinen Platz? Boolean ist 1 Bit, uint8_t wohl 8 Bits?
Finja schrieb: > bool und boolean werden bei mir nicht erkannt, hat jemand einen Tipp? Nicht nur in AVR-Studio/AtmelStudio gibt es in C keinen boolean Datentyp, wenn du ihn nicht selbst definierst. Die logischen Prüfungen in C sind Tests auf "ungleich 0" Guck mal in dein C-Buch oder frage Google.
Finja schrieb: > Warum spar ich keinen Platz? > Boolean ist 1 Bit, uint8_t wohl 8 Bits? aber 1bit lässt sich nicht adressieren.
Finja schrieb: > Warum spar ich keinen Platz? > Boolean ist 1 Bit, uint8_t wohl 8 Bits? Ohne großen Zwergenaufstand kann dein µC aber nur ganze Speicherstellen adressieren. Und in dem Datenblatt von deinem µC kannst du gucken, wie groß die sind.
Mike schrieb: > Ohne großen Zwergenaufstand kann dein µC aber nur ganze Speicherstellen > adressieren. Und in dem Datenblatt von deinem µC kannst du gucken, wie > groß die sind. Die sind dann gewöhnlich vermutlich 8 bit groß oder? Keine Lust das ganze Datenblatt durchzukramen .. Dann verschwende ich ja bei meinem ATmega8 massig platz, wenn ich für jedes bit ein ganzes Byte blockiere :(
Du kannst auch einen uint8_t verwenden und die einzelnen 8 Bits benutzen. Oder du baust dir ein struct mit Bitfeldern, dann ist es angenehmer die zu verwenden in C. Kommt aber das Gleiche heraus.
Finja schrieb: > Keine Lust das ganze Datenblatt durchzukramen .. Dafür sind Datenblätter aber da. Dass man sie liest. Finja schrieb: > wenn ich für > jedes bit ein ganzes Byte blockiere :( Das kannst Du über #define regeln. Schau Dir mal die include-Datei für deinen AVR an, dort kannst Du an PIN-Definitionen sehen, was ich damit meine. Dann kannst Du mit einem Byte 8 Bits Deiner Anwendung realisieren. Schlüsselwort: Makro.
Ein Boolean frisst in C immer 8 Bit. Du kannst aber booleans zusammenfassen.
1 | typedef struct { |
2 | uint8_t bool_1 : 1; |
3 | uint8_t bool_2 : 1; |
4 | uint8_t bool_3 : 1; |
5 | uint8_t bool_4 : 1; |
6 | |
7 | uint8_t bool_5 : 1; |
8 | uint8_t bool_6 : 1; |
9 | uint8_t bool_7 : 1; |
10 | uint8_t bool_8 : 1; |
11 | } status_t; |
Braucht ein Byte. Gruss, René
Rene H. schrieb: > Du kannst aber booleans zusammenfassen. > typedef struct { > uint8_t bool_1 : 1; > uint8_t bool_2 : 1; > uint8_t bool_3 : 1; > uint8_t bool_4 : 1; > > uint8_t bool_5 : 1; > uint8_t bool_6 : 1; > uint8_t bool_7 : 1; > uint8_t bool_8 : 1; > } status_t; > > Braucht ein Byte. Kann ich damit auch ne "Boolean-Array" erstellen, bei der ein boolean auch wirklich nur ein Bit braucht?
Mike schrieb: > Ohne großen Zwergenaufstand kann dein µC aber nur ganze Speicherstellen > adressieren. Und in dem Datenblatt von deinem µC kannst du gucken, wie > groß die sind. gilt immer noch, daher immer noch nein - daran ändern auch ein struct nichts. ich empfehle K&R
Finja schrieb: > Gibt es bei AVR-Studio/AtmelStudio in C gar kein Datentyp der ein bit > enthält? Das hat nichts mit der IDE zu tun! Finja schrieb: > ein boolean > auch wirklich nur ein Bit braucht? Wenniger als 1 Byte kann man nicht adressieren! Und damit gibt es auch keine Variablen die kleiner sind als 1 Byte. Versteh das einfach: deine Variablen, egal von welchem Typ, sind immer mindestens 1 Byte groß, immer! Weniger geht nicht! Selbst wenn du folgendes machen würdest:
1 | typedef struct { |
2 | uint8_t my_bool : 1; |
3 | } status_t; |
Eine Variable vom Typ status_t wäre trotzdem 1 Byte groß, weniger geht nicht! Daniel F. schrieb: > ich empfehle K&R Damit sind wir auch bei dem wichtigsten Hinweis an dieser stelle: Lies ein C-Buch! Und mit Buch meine ich auch Buch und nicht Online-Tutorial-Müll! Die Dinger strotzen reihenweise von Fehler, die davon zeugen, das die Ersteller selbst, noch nie ein C-Buch gesehen haben.
Es ist möglich ein Bit-Array anzulegen. Die "Mindestgröße" ist aber immer ein vielfaches von 8 Bit bzw. einem Byte. Über die zugehörigen Manipulatoren ist auch ein gezielter Zugriff möglich. GANZ WICHTIG: DIES HAT ABER NICHTS MIT DEM KLASSISCHEN DATENTYPEN BOOL BZW. BOOLEAN ZUTUN. Es hindert Dich aber nichts diese Interpretation vorzunehmen.
Finja schrieb: > Peter II schrieb: >> aber warum nicht uint8_t nehmen? Platz sparst du damit eh nicht. > > Warum spar ich keinen Platz? > Boolean ist 1 Bit, uint8_t wohl 8 Bits? Stoff zum Nachdenken: Hast Du überhaupt genügend viele Booleans damit das in irgendeiner relevanten Art und Weise ins Gewicht fallen würde? Es gibt sicher Algorithmen (Sieb des Eratosthenes z.B.) wo das der Fall ist, aber so im Allgemeinen...
Hier mal ein kleiner Ausschnitt aus einem meiner Pic Assembler Progis.
1 | CBLOCK 0x20 ; |
2 | DCF_Flags ; bit0=1Sec. Bit1=DCF77_Timer Bit2=DCFBitFlag Bit3=DCF_Bit |
3 | ; Bit=4 DCF_Error_Bit Bit=5 DCF_Stellen, Bit6=DCF_NeueM_Flag |
4 | ...
|
5 | #Define Sec_Flag DCF_Flags,H'0' ; Ausnahmsweise in DCF_Flag ?!?!?
|
6 | #Define DCF_Stellen_Flag DCF_Flags,H'1' ; wenn Hi DCF_Time OK Neue Minute beginnt
|
7 | #Define DCF_Port_Flag DCF_Flags,H'2' ; zum feststellen ob bereits Hi or Lo war
|
8 | #Define DCF_Bit DCF_Flags,H'3' ; Hi or Lo vom DCF77 Modul
|
9 | #Define DCF_Error_Flag DCF_Flags,H'4'
|
10 | #Define DCF_Rise_Flag DCF_Flags,H'5' ; Hi = Timer STOP, Bit auswerten
|
11 | #Define DCF_Sink_Flag DCF_Flags,H'6' ; Hi = Timer START, Bit beginnt
|
12 | #Define DCF_NeueM_Flag DCF_Flags,H'7'
|
Wenn ich das "zu Fuß" kann, könnte das ein Compiler auch, ob man ihn auch dazu bewegen kann is ne andre Sache. Werde das mal, bei Gelegenheit, mit dem XC8 testen. (bin nich wirklich ein C Spezialist :)
Das ist abe auch ein Byte. Und der Compiler kann das, das hat ja Rene schon gezeigt: Beitrag "Re: Boolean in C" Du musst halt nur die Bezeichner ändern. Von bool_1 in Sec_Flag usw.
Finja schrieb: > Dann verschwende ich ja bei meinem ATmega8 massig platz, wenn ich für > jedes bit ein ganzes Byte blockiere :( Kann man pauschal nicht sagen, das kommt darauf an... Was hast Du eigentlich vor? / Für was brauchst Du ein Boolean?
Teo Derix schrieb: > Hier mal ein kleiner Ausschnitt aus einem meiner Pic Assembler Progis... Genau das lässt sich wunderschön, fast 1:1 in Bitfelder übersetzen. Dann hast du ein Byte für eine "struct DCF", und kannst mit
1 | if (DCF.Error_Flag) { |
2 | DCF.Error_Flag = 0; |
3 | }
|
4 | ...
|
5 | DCF.Bit = ! DCF.Bit; |
6 | ...
|
usw. auf die EinzelBits zugreifen. Kannst sogar mit Bitbreiten != 1 arbeiten, und so z.B. die aktuelle Stunde in fünf Bits speichern, und trotzdem mit "DCF.Stunde++" darauf rechnen.
Dirk B. schrieb: > Das ist abe auch ein Byte. Schon klar das ein einzelne bit-Variable immer min. 1 Byte braucht. Da hab ich wohl, beim überfliegen, ein paar Schreier "das geht nicht, kann man nicht adressieren...", missverstanden. Was mich an den Thema eigentlich interessiert, da der CX8 ja den Datentype Bit kennt, ob das auch (ohne/mit Optimierungseinstellung) so, bei Verwendung mehrerer Bit Variablen, zusammengefasst /optimiert wird?
Auch 8051er Mikrocontroller haben Bit-addressierbaren Speicher. Wird halt je nach Compiler durch spezielle Erweiterungen, also Abweichungen vom C-Standard, umgesetzt. AVRs haben einen solchen Speicherbereich nicht, also enthält der AVR-GCC auch keine Hacks, um sowas zu unterstützen. Und ein automatisches Zusammenfassen von mehreren Booleans zu einem Byte macht auf AVRs auch wenig Sinn: Der Zugriff ist langsamer, und Speicher ist normalerweise sowieso genug vorhanden. (Für ungenutztes RAM gibt's kein Geld zurück!) Und, wenn es im Sonderfall doch Sinn macht, kann der Programmierer das ganz ganz einfach selber machen, sh. Bitfelder.
:
Bearbeitet durch User
Εrnst B✶ schrieb: > AVRs haben einen solchen Speicherbereich nicht, also enthält der AVR-GCC > auch keine Hacks, um sowas zu unterstützen. Doch, die unteren 32 IO-Register sind (zumindest in gewissen Grenzen) bit-adressierbar. Daher gibt es bei einigen AVRs dort auch Register mit dem Namen GPIO<n>, bei denen an den Registerbits keinerlei Hardware angeschlossen worden ist. Einen eigenen Datentypen hat man denen jedoch trotzdem nicht spendiert. Der Programmierer muss sich also selbst drum kümmern, wie er die Aufteilung vornimmt. Sollte bei den paar Bits, die auf diese Weise zur Verfügung stehen, aber kein Thema sein.
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.