Gast
#3680722
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?
|
Anzeige
|
Boolean in C
Gast
#3680722
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?
Gast
#3680726
#include <stdbool.h> aber warum nicht uint8_t nehmen? Platz sparst du damit eh nicht.
Gast
#3680731
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?
Gast
#3680732
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.
Gast
#3680739
Finja schrieb: > Warum spar ich keinen Platz? > Boolean ist 1 Bit, uint8_t wohl 8 Bits? aber 1bit lässt sich nicht adressieren.
Gast
#3680742
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.
Gast
#3680755
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 :(
Gast
#3680761
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.
Gast
#3680771
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.
Gast
#3680772
TriHexagon schrieb: > Oder du baust dir ein struct mit Bitfeldern, Wie bau ich denn einen solchen?
Gast
#3680776
Ein Boolean frisst in C immer 8 Bit. Du kannst aber booleans zusammenfassen.
Braucht ein Byte. Gruss, René
Gast
#3681024
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
Gast
#3681061
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:
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.
Gast
#3681092
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.
Gast
#3681108
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.
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
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. Ε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. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|