Arduino HIGH LOW "Byte" Variable oder "Bool"?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

Woher ich das weiß:Studium / Ausbildung – hard meets soft
Ale28 
Fragesteller
 05.01.2023, 16:07

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.

0
Bushmills145  05.01.2023, 16:09
@Ale28

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,

0
Ale28 
Fragesteller
 05.01.2023, 16:14
@Bushmills145

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?

0
Bushmills145  05.01.2023, 16:19
@Ale28

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.

0
Ale28 
Fragesteller
 05.01.2023, 16:21
@Bushmills145

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!

0
Bushmills145  05.01.2023, 16:26
@Ale28

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.

0
Bushmills145  06.01.2023, 16:18

Danke schön für Sternchen!

0

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.

Ale28 
Fragesteller
 05.01.2023, 16:04

Boolean sollte doch lediglich ein biit sein und nicht ein ganzes byte, hat ja nur zwei zustände.

0
Gehilfling  05.01.2023, 16:14
@Ale28

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.

0
Ale28 
Fragesteller
 05.01.2023, 16:15
@Gehilfling

Kurzerhand heisst das so oder so sind die 7 bit unbenutzt?
Welchen Sinn hat dann die Existenz des datentyps bool für eine Variable?

0
Gehilfling  05.01.2023, 17:03
@Ale28

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.

0
Bushmills145  05.01.2023, 17:08
@Ale28

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.

0