const int led = 13;
Questo è il metodo corretto. O anche:
const byte led = 13;
Quanti pin hai?
Alcuni tutorial non sono stati sottoposti al controllo di qualità che avrebbero potuto avere.
Le prestazioni saranno migliori usando const byte
, rispetto a int
comunque il compilatore potrebbe essere abbastanza intelligente da capire cosa stai facendo.
Quello che puoi fare è incoraggiare delicatamente le persone a utilizzare tecniche più efficienti utilizzandole nel tuo codice.
Risposte ai commenti
Un commentatore ha suggerito che byte
non è lo standard C. Questo è corretto, tuttavia si tratta di un sito StackExchange di Arduino e credo che l'utilizzo di tipi standard forniti dall'IDE di Arduino sia accettabile.
In Arduino.h c'è questa linea:
typedef uint8_t byte;
Si noti che questo non è esattamente lo stesso di unsigned char
. Vedi uint8_t vs char senza segno e Quando uint8_t ≠ char senza segno? .
Un altro commentatore ha suggerito che l'uso del byte non migliorerà necessariamente le prestazioni, perché i numeri più piccoli di quelli int
che verranno promossi int
(vedi Regole di promozione di numeri interi se vuoi di più su questo).
Tuttavia, nel contesto di un identificatore const , il compilatore genererà comunque un codice efficiente. Ad esempio, lo smontaggio di "battito di ciglia" dà questo nella forma originale:
00000086 <loop>:
86: 8d e0 ldi r24, 0x0D ; 13
88: 61 e0 ldi r22, 0x01 ; 1
8a: 1b d1 rcall .+566 ; 0x2c2 <digitalWrite>
In effetti genera lo stesso codice sia che 13
:
- È letterale
- È un
#define
- È un
const int
- È un
const byte
Il compilatore sa quando può contenere un numero in un registro e quando non può. Tuttavia è buona norma utilizzare la codifica che indica il tuo intento . Renderlo const
chiarisce che il numero non cambierà e renderlo byte
(o uint8_t
) chiarire che ci si aspetta un piccolo numero.
Messaggi di errore confusi
Un altro motivo importante per evitare #define
è i messaggi di errore che ricevi se commetti un errore. Considera questo schizzo "lampeggiante" che presenta un errore:
#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);
}
In apparenza sembra OK, ma genera questi messaggi di errore:
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
Guarda la prima linea evidenziata (linea 4) e non vedi nemmeno il simbolo "=". Inoltre, la linea sembra a posto. Ora è abbastanza ovvio quale sia il problema ( = 13
viene sostituito LED
), ma quando la linea è 400 righe più in basso nel codice, non è ovvio che il problema riguarda il modo in cui il LED è definito.
Ho visto persone innamorarsi di questo molte volte (incluso me stesso).