Grrr! schrieb:
> Wie sieht es jetzt mit bool bei arm-none-eabi- aus? Da habe ich jetzt
> praktisch sämtliche mögliche Varianten gelesen und weiß es nicht. Klar
> kann man, um sicher zu sein, mit uint32_t statt bool arbeiten. Aber das
> ist doch vom Codeverständnis her sch...
Ist es.
bool ist ein Aufzählungstyp, der erst einmal nur ein Byte braucht. Wenn
du das tatsächlich irgendwo speicherst, verplemperst du daher keine
unnützen Platz.
Solange der Compiler allerdings den Einsatzbereich der entsprechenden
Variablen überschauen kann und er im Register gehalten wird, wird der
Compiler natürlich ein ganzes 32-bit-Register benutzen und muss auch
keine Bytezugriffe benutzen.
Außerdem kann dieser Typ nur die Werte 0 und 1 annehmen. Wenn du
irgendeinen anderen Wert zuweist, wird er (durch implizite
Typumwandlung) bereits bei der Umwandlung in 0 oder 1 gewandelt. Wenn du
jetzt sowas (wenig sinnvoll, nur als Beispiel) schreibst:
1 | bool foo;
|
2 |
|
3 | int something(void) {
|
4 | return foo * 42;
|
5 | }
|
dann wird zwar für den externen Zugriff auf "foo" ein ldrb codiert (lade
Byte mit sign extension), aber danach direkt mit 42 multipliziert ohne
noch irgendwie explizit auf 0 oder 1 zu testen.
1 | #define TRUE 0x00000001U
|
2 | und
|
3 | #define FALSE 0x00000000U
|
Was sollen die 0x und die vielen Nullen überhaupt bewirken?
0x000000000000000 ist die gleiche Zahl wie 0x0 oder einfach nur 0. Wir
sind ja nicht bei VHDL. :-)