const int led = 13;
Das ist die richtige Methode. Oder auch:
const byte led = 13;
Wie viele Pins hast du?
Einige der Tutorials haben nicht so viele Qualitätskontrollen durchlaufen, wie sie haben könnten.
Die Leistung wird bei der Verwendung besser const byte
, verglichen mit int
dem Compiler, der möglicherweise klug genug ist, um zu erkennen, was Sie tun.
Was Sie tun können, ist, Menschen sanft zu ermutigen, effizientere Techniken zu verwenden, indem Sie sie in Ihrem eigenen Code verwenden.
Antworten auf Kommentare
Ein Kommentator hat vorgeschlagen, dass dies byte
nicht Standard C ist. Dies ist korrekt, es handelt sich jedoch um eine Arduino StackExchange-Site, und ich glaube, dass die Verwendung von Standardtypen, die von der Arduino IDE bereitgestellt werden, akzeptabel ist.
In Arduino.h gibt es diese Zeile:
typedef uint8_t byte;
Beachten Sie, dass dies nicht genau dasselbe ist wie unsigned char
. Siehe uint8_t vs unsigned char und Wann ist uint8_t ≠ unsigned char? .
Ein anderer Kommentator hat vorgeschlagen, dass die Verwendung von Byte nicht unbedingt die Leistung verbessert, da Zahlen, die kleiner sind als int
die, auf die int
heraufgestuft wird (siehe Regeln für die Heraufstufung von Ganzzahlen, wenn Sie mehr dazu möchten).
Im Kontext eines konstanten Bezeichners generiert der Compiler jedoch in jedem Fall effizienten Code. Das Zerlegen von "blink" ergibt beispielsweise Folgendes in der ursprünglichen Form:
00000086 <loop>:
86: 8d e0 ldi r24, 0x0D ; 13
88: 61 e0 ldi r22, 0x01 ; 1
8a: 1b d1 rcall .+566 ; 0x2c2 <digitalWrite>
Tatsächlich wird derselbe Code generiert, unabhängig davon, ob 13
:
- Ist ein wörtliches
- Ist ein
#define
- Ist ein
const int
- Ist ein
const byte
Der Compiler weiß, wann eine Zahl in ein Register passt und wann nicht. Es wird jedoch empfohlen , eine Codierung zu verwenden, die auf Ihre Absicht hinweist . Machen Sie const
es deutlich, dass sich die Zahl nicht ändert, und machen Sie es byte
(oderuint8_t
) klar machen, dass Sie eine kleine Zahl erwarten.
Verwirrende Fehlermeldungen
Ein weiterer wichtiger Grund, den Sie vermeiden sollten, #define
sind die Fehlermeldungen, die Sie erhalten, wenn Sie einen Fehler machen. Betrachten Sie diese "Blink" -Skizze, die einen Fehler aufweist:
#define LED = 13;
void setup() {
pinMode(LED, OUTPUT); // <---- line with error
}
void loop() {
digitalWrite(LED, HIGH); // <---- line with error
delay(1000);
digitalWrite(LED, LOW); // <---- line with error
delay(1000);
}
Auf der Oberfläche sieht es OK aus, aber es erzeugt diese Fehlermeldungen:
Blink.ino: In function ‘void setup()’:
Blink:4: error: expected primary-expression before ‘=’ token
Blink:4: error: expected primary-expression before ‘,’ token
Blink:4: error: expected `;' before ‘)’ token
Blink.ino: In function ‘void loop()’:
Blink:8: error: expected primary-expression before ‘=’ token
Blink:8: error: expected primary-expression before ‘,’ token
Blink:8: error: expected `;' before ‘)’ token
Blink:10: error: expected primary-expression before ‘=’ token
Blink:10: error: expected primary-expression before ‘,’ token
Blink:10: error: expected `;' before ‘)’ token
Sie schauen auf die erste hervorgehobene Zeile (Zeile 4) und sehen nicht einmal ein "=" - Symbol. Außerdem sieht die Leitung gut aus. Jetzt ist es ziemlich offensichtlich, wo das Problem liegt ( = 13
wird ersetzt)LED
), aber wenn die Zeile 400 Zeilen weiter unten im Code steht, liegt das Problem nicht an der Art und Weise, wie die LED definiert ist.
Ich habe schon viele Male gesehen, wie Menschen darauf hereinfielen (einschließlich meiner selbst).