@annonomus penguin, certo che possiamo Sebbene il codice si compili in 1180 byte flash + 13 byte RAM per uno sul mio computer, possiamo migliorarlo :) quindi la sfida del golf è accettata e anche alcuni consigli utili dato che siamo nel business di apprendimento.
Passaggio 1: ridurre i requisiti variabili. L'uso di un int per una porta led sembra un po 'eccessivo, certamente non abbiamo 65535 porte IO indirizzabili sull'arduino :) Quindi lo cambiamo in un byte solo per divertirci. Lo cambieremo in un #define in seguito, ma per mostrare l'impatto dell'uso di tipi di variabili troppo grandi.
byte led = 13;
int val;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
blink();
val = digitalRead(10);
}
void blink() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Compila in 1172 byte + 13 byte RAM. Ciò consente di risparmiare 8 byte di flash a causa di un minor numero di operazioni necessarie per il byte anziché un numero intero. Mi aspetterei 12 byte di RAM, ma va bene. Non molto, ma ogni byte salvato è buono.
Passaggio 2: passare alla variabile in definisce quando ha senso. Ad esempio, il byte led non è necessario, il pin non si dissalderà da solo.
#define LED 13
int val;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
blink();
val = digitalRead(10);
}
void blink() {
digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Compila in 1142 byte flash + 11 byte RAM. Già 38 byte salvati. Ciò è dovuto al minor numero di operazioni di registro necessarie per recuperare il valore int. Inoltre abbiamo salvato 2 byte dalla RAM. (mi chiedo ancora perché il byte non sia stato compilato in 1 byte in meno di ram .....)
Passaggio 3: ottimizza il codice. Vedo 2 ritardi. Mi chiedo se lo cambio a 1 ritardo risparmierebbe spazio, ma devo capire il valore del pin LED e attivarlo (invertirlo). Possiamo farlo con digitalRead (), ma risparmierà spazio?
#define LED 13
int val;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
blink();
val = digitalRead(10);
}
void blink() {
digitalWrite(LED, !digitalRead(LED)); // toggle the led based on read value
delay(1000); // wait for a second and spare yourself the other delay
}
Compila in 1134 byte + 11 byte ram. Sìì! altri 8 byte. Ciò significa un totale di 46 byte e 2 righe di codice in meno.
Anche un altro consiglio generale sulla riduzione della dimensione del codice. Non usare la classe String. È ENORME, impara a gestire gli array di caratteri, strcpy (), strcmp (). Se tutto ciò che hai sono alcune operazioni di base sulle stringhe, l'uso della classe String consiste principalmente nello sprecare spazio sia su flash che su RAM.