Arduino HIGH LOW "Byte" Variable oder "Bool"?
Guten Tag Allerseits
Nach langem habe ich mal weider mit arduino gearbeitet und dabei mich von einem Sketch inspirieren lassen (https://roboticsbackend.com/arduino-turn-led-on-and-off-with-button/)
Was mir auffiel ist, dass für Binäre Signale eine Byte variable verwendet wird:
void loop() {
byte buttonState = digitalRead(BUTTON_PIN);
Meine Frage ist nun ob hier Bool nicht besser wäre da es weniger speicher braucht und meiner meinung nach mehr Sinn machen würde?
Falls dem nicht so wäre, kann mir jemand erklären wieso?
Grüsse
2 Antworten
I/O wird 8-bit wise gemacht. Bool, auch wenn nur zwei Zustände beschreibend, wird normalerweise auch nicht als ein-bit Information gespeichert, denn das eine bit aus einem Byte extrahieren zu müssen, wiegt den Vorteil gegenüber 7 "verschwendeten" bits nicht auf.
Auch wenn du die anderen bits im Programm nicht siehst, false wird meist als 0, und true als "irgend etwas anderes" dargestellt. Populär sind bit 0 gesetzt, und auch alle bits gesetzt, für ein "echtes" true.
Dsa aber bei kleinen Controllern ein byte die übliche kleinster Speichereinheit ist, die ins RAM (oder I/O) geschrieben wird oder gelesen wird, ist Verwendung eines Bytes ebendalls adäquat. Mit Wissen um die verwendeten bits eventuell sogar effizienter, da ein "irgendwas-true" nicht unbedingt in ein "echtes true" umgewandelt werden braucht.
Aber das ganze byte wird dann nicht als bool verwendet werden, da erst das entsprechende bit maskiert werden muß. Konsistent mit dem was ich schrieb in der Hinsicht, dass bits nicht einzeln gelesen werden, sondern meist zuallermindest byte-weise, also mit "fremden" bits auch noch drin.
"Maskieren" wie in "ungewünschte bits entfernen". Nimmst du ein ganzes byte als bool, entfällt diese Notwendigkeit,
Genau, was ja aus meiner sicht weniger speicher benötigt als die herangehensweise für jeden Eingang ein Byte zu verwenden.
Allerdings verstehe ich den Vorteil nicht, wenn ein ganzes byte benutzt wird. Es gibt ja den vordefinierten Datentypen Bool welcher das Maskieren aus dem Byte unnötig macht oder sehe ich das falsch?
Nehm an, du hast 2 bools. Und nehm an, die würden in einem byte stecken (und noch unbenutzer Platz für 6 weiter bools lassen) - und jetzt wolltest du einen der beiden bool Werte zurücksetzen - das erfordert eine Read-Modify-Write operation: Lesen, das eine bit ändern, und die anderen unberührt lassen, und zurückschreiben.
Nimmst du stattdessen ein ganzes byte für ein bool, ist die initiale Lese-Operation unnötig: die kannst einfach eine 0 schreiben, alle bits clear. Andere bools enthält das byte ja nicht, darum brauchen wir auch nicht dafür zu sorgen, dass die bewahrt blieben.
Dies ist effizienter als mehrere bools in ein byte zu packen, auch wenn es ein paar extra bytes kostet.
Achso du meinst effizienter im sinne vom Ablauf her schneller.
Wenn jetzt aber bei einem Arduino zb der dynamische speicher knapp werden würde könnte man einsparungen erreichen indem man boolsche variablen nutzt statt bytes?
Danke für deine Ausführungen!
Bedenke dass, wenn der Prozessor keine Unterstützung für bit masking hat, also Instruktionen, die das schon können, du dafür in deinem Programm Code dafür benötigst. Diese Code erfordert ebenfalls Platz. Zwar kein RAM, sondern Programmspeicher, aber was du an einer Stelle einsparen könntest, zahlst du dann an anderer Stelle wieder drauf.
Bedenke auch, dass wenn wenige bytes mehr oder weniger an Speicherplatz schon kritisch sind, du ein Problem hast, das über die paar bytes hinausgeht: Zum Beispiel ist exakter Bedarf an Stack nicht präderminierbar, wenn hardware interrupts ins Spiel kommen: in dem Moment wird zusätzlicher Raum auf dem Stack benötigt - da möchtest du also Platz genug haben. Plus minus ein paar bools fallen da ins Nichts, im Vergleich. Wenn du also schon so knapp bist, dass dies ein Problem würde, wäre es besser, das Programm entsprechend aufzusetzen, oder gleich einen leistungsfähigeren Prozessor zu nehmen.
Danke vielmals!
Habe selbst auch nochinteressante Diskussionen diesbezüglich gefunden (Nachdem ich nun wusste nach was suchen):
https://forum.arduino.cc/t/using-bools-storage-question/675179/11
https://forum.arduino.cc/t/boolean-memory-size/152452/4
Kommt drauf an, wie "Byte" definiert ist. Üblicherweise sollte das "char" sein - und damit, wie boolean, 8 bits bzw. 1 Byte groß.
Boolean ist nämlich so definiert: 0 = False und != 0 = True.
Boolean sollte doch lediglich ein biit sein und nicht ein ganzes byte, hat ja nur zwei zustände.
Die kleinste Speichereinheit in Registern ist ein Byte, insofern ja, es wäre logischer nur 0 oder 1 zu speichern, aber dann sind 7 Bits unbenutzt.
Kurzerhand heisst das so oder so sind die 7 bit unbenutzt?
Welchen Sinn hat dann die Existenz des datentyps bool für eine Variable?
In der physikalischen Ebene ist das identisch, beides 8 Bit. In der Applikationsebene drückt man durch aus, dass eine Variable True oder False enthält anstatt numerischer Werte.
Dieser Datenttyp ist einer vom Compiler, und nicht (notwendigerweise) von der CPU. Dieser Typ dient der Abstraktion, der Möglichkeit, in zwei Zuständen denken zu können, ohne die restlichen bits eines bytes im Auge behalten zu müssen. Wie bools sich in Programmcode und Speicherbenutzung wiederfinden, wird vom Datentyp nicht festgelegt - der muss nur logisch passen.
Hm okay interessant. Bin sonst eher in der Automation unterwegs und beispielsweise bei Siemens Steuerungen gibt es eingangsbytes und jedes bit von diesem Byte repräsentiert einen Eingang.